【问题标题】:Network Traffic in AMQP QPIDAMQP QPID 中的网络流量
【发布时间】:2012-04-17 17:56:38
【问题描述】:

QPID AMQP

我有一个关于重新调整网络流量的问题。假设我在 Machine A 上有一个 Publisher。 Qpid 代理正在 Machine B 上运行。我们有两个订阅者机器 C 和机器 D(他们都订阅相同的主题)。现在想象一个拓扑,其中
A-->B-->X-->C | D (发布者 A 连接到 B,订阅者 C 和 D 通过中间节点 X 连接到 Broker) 由 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 ,但这似乎很复杂,因为中间跃点如何知道何时发送多个副本(我不是网络专家,所以我可能会遗漏一些明显的东西,所以任何帮助将不胜感激)

【问题讨论】:

    标签: network-programming rabbitmq zeromq messagebroker qpid


    【解决方案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。

    【讨论】:

    • 我知道联邦,基本上你可以创建一个路由并订阅消息。我的问题是,如果 X 是网络拓扑中的一个随机跳,它不知道任何 qpid 消息或代理,它只是一个中间跳。那么 X 是否会两次看到相同的消息(一次转发给 c,一次转发给 d?)
    【解决方案2】:

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

    【讨论】:

    • 我知道 RabbitMQ 但我不知道你在说什么。我假设您的意思是,如果没有队列绑定,则不会发送消息?...在​​仔细阅读 OP 的问题后进行编辑,我明白了。
    • 你的意思是随机节点x(它不是任何代理,只是拓扑中的一个随机跳),将只发送一次订阅消息?那么随机节点 x 如何知道它必须向下游发送副本到 C 和 D ?如何在基于代理的中间件中设计此功能以使其对网络拓扑结构更加智能?如果只有一条消息被消耗或发送到节点 X 只是为了在 X 处复制(它不知道任何现有的消息传递中间件)。
    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 2012-12-13
    • 2018-10-08
    • 1970-01-01
    • 2011-08-15
    • 2018-02-12
    • 2013-03-18
    相关资源
    最近更新 更多