RabbitMQ 的 Consistent Hash 交换机通过插件实现,依据消息 Header 或 Property 字段哈希路由,确保相同键消息稳定进入同一队列;绑定不依赖 routing key,而靠权重与一致性哈希环分配流量,增减队列时仅少量键重映射。

Java 中使用 RabbitMQ 的 Consistent Hash 交换机,核心是通过自定义交换器类型(x-consistent-hash)配合消息的特定字段(Property 或 Header)做哈希计算,让相同键的消息稳定路由到同一队列。它不依赖路由键(routing key),而是由消息自身携带的标识字段决定分发目标。
创建 Consistent Hash 交换器
Consistent Hash 交换器不是 RabbitMQ 默认内置类型,需安装 rabbitmq-consistent-hash-exchange 插件(RabbitMQ 3.8+ 已支持官方插件)。启用后,可通过管理界面或代码声明:
- 交换器类型设为
x-consistent-hash - 必须在 Arguments 中指定哈希依据字段:
-
Header 方式:设置
hash-header="hash"(值为 header 键名),例如message.getMessageProperties().setHeader("hash", "user_123") -
Property 方式:设置
hash-property="message_id"(值为 AMQP 属性名),例如用MessageBuilder.setMessageId("order_456")
-
Header 方式:设置
绑定队列并配置负载均衡
与普通交换器不同,Consistent Hash 交换器的绑定不依赖 routing key,而是靠「绑定权重」控制流量分配:
- 每个队列绑定时,可设置
x-queue-type为quorum或classic,推荐 quorum 提高可用性 - 绑定参数中添加
x-consistent-hash-routing-key(可选),但实际路由由消息 header/property 决定 - 若希望三队列大致均摊,直接绑定三次(无需指定 key),插件会基于一致性哈希环自动映射
发送消息时指定哈希源字段
关键在构造消息时注入用于哈希计算的字段,且该字段值应具备业务语义稳定性(如用户 ID、订单号):
立即学习“Java免费学习笔记(深入)”;
- Header 法(更灵活):
Message message = MessageBuilder.withBody("data".getBytes()) .setHeader("hash", "uid_789") // 与 exchange 的 hash-header 值一致 .build(); rabbitTemplate.convertAndSend("exchange.name", "", message); - Property 法(如用 message_id):
Messagemessage=MessageBuilder.withBody("data".getBytes()) .setMessageId("order_1001") // 与 exchange 的 hash-property 值一致 .build(); rabbitTemplate.convertAndSend("exchange.name", "", message);
验证路由一致性与负载效果
发送一批带相同哈希字段的消息,观察是否全部进入同一队列;换不同字段值,检查是否分散到不同队列:
- 用
rabbitmqctl list_queues name messages查看各队列消息数 - 开启多个消费者监听同一组队列,确认相同 key 的消息始终由同一消费者处理(天然支持“局部有序”)
- 增减队列时,仅少量 key 重新映射,避免全量迁移 —— 这正是一致性哈希的核心优势



















