【发布时间】: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