QPID AMQP
我有一个重新调整网络流量的问题。假设我在机器A上有一个发布者。 Qpid代理正在机器B上运行。我们有两个订户机器C和机器D(他们都订阅相同的主题)。现在想象一下拓扑结构 A - >乙 - > X - &以及c | d (发布者A连接到B,订阅者C和D通过中间节点X连接到代理) 由A发布的与C和D主题相匹配的消息将由两者接收。我想知道的是边缘b-> x将携带消息两次(对于b-> x-> c和第二次b-> x-> c)。或者AMQP / qpid框架是否足够智能,可以从B向X发送一次消息,然后将副本发送给每个用户(因此b-> x上的网络流量较少)。 我认为是因为X什么都不知道,如果我们为每个订户都有私人订阅队列(或者即使共享队列和浏览/复制消息而不是消费),该消息将通过b-> x
此问题并非特定于QPID。我想知道其他基于Broker(RabbitMQ)和无代理消息传递框架(Zero MQ,LBM / UMS)的解决方案。我在一篇文章中读到Zero Mq试图提供一个更智能的解决方案http://www.250bpm.com/pubsub#toc4,但它似乎很复杂,因为中间跃点如何知道何时发送多个副本(我不是网络专家,所以我可能会错过一些obvoius ,所以任何帮助都会非常感激)
答案 0 :(得分:1)
我假设X是另一个Qpid代理,通过“联合”功能连接到B.在这种情况下,消息将不会从B传输两次到X.
根据场景的其他要求,您可以通过不同的方式进行配置。
第一个是静态地将X链接到B:你在B上为X创建一个队列来订阅,将该Q绑定到有问题的交换,使得C和D的消息都匹配,然后使用qpid-route到在X上创建从该队列到交换的桥接。现在,C和D在X上连接并绑定到该交换,并将按预期接收A发布的消息。在这种情况下,无论C或D是否处于活动状态,消息总是从B流向X.如果添加另一个使用者E,则可能需要在B上静态添加绑定到brdiged队列。
第二种选择是使用动态路由。这将自动处理从X到B的绑定信息的传播,这样如果X上的活动绑定需要消息,则消息将仅从B流向X.
答案 1 :(得分:0)
RabbitMQ也只会通过一次中间链接传播一条消息(如果某个下游消费者实际上最终会看到该消息,它将只会被发送)。