【问题标题】:Implementing Request/Reply Pattern with Spring and RabbitMQ with already existing queues使用 Spring 和 RabbitMQ 使用现有队列实现请求/回复模式
【发布时间】:2020-06-03 22:25:56
【问题描述】:

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

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

我正在尝试实现来自 Client 的请求/回复模式,以便同步返回来自 Server 的回复。我知道 spring 的“sendAndReceive”方法,以及它如何与临时队列一起使用以进行回复,以及如何与固定回复队列一起使用。

Spring AMQP - 3.1.9 Request/Reply Messaging

以下是我的问题:

  1. 我能否将这种方法用于现有队列,这些队列由 Server 应用程序管理和创建?如果是,请详细说明。
  2. 如果我的 Client 应用程序是一个扩展的应用程序(它的多个实例同时运行),那么我该如何以这种方式实现它,即错误的实例(一个在哪个请求不是发起的)没有从队列中读取回复?
  3. 除了路由键之外,我还能在这里使用“默认”交换来发挥我的优势吗?

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

【问题讨论】:

    标签: spring-boot rabbitmq spring-rabbit rabbitmq-exchange


    【解决方案1】:
    1. 是的;只需使用连接到RabbitTemplateReply Listener Container

    重要提示:服务器必须回显客户端设置的correlationId消息属性,以便回复可以与客户端中的请求相关联。

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

    ...将其发布到回复队列...

    使用 RabbitMQ,发布者不会发布到队列,而是使用路由密钥发布到交换。将发布者与队列紧密耦合是一种不好的做法。如果您无法更改 服务器 以使用包含请求消息中某些内容的路由密钥(或使用 replyTo 属性)将回复发布到交换,那么您就不走运了。

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

    编辑

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

    【讨论】:

    • 感谢您的建议和反馈,非常感谢。我已经看到了您的 examples 并计划在 Client 应用程序中使用它们。在未来的开发迭代中,我们希望改进 Server 应用程序和队列管理,并迁移到 Exchange。
    • 如果每个扩展的 Client 实例创建自己的唯一回复队列,然后将其绑定到 Server的回复交换,您是否认为这是一种合理的方法> 应用程序发布到?绑定将使用该实例应用程序独有的路由键,例如 UUID。是否最好使用直接交换进行回复交换?
    • 是的,在这种情况下,直接交换将是正确的类型。最干净的方法是让服务器只发送到replyTo 属性。在 Spring AMQP 中,在服务器端,MessageListenerAdapter(和@RabbitListener)考虑使用格式为foo/barreplyTo,表示使用路由键bar 发布到foo。这样,服务器甚至不必知道他正在回复哪个交易所。
    猜你喜欢
    • 2013-04-21
    • 2021-05-29
    • 2021-11-01
    • 2012-02-22
    • 2016-11-24
    • 2014-07-30
    • 2013-04-22
    • 1970-01-01
    • 2015-01-06
    相关资源
    最近更新 更多