跨多个rabbitMQ实例的RabbitMQ RPC

标签 rabbitmq spring-amqp federation rabbitmq-shovel

我有三个客户端,每个客户端都有自己的 RabbitMQ 实例,并且我有一个应用程序(我们称之为 appA),它有自己的 RabbitMQ 实例,三个客户端应用程序(app1、app2、app3)想要使用应用程序A。

appA 上的服务需要 RPC 通信,app1、app2 和 app3 各有一个 booking.request 队列和一个 booking.response 队列。

enter image description here

使用 shovel 插件,我可以将所有 booking.request 消息从 app1-3 转发到 appA:

Shovel1 
virtualHost=appA, 
name=booking-request-shovel, 
sourceURI=amqp://userForApp1:password@app1-server/vhostForApp1
queue=booking.request
destinationURI=amqp://userForAppA:password@appA-server/vhostForAppA
queue=booking.request

setup another shovel to get booking requests from app2 and app3 to appA in the same way as above.

现在appA将响应booking.response队列上的请求,我需要rabbitMQ-appA上的预订响应消息返回到app1、app2或app3上正确的booking.response队列,但不是所有的他们 - 如何在rabbitMQ-appA上设置铲子/联合队列,将响应转发回正确的rabbitMQ(app1、app2、app3),该队列期望在自己的 booking.response 队列中得到响应?

所有这些应用程序都使用 spring-amqp(如果相关的话) 或者,我可以在 Spring 中设置一个rabbitMQ 模板,用于监听多个rabbitMQ 队列并从每个队列中进行消费。

从文档来看,典型的消费者是这样的:

<rabbit:listener-container connection-factory="rabbitConnectionFactory">
    <rabbit:listener queues="some.queue" ref="somePojo" method="handle"/>
</rabbit:listener-container>

是否可以指定多个连接工厂来执行此操作,即使连接工厂位于同一 RabbitMQ 实例,但只是不同的虚拟主机:

enter image description here

更新:

根据 Josh 的回答,我有多个连接工厂:

 <rabbit:connection-factory
                id="connectionFactory1"
                port="${rabbit.port1}"
                virtual-host="${rabbit.virtual1}"
                host="${rabbit.host1}"
                username="${rabbit.username1}"
                password="${rabbit.password1}"
                connection-factory="nativeConnectionFactory" />

 <rabbit:connection-factory
                id="connectionFactory2"
                port="${rabbit.port2}"
                virtual-host="${rabbit.virtual2}"
                host="${rabbit.host2}"
                username="${rabbit.username2}"
                password="${rabbit.password2}"
                connection-factory="nativeConnectionFactory" />

然后我将使用 SimpleRoutingConnectionFactory 来包装两个连接工厂:

<bean id="connectionFactory" class="org.springframework.amqp.rabbit.connection.SimpleRoutingConnectionFactory">
    <property name="targetConnectionFactories">
        <map>
            <entry key="#{connectionFactory1.virtualHost}" ref="connectionFactory1"/>
            <entry key="#{connectionFactory2.virtualHost}" ref="connectionFactory2"/>
        </map>
    </property>
</bean>

现在,当我声明我的rabbitMQ模板时,我会将其指向SimpleRoutingConnectionFactory而不是单个连接工厂:

<rabbit:template id="template" connection-factory="connectionFactory" />

...然后像我通常使用的那样使用模板...

<rabbit:listener-container
        connection-factory="connectionFactory"
        channel-transacted="true"
        requeue-rejected="true"
        concurrency="${rabbit.consumers}">
        <rabbit:listener queues="${queue.booking}" ref="TransactionMessageListener" method="handle"  />
</rabbit:listener-container>

//并且消息是从两个rabbitMQ实例消费的

...和...

  @Autowired
  private AmqpTemplate template;

  template.send(getExchange(), getQueue(), new Message(gson.toJson(message).getBytes(), properties));

//消息发布到两个队列

我说得对吗?

最佳答案

看一下 org.springframework.amqp.rabbit.connection.AbstractRoutingConnectionFactory。它将允许您创建到不同虚拟主机或不同rabbitmq实例的多个连接工厂。我们将其用于 Multi-Tenancy rabbitmq应用程序。

关于跨多个rabbitMQ实例的RabbitMQ RPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28520784/

相关文章:

schema - openam federation 的问题(使用 apaches 作为数据存储)

java - HLA - timeAdvanceRequest() 的用法

node.js - 当node-amqp时也不异常(exception)

java - 内存队列服务器

java - Spring AMQP : [RabbitTemplate] Hystrix fallback is not getting invoked when RabbitTemplate ReturnCallback is executed

Spring AMQP RPC 非默认交换

rabbitmq - 如何在 Mule 应用程序中按优先级顺序监听多个队列。

.net - RabbitMQ Pub/Sub : Closing the last consumer closes the publisher's channel/model. 为什么?

java - AMQP 异步监听器仅在事件发生后才开始监听消息

webpack - 使用 Webpack 4.X 的联合模块