RabbitMQ实践——定制一致性Hash交换器的路由字段

大纲

《RabbitMQ实践------利用一致性Hash交换器做负载均衡》一文中,我们熟悉了一致性Hash交换器的使用方法。默认的,它使用Routing key来做Hash的判断源。但是有些时候,Routing key会有其他作用。比如在Exchange绑定Exchange时,部分Exchange就对Routing key有很强的限制。这种时候,我们就可以通过自定义路由字段来避开对Routing key的依赖。

Property法

Property法是指利用消息的Property中的一些字段来作为路由字段。

这相当于要定义交换器的判断标准,所以我们在创建交换器时,需要做特殊处理。

定制交换器

我们创建一个名字叫x.consistent.hash.from.property的一致性hash交换器。并且要在Arguments中设置hash-property字段 (固定),它的值是property中的某个字段,比如message_id。通过hash-header的值,我们告诉一致性hash交换器,要使用消息Header中的message_id字段做消息路由判断源。

绑定队列

《RabbitMQ实践------利用一致性Hash交换器做负载均衡》介绍的案例一样,我们使用负载均衡的方式绑定到3个队列。

测试

我们将hash值设置到消息message_id中,然后发布给交换器。注意convertAndSend的Routing key参数可以传空串,因为后续也用不到。

java 复制代码
    public boolean sendToXConsistentHashExchangeWithMessageId(String exchangeName, Long count) {
        for (int i = 0; i < count; i++) {
            int hash = Integer.hashCode(i);
            Message message = MessageBuilder.withBody(("Message " + i).getBytes())
                .setMessageId(String.valueOf(hash))
                .build();
            rabbitTemplate.convertAndSend(exchangeName, "",  message);
        }
        return true;
    }

发布10,0000条消息

可以看到消息被相对平均的路由到各个队列上

Header法

Header法是指利用消息Header中的自定义字段来实现。它比Property法更加的自由。

定制交换器

我们创建一个名字叫x.consistent.hash.from.header的一致性hash交换器。并且要在Arguments中设置hash-header字段 (固定),它的值是hash(自定义)。通过hash-header的值,我们告诉一致性hash交换器,要使用消息Header中的hash字段做消息路由判断源。

绑定队列

《RabbitMQ实践------利用一致性Hash交换器做负载均衡》介绍的案例一样,我们使用负载均衡的方式绑定到3个队列。

测试

我们将hash值设置到消息Header中,然后发布给交换器。注意convertAndSend的Routing key参数可以传空串,因为后续也用不到。

java 复制代码
public boolean sendToXConsistentHashExchangeWithHeader(String exchangeName, Long count) {
    for (int i = 0; i < count; i++) {
        int hash = Integer.hashCode(i);
        Message message = MessageBuilder.withBody(("Message " + i).getBytes())
            .setHeader("hash", hash)
            .build();
        rabbitTemplate.convertAndSend(exchangeName, "",  message);
    }
    return true;
}


代码工程

https://github.com/f304646673/RabbitMQDemo

参考资料

相关推荐
小白程序员成长日记8 分钟前
2025.11.24 力扣每日一题
算法·leetcode·职场和发展
有一个好名字9 分钟前
LeetCode跳跃游戏:思路与题解全解析
算法·leetcode·游戏
weiwei2284423 分钟前
zcash pow equihash算法详解
区块链·哈希算法·zcash
AndrewHZ1 小时前
【图像处理基石】如何在图像中提取出基本形状,比如圆形,椭圆,方形等等?
图像处理·python·算法·计算机视觉·cv·形状提取
蓝牙先生1 小时前
简易TCP C/S通信
c语言·tcp/ip·算法
kong79069282 小时前
微服务项目开发环境
微服务·nacos·rabbitmq·开发环境
Bug快跑-13 小时前
面向数据密集型应用的Python工程化实践与性能优化策略深度分析与经验分享探索研究篇
rabbitmq
稚辉君.MCA_P8_Java5 小时前
Gemini永久会员 Java中的四边形不等式优化
java·后端·算法
稚辉君.MCA_P8_Java5 小时前
通义 插入排序(Insertion Sort)
数据结构·后端·算法·架构·排序算法
while(努力):进步5 小时前
面向移动与云端的Kotlin微服务架构设计与高并发后端性能优化工程化实践经验分享
rabbitmq