通知微服务API或队列

Swo*_*ish 5 microservices

我是微服务架构的新手,想要创建一个集中式通知微服务来向用户发送电子邮件/短信。

我的第一个选择是创建一个通知 Kafka 队列,所有其他微服务都可以向其中发送通知。然后,通知微服务将侦听该队列并相应地发送消息。如果通知服务重新启动或关闭,我们不会丢失任何消息,因为消息将存储在队列中。

我的第二个选择是在通知微服务上添加通知消息 API。这将使所有其他微服务变得更容易,因为它们只需调用 API,而不需要与队列集成。然后,API 会在内部将消息发送到通知 Kafka 队列并发送消息。这里唯一的问题是,如果 API 不可用或出现错误,我们将丢失消息。

关于处理这个问题的最佳方法有什么建议吗?

小智 5

要么有效。一些可能帮助您做出决定的概念:

面向“Kafka”的服务将有助于:

  1. 隐藏实现。这使您可以灵活地稍后将 Kafka 更改为其他内容。一旦将通知请求放入队列,您的包装器 API 只会响应 200。我还看到让服务直接访问“您的”队列,类似于允许服务直接与它们不拥有的数据库进行交互。如果您允许直接访问 Kafka,而 Kafka 被证明是不够的,那么对 Kafka 的更改将要求您的所有客户端更改其代码。
  2. 执行通知请求合同(确保请求正文格式正确)。如果您想确保放入队列的所有项目都按照合同格式良好,API 可以帮助强制执行这一点。这将有助于防止稍后“通知程序”服务从队列中挑选通知进行发送时出现问题。

如果出现以下情况,添加包装器 API 就不太理想了:

  1. 你不想/不能花时间。也许最后期限让你着急,而准备包装纸所需的时间实在太多了。
  2. 您是一个小团队,没有资源/工具/时间来实现服务爆炸式增长。

您的第一个设计很简单并且可行。如果您正在寻找我概述的优点,那么请考虑您的第二种设计。而且,为了确保我理解它,我会看到它像这样展开:

  1. 客户端 1 需要发出通知并调用服务 A POST /notifications
  2. 接受 POST /通知的服务 A
  3. 服务A检查请求,将其放在Kafka上,用200响应客户端
  4. 服务 B 从 Kafka 队列中获取通知请求。

为了可靠性,服务 A 应作为多个实例运行。