对于我工作的公司,我们希望使用RabbitMQ作为我们的主要消息总线.我们的想法是每个应用程序都使用自己的vhost进行内部通信,通过铲子或联合插件,我们可以跨多个vhosts共享某些类型的事件(甚至可能是多台机器(非群集)) .我们选择每个vhost的应用程序将内部通信与公共事件分开,并保持每个应用程序的安全性可调.
基于在RabbitMQ网站上发布的信息,当我不得不选择铲子或者我必须选择联合插件时,我不会得到它.
RabbitMQ具有以下说明何时使用:
通常,当您需要比联合提供的更多控制时,您可以使用铲子在互联网上链接经纪人.
当我选择联邦时,我所缺少的铲子中的细粒控制是什么?
此时我想我更喜欢联合插件,因为我可以通过联合插件提供的REST API自动进行vhost间通信.在铲子的情况下,我需要更改铲子配置并在每次我们想要在vhost之间共享事件时重新启动RabbitMQ实例.我的想法是否正确?
我们目前在Windows上运行RMQ,客户端从.NET连接.在不久的将来,Java/Perl/PHP客户端将加入.
总结一下我的问题:
我有三个客户端,每个客户端都有自己的RabbitMQ实例,我有一个应用程序(让我们称之为appA),它有自己的RabbitMQ实例,三个客户端应用程序(app1,app2,app3)想要在appA上使用服务.
appA上的服务需要RPC通信,app1,app2和app3每个都有一个booking.request队列和一个booking.response队列.

使用铲子插件,我可以将所有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.
Run Code Online (Sandbox Code Playgroud)
现在appA将响应预订请求.响应队列,我需要在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>
Run Code Online (Sandbox Code Playgroud)
是否可以指定多个连接工厂,即使连接工厂属于同一个RabbitMQ实例,也只是指定不同的vhost:

更新:
基于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" />
Run Code Online (Sandbox Code Playgroud)
然后我将使用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>
Run Code Online (Sandbox Code Playgroud)
现在,当我声明我的rabbitMQ模板时,我会将它指向SimpleRoutingConnectionFactory而不是单个连接工厂: …
我要实现的是内部网络中的RabbitMQ客户端与Azure中运行的Azure Service Bus使用者之间的互操作性。
RabbitMQ客户端需要发布和订阅,Azure Service Bus使用者也需要发布和订阅-因此,我需要某种“双向代理”。我正在尝试实现的图表:
+
Internal network | Azure
|
|
+--------+ | +----------+
| Client +---+ | +---+ Consumer |
+--------+ | | | +----------+
| | |
| +-----------------+ | +-------------------+ |
+-+ RabbitMQ Broker +---------+ Azure Service Bus +--+
| +-----------------+ | +-------------------+ |
| | |
+--------+ | | | +----------+
| Client +---+ | +---+ Consumer |
+--------+ | +----------+
|
|
|
+
Run Code Online (Sandbox Code Playgroud)
AFAIK,RabbitMQ代理和Azure Service Bus都可以执行AMQP 1.0。我已经看过了兔子铲插件,但是我认为这将只处理从内部客户端到Azure的消息发布,并且不允许客户端订阅Azure使用者发布的消息吗?还是我弄错了,铲子可以解决这个问题?
如果铲子不起作用,还有其他方法可以实现这一目标
使用“ rabbitmqctl eval'rabbit_shovel_status:status()。”,我可以在我的Rabbitmq服务器中获得铲子的状态。
我激活了模块“ rabbitmq_shovel”和“ rabbitmq_shovel_management”。
我使用HTTP API创建了一些动态挖土机,但问题是,我希望能够使用HTTP API来获取挖土机的状态,但我找不到解决办法。
有什么办法可以使用HTTP API做到这一点?还是应该使用“ rabbitmqctl eval ...”?
我不想使用Rabbitmqctl,因为我想在自己的API中公开此数据,因此我的应用程序应该能够访问它,而不必执行“ exec”。
我们已经将队列配置为将死信消息(特别是 nack'ed 消息)发送到死信交换,该死信交换按其原始主题将它们路由到各个死信队列。这一切都很有效,当消息被拒绝时,它们会被发送到正确的死信队列。
当我们将这些消息从 dlq 铲回到普通队列时,问题就来了,在那里它们再次被拒绝。由于某种原因,第二次它们只是消失了,而不是被送回死信交换。
我假设正在进行某种“循环消息路由”检测,但找不到类似的东西。第二次检查消息会给出所有预期的标头,因此我不确定这样的事情是基于什么。任何关于下一步去哪里或者兔子是否有这样的东西的建议将不胜感激!
如果有必要,我们的消费者是用 python 编写的,使用 pika 库进行通信。