模数哈希交换机
概述
x-modulus-hash 交换机是 RabbitMQ 的一种内置交换机类型,它根据路由键的哈希值将消息分发到绑定的队列中。它的设计初衷是在多个常规队列(分片)之间对消息进行分区,同时保证路由的稳定性。
当消息发布到此交换机时,它会对消息的路由键进行哈希处理,并执行 Hash mod N 操作以选择目标队列,其中 N 是绑定目的地的总数。
注意:此交换机会忽略绑定键 (binding keys) 的值。
稳定路由
x-modulus-hash 交换机的一个关键特性是它保证稳定路由。只要到交换机的绑定保持不变,具有相同路由键的消息将始终被路由到完全相同的目标队列,即使在节点重启后也是如此。
这使得它非常适合于那些特定领域实体(例如订单 ID)的消息顺序很重要,但又希望跨多个消费者并发处理消息的用例。
并发处理与消息顺序
一种常见的模式是将 N 个队列绑定到 x-modulus-hash 交换机,并在每个队列上启用 单活跃消费者 (SAC) 功能。这可以提供:
- 消息顺序:得益于稳定路由,特定路由键的所有消息最终都会进入同一个队列。SAC 确保它们按顺序被处理。
- 并发消费:
N个应用程序实例可以并行处理消息,每个实例从不同的队列进行消费。 - 容错性:如果一个活跃消费者崩溃,代理将自动把消息投递给连接到该队列的另一个消费者。
加权路由
x-modulus-hash 交换机也隐含支持加权路由。如果用户将同一个队列绑定到同一个交换机实例 M 次(使用不同的虚拟绑定键,因为绑定键在路由时会被忽略),则该队列接收到任何给定消息的概率为 M / N。这使您可以根据需要轻松地将更多负载分配到特定的队列。
与一致性哈希交换机的比较
RabbitMQ 还提供了一个 一致性哈希交换机 (Consistent Hash Exchange) 插件。虽然两者都可以根据路由键对消息进行分区,但它们有不同的权衡:
- 模数哈希交换机:更简单、内置,并且保证稳定路由。但是,如果您添加或删除队列(更改
N),几乎所有键的路由都会重新洗牌。 - 一致性哈希交换机:需要启用插件,并管理更复杂的哈希环。当添加或删除队列时,它能最大限度地减少重新洗牌,使其更适合动态拓扑。
如果您的拓扑结构是静态的,并且需要严格的消息顺序保证,建议使用 x-modulus-hash 交换机。