【问题标题】:Notification microservice API or queue通知微服务 API 或队列
【发布时间】:2019-07-22 18:49:42
【问题描述】:

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

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

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

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

【问题讨论】:

  • 选项一是正确的方法。正如您已经提到的,即使通知不可用,您也可以稍后发送消息。微服务的重点是异步通信,这就是你要做的事情。

标签: microservices


【解决方案1】:

两者都有效。一些可能有助于您做出决定的概念:

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

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

如果出现以下情况,则不太需要添加包装 API:

  1. 您不想/不能花时间。也许截止日期让您匆忙,而制作包装纸所需的时间实在是太多了。
  2. 您是一个小团队,没有资源/工具/时间进行服务扩展。

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

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

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

【讨论】:

  • 很好的答案,谢谢。关于您的最后一点 4,我假设服务 A 将接收通知请求并进行处理。我想我可以创建一个高度可用的中间消息服务,所有微服务都可以使用它来写入 Kafka 队列。
  • 这也是有效的。只是您想要/可以管理多少服务的问题。我将服务 A 的接受通知和服务 B 传递通知的“流程”分开。这两种方法都有优点和缺点。给你最好的!
猜你喜欢
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
  • 2022-10-24
  • 1970-01-01
  • 2022-11-23
  • 2017-03-20
  • 2021-02-16
相关资源
最近更新 更多