跳至主内容

3.2.0 版本中的联合队列

·3 分钟阅读
Simon MacMullen

我们在 RabbitMQ 3.2.0 中添加了对联合队列的支持。这篇博文解释了它们的作用以及如何使用它们。

(顺便说一句,如果这看起来像一段密密麻麻的文字,敬请谅解,我的绘画技巧不佳。RabbitMQ 团队中更有艺术细胞的成员正在创作一些精美的图表……)

它们是做什么用的?

队列联邦的核心思想是处理不同服务器上队列之间的消息负载均衡。如果你有一组相互联邦的队列,那么生产者可以向它们发布消息,消费者也可以从中消费消息,而(基本)不必关心消息的实际位置。

因此,虽然联邦交换机主要用于发布/订阅场景(任何地方的消费者都能看到任何地方发布的消息),但联邦队列则适用于工作队列场景(任何地方的某个消费者都能看到任何地方发布的消息)。发布者可以在任何地方发布,联邦机制会自动将消息移动到可以被消费的地方,但一条消息在任何给定时间应该只存在于一个位置。

顺便说一句,这与人们通常讨论负载均衡的方式有所不同。通常我们考虑的是“事实发生之前”的负载均衡——想象一下发布者随机选择多个队列之一进行发布,每个队列都有一些本地消费者。这种方法的麻烦在于,如果一个队列的消费者落后或完全停止工作,就没有什么能平滑这一切。队列联邦的负载均衡是“事实发生之后”的,它将消息移动到可以被处理的地方。

自 3.1.x 版本以来,联邦链接的性能有所提高(在 `no-ack` 模式下速度大约是原来的两倍,在 `on-confirm` 模式下速度提高了 50%)。但我们仍然希望尽可能避免移动消息,所以队列联邦只会在队列 B 有消费者但没有消息,并且队列 A 的消息数量超出了其消费者(立即)处理能力时,才将消息从队列 A 移动到队列 B。队列联邦的理想用户是在每个单独的队列上平衡发布和消费,从而让联邦机制无事可做。😃至少,直到某个消费者落后……

它们又不是做什么用的?

现在交换机和队列都可以进行联邦了,很容易让人想到:“好吧,我可以联邦所有东西,然后我就会有一个大的虚拟代理,就像一个集群,但具有分区容错能力。”当然,正如我们老朋友的 CAP 定理所建议的那样,事情并没有那么简单;如果你获得了(P)分区容错能力,你就必须失去其他东西,而在联邦的情况下,那就是(C)一致性。联邦队列中的某条给定消息永远只会存在于一个位置;没有镜像。可以将其视为 RAID-0 而非 HA 的 RAID-1。

当然,如果你想要 RAID-10,你可以将集群与联邦连接起来……

那么如何联邦一个队列?

很简单!定义一个或多个上游,就像联邦交换机一样,然后定义一个匹配你队列的策略,并定义一个 `federation-upstream-set` 或 `federation-upstream`,同样就像联邦交换机一样。有关更多详细信息,请参阅 文档,但实际上它的工作原理与联邦交换机完全相同。

© . This site is unofficial and not affiliated with VMware.