使用 Spring 实现 Request/Reply 模式,使用现有队列实现 RabbitMQ

Implementing Request/Reply Pattern with Spring and RabbitMQ with already existing queues

让我从描述系统开始。有 2 个应用程序,我们称它们为 ClientServer。还有2个队列,请求队列和回复队列。 Client 发布到请求队列,服务器侦听该请求以进行处理。在 Server 处理消息后,它会将消息发布到 Client 订阅的回复队列。 Server 应用程序始终将回复发布到预定义的回复队列,而不是 Client 应用程序确定的队列。

我无法更新 Server 应用程序。我只能更新 Client 应用程序。队列由 Server 应用程序创建和管理。

我正在尝试从 Client 实施 request/reply 模式,以便同步返回来自 Server 的回复。我知道使用 spring 的 "sendAndReceive" 方法,以及它如何与用于回复目的的临时队列以及固定回复队列一起工作。

Spring AMQP - 3.1.9 Request/Reply Messaging

以下是我的问题:

  1. 我能否将此方法用于现有队列,这些队列由 Server 应用程序管理和创建?如果是,请详细说明。
  2. 如果我的 Client 应用程序是一个缩放应用程序(它的多个实例同时 运行),那么我如何在这样的情况下也实现它方式,错误的实例(请求不是发起的实例)没有从队列中读取回复?
  3. 除了路由密钥之外,我还能在这里使用 "Default" 交换对我有利吗?

感谢您的宝贵时间和回复。

  1. 是;只需使用 Reply Listener Container 连接到 RabbitTemplate.

重要:服务器必须回显客户端设置的correlationId消息属性,这样回复才能与客户端的请求相关联。

  1. 你不能。与 JMS 不同,RabbitMQ 没有消息选择的概念;每个消费者(在本例中为回复容器)都需要自己的队列。否则,实例将获得随机回复,并且回复有可能(极有可能)发往错误的实例。

...it publishes it to the reply queue...

使用 RabbitMQ,发布者不发布到队列,他们发布到带有路由键的交换。将发布者与队列紧密耦合是不好的做法。如果您无法更改 server 以将回复发布到交换,使用包含请求消息中的内容的路由键(或使用 replyTo 属性), 你真倒霉。

  1. 使用默认交换会助长我在 2 中提到的不良做法(将生产者与队列紧密耦合)。所以,不,它没有帮助。

编辑

如果回复中有内容可让您将其与请求相关联;一种可能性是在服务器的回复队列中添加委托消费者。接收回复,执行关联,将回复路由到正确的 replyTo.