一个服务作为Rabbitmq的生产者和消费者是错误的吗?
Is it wrong for a service to be producer and consumer of Rabbit MQ?
我想创建一个“通知微服务”来处理不同类型的通知(Google 聊天、电子邮件等)。
对于此任务,我们将创建一个微服务,其中包含有关如何处理这些消息的逻辑,并且我们将使用 Rabbit MQ 来管理队列。
现在,我的问题是,是否可以(或者这是一种不好的做法)像这样在微服务中公开两个端点:
registerNotification('channel', $data)
processNotification(Rabbit Message)
所以我只需要在一个服务中实现与 RabbitMQ 的通信,其他服务将只使用相同的服务注册消息,而不是直接与 RabbitMQ 通信。
这样对于每个通道,我都可以在服务中验证我在排队消息之前拥有我需要的一切。
这是个好方法吗?
我建议将您的问题分成两个单独的问题。像往常一样,这取决于……两者各有利弊。低于我的观点而不要求完整性。最终评估这些确实取决于您的具体需求。
1) 在消息队列(此处为 RabbitMQ)之前使用通知/事件网关是一种好习惯吗?
优点:
- 对消息结构/正确性实施强有力的保证
- 如果需要,提供高级身份验证/授权机制
- 如果您的技术栈中的语言缺乏 first-class 客户端支持,请提供便利
- 从服务(发布者)中抽象/封装技术选择和部署注意事项
- 消除来自各个服务的消息的路由逻辑(尽管,使用 RabbitMQ 中可用的路由拓扑,这里很难看到任何附加值)
缺点:
- 可用性成为您网关的一个关键问题,例如假设您可以保证每个服务的正常运行时间为四个九,那么通过添加此依赖项,您已经将组合系统的正常运行时间降低到三个九
- 增加了操作复杂性
- 增加延迟
这里的另一种考虑可能是使用库来实现上述一些优点。不过,这种方法也有其缺点。
2) 运行 消息发布者和消费者在一项服务中是一种好的做法吗?
优点:
- 快速(快捷方式?)
- 最初部署的实例较少(直到您必须扩大规模)
缺点:
- 生产者和消费者(工人!)的操作要求通常非常不同
- 更难(也更昂贵)以充分和细粒度地扩展系统
- (性能)指标变得难以解释
- 消费者可能会对生产者延迟产生负面影响,因为一切都在争夺相同的资源
- 消费者方面失去灵活性(快速、低风险部署)
- 更难保证生产者的可用性
我希望这有助于根据您自己的需求/优先级更好地评估您的架构。
我想创建一个“通知微服务”来处理不同类型的通知(Google 聊天、电子邮件等)。
对于此任务,我们将创建一个微服务,其中包含有关如何处理这些消息的逻辑,并且我们将使用 Rabbit MQ 来管理队列。
现在,我的问题是,是否可以(或者这是一种不好的做法)像这样在微服务中公开两个端点:
registerNotification('channel', $data)
processNotification(Rabbit Message)
所以我只需要在一个服务中实现与 RabbitMQ 的通信,其他服务将只使用相同的服务注册消息,而不是直接与 RabbitMQ 通信。 这样对于每个通道,我都可以在服务中验证我在排队消息之前拥有我需要的一切。
这是个好方法吗?
我建议将您的问题分成两个单独的问题。像往常一样,这取决于……两者各有利弊。低于我的观点而不要求完整性。最终评估这些确实取决于您的具体需求。
1) 在消息队列(此处为 RabbitMQ)之前使用通知/事件网关是一种好习惯吗?
优点:
- 对消息结构/正确性实施强有力的保证
- 如果需要,提供高级身份验证/授权机制
- 如果您的技术栈中的语言缺乏 first-class 客户端支持,请提供便利
- 从服务(发布者)中抽象/封装技术选择和部署注意事项
- 消除来自各个服务的消息的路由逻辑(尽管,使用 RabbitMQ 中可用的路由拓扑,这里很难看到任何附加值)
缺点:
- 可用性成为您网关的一个关键问题,例如假设您可以保证每个服务的正常运行时间为四个九,那么通过添加此依赖项,您已经将组合系统的正常运行时间降低到三个九
- 增加了操作复杂性
- 增加延迟
这里的另一种考虑可能是使用库来实现上述一些优点。不过,这种方法也有其缺点。
2) 运行 消息发布者和消费者在一项服务中是一种好的做法吗?
优点:
- 快速(快捷方式?)
- 最初部署的实例较少(直到您必须扩大规模)
缺点:
- 生产者和消费者(工人!)的操作要求通常非常不同
- 更难(也更昂贵)以充分和细粒度地扩展系统
- (性能)指标变得难以解释
- 消费者可能会对生产者延迟产生负面影响,因为一切都在争夺相同的资源
- 消费者方面失去灵活性(快速、低风险部署)
- 更难保证生产者的可用性
我希望这有助于根据您自己的需求/优先级更好地评估您的架构。