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

参考资料

相关推荐
千弥霜12 小时前
codeforces1914 C~F
c语言·算法
wyiyiyi12 小时前
【数据结构+算法】进栈顺序推算、卡特兰数与逆波兰表达式
汇编·数据结构·笔记·算法
天若有情67312 小时前
Multi-Stride Predictive RNG:革命性的可控随机数生成算法
算法·算法设计·c++编程·随机数生成·msp-rng·魔术算法
C_Liu_12 小时前
14:C++:二叉搜索树
算法
CC-NX12 小时前
32位汇编:实验9分支程序结构使用
汇编·算法·win32·分支结构
万岳科技系统开发12 小时前
外卖小程序中的高并发处理:如何应对大流量订单的挑战
算法·小程序·开源
TL滕12 小时前
从0开始学算法——第二天(时间、空间复杂度)
数据结构·笔记·学习·算法
旺仔老馒头.14 小时前
【数据结构与算法】手撕排序算法(二)
c语言·数据结构·算法·排序算法
好学且牛逼的马14 小时前
【Hot100 | 2 LeetCode49 字母异位词分组问题】
算法
2301_7951672014 小时前
Rust 在内存安全方面的设计方案的核心思想是“共享不可变,可变不共享”
算法·安全·rust