0

QPID AMQP

我有一个问题正在重新调整网络流量。假设我在 Machine A 上有一个 Publisher 。Qpid 代理正在 Machine B 上运行。我们有两个订阅者机器 C 和机器 D(他们都订阅相同的主题)。现在想象一个拓扑,其中
A-->B-->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 。我想知道其他基于代理(RabbitMQ)和无代理消息传递框架(零 MQ,LBM/UMS)的解决方案。我在一篇文章中读到 Zero Mq 试图提供更智能的解决方案http://www.250bpm.com/pubsub#toc4,但这似乎很复杂,因为中间跃点如何知道何时发送多个副本(我不是网络专家,所以我可能会遗漏一些明显的东西,所以任何帮助都将不胜感激)

4

2 回答 2

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 上的桥接队列。

第二种选择是使用动态路由。这将自动处理从 X 到 B 的绑定信息的传播,这样消息只会在 X 上的活动绑定需要时从 B 流向 X。

于 2012-04-17T09:19:44.247 回答
0

RabbitMQ 也只会在诸如此类的中间链接上传播一次消息(并且只有在某些下游消费者实际上最终会看到该消息时才会发送消息)。

于 2012-04-17T09:56:38.750 回答