如何在使用消息传递(例如 RabbitMQ)与使用 Web 服务进行后端组件交互/通信之间做出决定?

Posted

技术标签:

【中文标题】如何在使用消息传递(例如 RabbitMQ)与使用 Web 服务进行后端组件交互/通信之间做出决定?【英文标题】:How to decide between using messaging (e.g. RabbitMQ) versus a web service for backend component interactions/communication? 【发布时间】:2015-07-01 18:35:02 【问题描述】:

在开发后端组件时,我需要决定这些组件将如何交互和相互通信。特别是,我需要决定使用(RESTful,微)Web 服务与消息代理(例如 RabbitMQ)是否更好。是否有特定的标准可以帮助决定为每个组件使用 Web 服务还是使用消息传递?

【问题讨论】:

【参考方案1】:

Eranda 在他的回答中涵盖了其中的一些内容,但我认为三个关键驱动因素是:

    您是否在为请求-响应类型的交互建模? 您的交互可以异步吗? 信息的发送者需要对接收者有多少了解?

可以使用异步消息传递基础设施进行请求-响应类型的交互,但它显着增加了复杂性,因此通常请求-响应类型的交互(即发送者是否需要从接收者返回的一些数据)更容易建模作为 RPC/REST 交互。

如果您的交互可以是异步的,则可以使用 REST 交互来实现这一点,但如果您使用 fire and forget 消息类型交互,它可能会更好地扩展。

如果信息的提供者不关心谁在使用信息,那么异步消息交互也会更合适。信息提供者可以发布信息,该信息的新消费者可以稍后添加到系统中,而无需更改提供者。

【讨论】:

关于性能,检查这些基准 Web server 与 RabbitMQ 对性能评论进行更正 - 很大程度上取决于很多事情 - 已删除【参考方案2】:

Web 服务器和消息代理有自己的用例。用于托管 Web 服务的 Web 服务器和消息代理用于在两点之间交换消息。如果您需要部署 Web 服务,则必须使用 Web 服务器,您可以在其中处理该消息并发回响应。现在让我们认为您需要在任何两个节点之间、两个服务器之间、客户端与服务器之间或服务器与客户端之间具有发布者/订阅者模式或/和可靠消息传递,这就是消息代理出现的地方,您可以使用消息代理在两个节点中间来实现它。使用消息代理可以为您提供可靠性,但您必须为性能付出代价。因此,您应该使用的组件取决于您的用例,尽管有多个选项可用。

【讨论】:

这个答案不清楚,也不能很好地传达两种方法的优缺点。 @MaxBarraclough 我发现答案信息丰富。开始的语句已经定义了一个答案。

以上是关于如何在使用消息传递(例如 RabbitMQ)与使用 Web 服务进行后端组件交互/通信之间做出决定?的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ如何在各个环节保证消息不丢失

redis与rabbitmq做消息队列的区别

RabbitMQ保证传递到镜像队列

消息中间件Rabbitmq的使用

RabbitMQ从概念到使用从Docker安装到RabbitMQ整合Springboot1.5w字最全教学

分布式系统消息中间件——RabbitMQ的使用基础篇