【问题标题】:Is it wrong for a service to be producer and consumer of Rabbit MQ?服务作为 Rabbitmq 的生产者和消费者是错误的吗?
【发布时间】:2022-03-15 19:40:44
【问题描述】:

我想创建一个“通知微服务”来处理不同类型的通知(Google 聊天、电子邮件等)。

对于这个任务,我们将创建一个微服务,其中包含有关如何处理这些消息的逻辑,并且我们将使用 Rabbit MQ 来管理队列。

现在,我的问题是,是否有可能(或者这是一种不好的做法)像这样在微服务中公开两个端点:

registerNotification('channel', $data)

processNotification(Rabbit Message)

所以我只需要在一个服务中实现与 RabbitMQ 的通信,其他服务将只使用同一服务注册消息,而不是直接与 RabbitMQ 对话。 这样,对于每个通道,我都可以在服务中验证我是否拥有在将消息排入队列之前所需的一切。

这是一个好方法吗?

【问题讨论】:

  • 与让其他服务直接将消息发布到 RabbitMQ 相比,这会给您带来什么好处?发布者无需学习 RabbitMQ SDK,而是需要学习您的 API 合约。似乎是相同的可用性,但它会产生另一个故障点 - 如果通知处理 API 关闭,则任何消息都无法放入队列,并且可能永远丢失,而不仅仅是延迟。
  • @DavidT。我没有看到真正的好处,只是我可以在排队之前验证服务中的消息(我不知道 Rabbit 是否可以这样做),而且我不必在每个服务中安装 comm 协议库微服务。
  • 所以你在某种程度上解决了通知服务和事件发布者之间缺乏信任的问题——你不想冒险让他们推送错误消息而不同步接收错误(或在全部)。为此创建一个 API 代理肯定会做到这一点,并且可以说是 Twilio/Sendgrid 在接收到发送消息的请求时所做的事情(容错)。另一方面,作为商业产品意味着他们必须以您不必担心的方式担心不受信任的集成商。 tl; dr:您的解决方案有效,但如果有必要,我会被撕裂。我认为你不会出错。

标签: rabbitmq microservices message-queue task-queue


【解决方案1】:

我建议将您的问题分成两个单独的问题。像往常一样,这取决于......任何一个都有优点和缺点。低于我的观点而不要求完整性。最终评估这些真的取决于您的具体需求。

1) 在消息队列(此处为 RabbitMQ)前使用通知/事件网关是一种好习惯吗?

优点:

  • 对消息结构/正确性实施强有力的保证
  • 根据需要提供高级身份验证/授权机制
  • 在您的堆栈中的语言缺乏一流的客户端支持时提供便利
  • 从服务(发布者)中抽象出/封装技术选择和部署注意事项
  • 消除来自单个服务的消息的路由逻辑(尽管使用 RabbitMQ 中可用的路由拓扑,在这里很难看到任何附加值)

缺点:

  • 可用性成为网关的关键问题,例如假设您可以保证每个服务的正常运行时间为 4 个 9,那么通过添加此依赖项,您的组合系统已经减少到 3 个 9
  • 增加了操作复杂性
  • 增加了延迟

这里的另一种考虑可能是使用库来实现上述一些优点。不过,这种方法也有其自身的缺点。

2) 在一个服务中同时运行消息发布者和消费者是否是一种好习惯?

优点:

  • 快速(快捷方式?)
  • 最初部署较少的实例(直到您必须扩大规模)

缺点:

  • 生产者和消费者(工人!)的操作要求通常非常不同
  • 更难(也更昂贵)充分和细粒度地扩展系统
  • (性能)指标变得难以解释
  • 消费者可能会对生产者延迟产生负面影响,因为一切都在争夺相同的资源
  • 消费者方面失去灵活性(快速、低风险的部署)
  • 更难保证生产者的可用性

我希望这有助于根据您自己的需求/优先级更好地评估您的架构。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-25
    • 2021-06-03
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多