大纲
- 开启一致性Hash交换器
- 创建交换器
- 创建绑定关系
- 测试
- 参考资料
在《RabbitMQ实践——交换器(Exchange)和绑定(Banding)》中,我们熟悉了Direct、Fanout、Topic和Header这4种系统默认支持的交换器。这些交换器基本可以满足我们日常的需求。我们还可以添加一些设计,让其支持更加丰富的功能。比如我们可以通过Topic的设计,达到“负载均衡”的功能。
如果不想做这样的设计,可以使用RabbitMQ自身携带,只是未开启的一致性Hash交换器,来实现对队列的平均分流。这样我们让更多消费者订阅不同的队列,来增加整理系统的处理能力。
开启一致性Hash交换器
在RabbitMQ所在的服务终端上执行:
sudo -H -u rabbitmq bash -c "/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_consistent_hash_exchange"
创建交换器
这样我们就可以新建该类型交换器
创建绑定关系
在一致性Hash交换器中,绑定关系的Routing key被当做权重使用。如果数值越大,被路由到对应的队列上的消息也越多。
本例我们测试“负载均衡”的场景,所以把三个队列的路由权重都设置的比较低且一致。
测试
public boolean sendToXConsistentHashExchange(String exchangeName, Long count) {
for (int i = 0; i < count; i++) {
int hash = Integer.hashCode(i);
rabbitTemplate.convertAndSend(exchangeName, String.valueOf(hash), "Message " + i);
}
return true;
}
然后发送10,0000条消息
可以看到消息被相对均衡的路由到各个队列上
参考资料
- https://github.com/rabbitmq/rabbitmq-consistent-hash-exchange
- https://github.com/rabbitmq/rabbitmq-server/tree/main/deps/rabbitmq_consistent_hash_exchange