微服务为什么要使用RabbitMQ?

56

我没有找到现有的帖子询问这个问题,但如果我错过了,请谅解。

我试图理解微服务,并在一些文章中发现了使用RabbitMQ的情况。我感到困惑的是为什么需要RabbitMQ。是打算让服务使用Web API与外部世界通信并使用RabbitMQ彼此通信吗?


您可以查看下面的链接。它有一个广泛的描述:https://stackoverflow.com/a/51377756/3073945 - Md. Sajedul Karim
4个回答

77
在微服务架构中,您有两种方式在微服务之间进行通信:
  • 同步 - 即每个服务直接调用其他微服务,这导致服务之间存在依赖关系
  • 异步 - 您可以使用某个中央枢纽(或消息队列)来放置微服务之间的所有请求,相应服务会接受请求并处理它,并将结果返回给调用者。这就是RabbitMQ(或任何其他消息队列 - MSMQ和Apache Kafka是不错的替代品)的用途。在这种情况下,所有微服务只知道枢纽的存在。

microservices.io有一些非常好的关于使用微服务的文章


1
如果您正在使用 .net 平台,请查看 NServiceBus(http://particular.net)以进行异步消息传递(并可以运行 RabbitMQ 作为传输)。 - Sean Farmar
你说同步模式会导致依赖性。如果你有一个位于微服务之外的中央枢纽,这不也意味着依赖性吗? - mko
@mko,没错。这甚至被称为“单点故障”。没有银弹,必须权衡两种方法的利弊。 - Dimitar Tsonev
@mko,在这种情况下,您打算如何实现服务A和服务B之间的通信? A必须知道B(或其队列)的存在,这实际上是同步通信。 - Dimitar Tsonev
我不同意你的观点。你没有考虑到由于缺乏中心枢纽而失去事件的情况。这就是异步编程的全部内容。 - mko
显示剩余2条评论

47
消息队列提供了一种异步通信协议 - 您可以选择向另一个服务发送消息,而无需知道另一个服务是否立即能够处理它。消息可以等到负责的服务准备好后再处理。发布消息的服务不需要了解将处理该消息的服务的内部工作原理。这种处理消息的方式使生产者与消费者解耦。
消息队列将应用程序中的进程分离和相互独立; 这种处理消息的方式可以创建一个易于维护和扩展的系统。
简而言之,有两种明显的情况可以用作消息队列真正发挥作用的例子:
1. 长时间运行的过程和后台作业 2. 微服务之间的中间人
对于长时间运行的过程和后台作业:
当请求花费大量时间时,将消息队列纳入其中是完美的场景。
想象一下,一个 Web 服务每秒处理多个请求,并且不能在任何情况下失去一个请求。此外,请求通过耗时的过程处理,但系统不能承受被拖垮的风险。一些现实生活示例可能包括:
图像缩放 发送大量/大型电子邮件(例如时事通讯) 搜索引擎索引 文件扫描 视频编码 传递通知 PDF 处理 计算
作为微服务之间的中间人:

为了应用程序之间的通信和集成,即作为微服务之间的中间人,消息队列也是很有用的。想象一个需要通知系统的另一部分开始处理任务或在同时出现大量请求的系统中,如以下场景:

  • 订单处理(下订单、更新订单状态、发送订单、付款等)
  • 食品配送服务(下订单、准备订单、交付食品)
  • 任何需要处理多个请求的Web服务

这里有一个故事,讲述了Parkster(数字停车服务)如何使用RabbitMQ将其系统拆分成多个微服务。

本指南遵循一个场景,其中Web应用程序允许用户上传信息到网站。该站点将处理此信息并生成PDF并将其电子邮件发送回用户。在此示例中,处理信息、生成PDF和发送电子邮件需要几秒钟时间,这就是使用消息队列的原因之一。

这里有一个关于CloudAMQP如何以及为什么在微服务之间使用消息队列和RabbitMQ的故事。

这里是关于在基于事件的微服务架构中使用RabbitMQ支持每月1亿用户的故事。

最后,链接到Kontena,了解为什么他们选择RabbitMQ作为他们的微服务架构:“因为我们需要一个稳定、可管理和高可用的消息传递解决方案。”

请注意,我为CloudAMQP(RabbitMQ托管提供商)背后的公司工作。


1
请记住,您必须在发布答案的内容中披露与其关联的身份。由于您为公司编写了这些帖子(根据您的账户名和作者的名称作出的猜测),您还必须声明状态,如Stack Exchange网站行为描述中所述: “发布有价值、相关的答案,如果其中一些(但不是全部)涉及贵公司的产品或网站,那么这样做是可以的。但是,你一定要在你的答案中披露你的关联。” - KollKode
3
感谢您的评论。您是正确的,我应该添加更多来自其他来源的信息,并且我已经添加了我工作地点的信息。我会重新审视这个答案并查看您发布的链接。谢谢! - Lovvan

0
同样的问题是为什么微服务需要REST?微服务概念并不是什么新鲜事物。长时间以来,工作流程的分布式处理一直被用于后端工程和异步请求处理中,微服务是一个在单独的JVM中的组件,与SOLID中的单一职责相匹配。使其成为微服务的原因是它是平衡的。这就是全部!特别地,它可以是基于Spring Cloud/REST的REST服务,由Eureka注册,具有Zuul和Ribbon上的代理网关和负载均衡。但这并不是微服务的全部世界!顺便说一下,异步分布式处理是微服务用于的任务之一。很久以前,分离的JVM中的服务(组件)通过任何消息集成,该模式称为ESB。微服务也是该模式的主题。由于Spring Cloud REST的流行,似乎它是微服务的唯一方式。不是这样的!例如,Vertx支持基于消息的异步微服务架构https://dzone.com/articles/asynchronous-microservices-with-vertx。为什么不使用RabbitMQ作为消息通道呢?在这种情况下,负载均衡可以通过构建RabbitMQ集群来实现。例如:https://codeburst.io/using-rabbitmq-for-microservices-communication-on-docker-a43840401819。因此,世界更加广阔。

0
Rabbit MQ 提供了异步通信。当我们需要同时发布大量事件时,同时存储在数据库中非常困难。当事件被发布时,它将发送到 MQ。从 MQ 中,它将被多个消费者消费,你还可以根据配置将数据存储在 MQ 中的几天时间内。Rabbit MQ 在微服务层面上是最适合基于事件的方法的选择。 例如:订单创建和取消。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接