概述
在 RabbitMQ 中,RPC 模式通过消息队列实现远程调用功能。客户端(生产者)发送消息到消费队列,服务端(消费者)进行消息消费并执行相应的程序,然后将结果发送到回调队列供客户端使用。这是一种双向的生产消费模式,其中客户端既是生产者又是消费者,服务端则专注于处理消息并生成响应。

在 RPC 通信的过程中,没有明确的生产者和消费者之分,比较像传统的 RPC 远程调用,大概就是通过两个队列实现了一个可回调的过程。
工作流程

-
客户端发送请求:
- 客户端连接到 RabbitMQ 服务器。
- 客户端声明一个用于发送 RPC 请求的队列(通常是固定的,如 rpc_queue)。
- 客户端创建一个临时的回调队列,并在发送请求时,将回调队列的名称作为消息属性(reply_to)发送给交换机。
- 客户端为每个请求生成一个唯一的 correlation_id,并将其作为消息属性发送,以便在接收响应时能够匹配请求与响应。
-
交换机路由请求:
- 交换机接收到 RPC 请求后,根据路由键将请求路由到服务端监听的队列。
-
服务端处理请求:
- 服务端(消费者)从队列中接收请求。
- 服务端处理请求,并生成响应。
- 服务端将响应发送到客户端指定的回调队列,并在消息属性中设置相同的 correlation_id。
-
客户端接收响应:
- 客户端监听其回调队列以接收响应。
- 当接收到响应时,客户端检查 correlation_id 以确定响应是否与之前的请求匹配。
- 如果匹配,客户端处理响应;如果不匹配,客户端可能丢弃该响应。
特点
- 解耦:客户端和服务端之间不需要直接通信,降低了系统间的耦合度。
- 灵活性:支持多种语言和平台之间的远程调用。
- 可扩展性:通过增加服务端(消费者)的数量,可以轻松扩展 RPC 服务。
- 性能开销:由于涉及到网络传输和消息队列的处理,RPC 调用的性能通常低于本地调用。
- 复杂性:需要处理消息队列的可靠性、持久性、消息确认等复杂问题。
- 安全性:远程调用可能面临更多的安全风险,如消息篡改、中间人攻击等。
应用场景
RabbitMQ 的 RPC 通信模式适用于需要远程调用服务的场景,如分布式系统中的服务调用、微服务架构中的服务通信等。通过 RabbitMQ 的消息队列机制,可以实现跨系统、跨语言的远程调用,提高系统的灵活性和可扩展性。
代码案例
引入依赖
<!-- https://mvnrepository.com/artifact/com.rabbitmq/amqp-client -->
com.rabbitmq
amqp-client
5.21.0


