【问题标题】:When to NOT use a message broker such as RabbitMQ in a micro-services architecture?何时不在微服务架构中使用 RabbitMQ 等消息代理?
【发布时间】:2021-07-05 07:46:21
【问题描述】:

我不熟悉 RabbitMQ 等消息传递代理的概念,想学习一些最佳实践。

RabbitMQ 似乎是促进微服务之间异步通信的好方法,但是,我有一个初学者问题,我无法在其他任何地方找到答案。

什么时候会在微服务架构中使用 RabbitMQ 等消息代理?

举个例子:

假设我有两个服务。服务 A 和服务 B (授权服务)

客户端向服务 A 发出请求,该服务又必须与服务 B (auth service) 通信以验证用户身份并授权请求。 (使用基本身份验证)

           Internet                
Client ----------------> Service A +-------> Service B [Authenticate/Authorization]
         HTTP request            HTTP or AMQP??

在我有限的理解中,我可以预见在上述场景中使用 AMQP 的问题是服务 A 能够处理请求并向客户端发送响应可接受的时间范围,因为它必须等待服务 B 消费并响应消息。

本质上,让服务 A 通过 AMQP 等待服务 B 的响应是不是一个坏主意?

还是我完全错过了 AMQP 的要点??

【问题讨论】:

  • 我个人喜欢远离消息代理,因为它增加了复杂性(移动部件越少,恕我直言)。我只是简单地以同步方式使用 grpc 进行服务间通信。当需要异步时,recipent 服务将简单地创建一个数据库记录(将任务添加到内部队列)并立即返回响应。例如排队要发送的电子邮件。我与消息代理合作的唯一时间是每个微服务都由其自己的开发团队维护。

标签: rabbitmq microservices


【解决方案1】:

实际上,您所描述的内容大多接近 HTTP。

HTTP 是同步的,这意味着您必须等待响应。正如您提到的,此问题的解决方案是 AMQP。使用 AMQP,您不一定需要等待(您可以配置它)。

这不一定是一个坏主意,但大多数微服务所依赖的是一种称为最终一致性的东西。因为这将是一个很长的答案,有很多如果我建议看看Microservices Architecture

例如here 是关于 http 与 amqp 的部分,因为它主要是关于同步与异步通信的问题 它详细介绍了微服务设计的不同方法,列出了针对您的特定问题和其他问题的优缺点。

例如,在您的情况下,身份验证将发生在 API 网关,作为让微服务对所有客户端应用程序保持开放的最佳实践。

【讨论】:

  • 请解释一下? “例如,在您的情况下,身份验证将发生在 API 网关,因为它不被认为是让微服务对所有客户端应用程序开放的最佳做法。”
  • 再次不是一个全局选项。但这是解释here。通常,API 网关的整个想法是充当中间人,因此不会暴露外部服务。这有缺点和优点,但如果你采用这种模式,你的 API 网关会处理身份验证问题(如果需要,可以借助一些服务)。
  • 好的,让我们远离身份验证的东西(尽管感谢您对此的澄清)。假设服务 B 在响应客户端之前处理服务 A 需要的其他东西,你会使用 AMQP 还是 HTTP? AMQP 最适合用于基本上没有时间限制的工作吗?
  • 如果服务 A 需要等待服务 B 的结果才能继续,那么消息队列正是您不想要的——同步调用更合适(例如 http)跨度>
猜你喜欢
  • 2022-06-17
  • 2020-02-04
  • 2017-05-28
  • 2018-12-28
  • 2013-04-23
  • 2018-10-21
  • 2022-01-19
  • 2015-07-15
  • 2021-11-23
相关资源
最近更新 更多