详细介绍MessageQueueSelector
一、MessageQueueSelector 详解
MessageQueueSelector 是 RocketMQ 提供的一个接口,用于自定义消息发送时的队列选择策略。 通过实现该接口,
开发者可以控制消息被发送到 Topic 的哪个队列(MessageQueue),从而支持 顺序消息、负载均衡、业务隔离 等高级场景
1、接口定义

2、使用场景
A、顺序消息(关键场景)
需求:同一业务键(如订单 ID)的消息必须发送到同一队列,保证消费顺序
实现:
// 示例:按订单ID哈希选择队列,确保同一订单的消息进入同一队列
SendResult result = producer.send(msg, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> queues, Message msg, Object arg) {
String orderId = (String) arg; // arg 传入订单ID
int index = Math.abs(orderId.hashCode()) % queues.size();
return queues.get(index);
}
}, "订单123"); // 将订单ID作为 arg 传入
B、负载均衡优化
需求:避免热点队列,根据业务特征分散消息
实现:
// 示例:按用户ID轮询选择队列
SendResult result = producer.send(msg, (mqs, msg, arg) -> {
long userId = (Long) arg;
return mqs.get((int) (userId % mqs.size()));
}, 12345L);
C、业务隔离
需求:不同业务类型的消息路由到不同队列
实现:
// 示例:按消息标签(Tag)选择队列
SendResult result = producer.send(msg, (mqs, msg, arg) -> {
String tag = msg.getTags();
if ("PAYMENT".equals(tag)) {
return mqs.get(0); // 支付消息固定发到队列0
} else {
return mqs.get(1); // 其他消息发到队列1
}
}, null);
二、核心注意事项
1、队列数量稳定性
问题:如果动态增加 Topic 的队列数,可能导致哈希结果不一致,破坏顺序消息
解决:
提前规划队列数(如固定 16 个队列),避免扩容
如需扩容,需停机迁移或使用一致性哈希算法
2、参数传递
- arg 的作用:通过 send() 方法的第三个参数传递业务标识(如订单ID),在 select() 中使用

3、异常处理
- 空队列问题:如果 queues 为空(如 Topic 未创建),需抛出异常或降级处理

4、内置实现类
RocketMQ 提供了几个常用的内置选择器:

使用示例:

5、完整代码示例

6、最佳实践
顺序消息:使用业务键(如订单ID)作为 arg,确保相同键的消息进入同一队列。
性能优化:避免在 select() 中执行复杂计算(如数据库查询)。
监控:记录队列选择分布,避免数据倾斜(如某些队列压力过大)。
详细介绍MessageQueueSelector的更多相关文章
- [No0000A7]批处理经常用到的变量及批处理>NUL详细介绍
绝对路径是指调用绝对的程序位置的路径,例如: start C:\Windows\test.exe 相对路径是文件改变路径以后还会按照变量的路径所在位置去调用,例如: start %WINDIR%\te ...
- linux配置网卡IP地址命令详细介绍及一些常用网络配置命令
linux配置网卡IP地址命令详细介绍及一些常用网络配置命令2010-- 个评论 收藏 我要投稿 Linux命令行下配置IP地址不像图形界面下那么方 便,完全需要我们手动配置,下面就给大家介绍几种配置 ...
- _MSC_VER详细介绍
_MSC_VER详细介绍 转自:http://www.cnblogs.com/braver/articles/2064817.html _MSC_VER是微软的预编译控制. _MSC_VER可以分解为 ...
- php CGI、Fastcgi、PHP-FPM的详细介绍与之间的关系
以下PHP CGI.Fastcgi.PHP-FPM的一些信息归纳和汇总----->详细介绍与之间的关系 一:CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的 web ...
- RabbitMQ消息队列(一): Detailed Introduction 详细介绍
http://blog.csdn.net/anzhsoft/article/details/19563091 RabbitMQ消息队列(一): Detailed Introduction 详细介绍 ...
- doT.js详细介绍
doT.js详细介绍 doT.js特点是快,小,无依赖其他插件. 官网:http://olado.github.iodoT.js详细使用介绍 使用方法:{{= }} for interpolati ...
- Linux截屏工具scrot用法详细介绍
Scrot是Linux命令行中使用的截图工具,能够进行全屏.选取等操作,下面小编将针对Scrot截图工具的用法给大家做个详细介绍,通过操作实例来学习Scrot的使用. 在Linux中安装Scrot ...
- Oracle Merge into 详细介绍
Oracle Merge into 详细介绍 /*Merge into 详细介绍MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句.通过MERGE语句,根据一张表或子查 ...
- cPage分页详细介绍
asp.net中各种数据控件,datalist.gridview.Repeater等分页是最常用的功能,几乎任何一个B/S项目,无论是系统还是网站都会用到.分页时,读取整个数据,直接绑定到控件,都可以 ...
- 【转载】硬盘MBR详细介绍
原文地址:http://blog.chinaunix.net/uid-15007890-id-106892.html 硬盘MBR详细介绍 硬盘是现在计算机上最常用的存储器之一.我们都知道,计 ...
随机推荐
- 如何配置支付宝密钥之如何配置普通 RSA2 密钥|保姆级教学(一)
进行支付宝开发的第一步就是:配置密钥. 但是有很多小伙伴都不知道怎么配置,这篇文章将手把手帮你从头开始捋清如何配置支付宝密钥- 这次首先放一下官方文档:[如何生成及配置 RSA2 密钥],大佬们也可以 ...
- IPTools for .NET:快速查询全球IP信息
IPTools 是一个用于快速查询全球 IP 地址信息的库,支持国内和国际 IP 查询,提供详细的地理位置信息(如国家.省份.城市)以及经纬度等数据. 1. IPTools.China IPTools ...
- nacos(五): 读取nacos配置并实现动态刷新
接上回<nacos(四): 创建第一个消费者Conumer(单体)>,这一篇将介绍如何读取nacos中的配置,并实现动态刷新. 首先,需要先引入spring-cloud-starter-a ...
- datawhale-大模型攻防比赛实践-第一次行动
最近刚好是在写智能信息安全的教程,最后一章准备讲内容安全,里面有一节探讨大模型安全的内容,刚好可以拿比赛的内容当案例. 首先,可以通过modelscope平台获得GPU使用权限.然后你就可以跑base ...
- Docker容器访问挂载文件权限问题
问题描述 在使用docker-compose部署项目时,yaml文件如下: version: '3' services: purchasing-contract-consumer: image: my ...
- CAD内核的奥秘 | 工业软件发展史 (转)
CAD内核的奥秘 | 工业软件发展史 (声明:此文非本人原著,仅供交流,如果侵犯到原作者权利,立即删除) 如果一个产业要寻根,就会发现一个万千世界,最后会聚焦到一个点上. "一沙一世界&qu ...
- 源码方式本地化部署deepseek和量化
前置条件 1.python环境,安装教程:https://www.python.org/downloads/2.wsl环境(Windows系统),安装教程:https://learn.microsof ...
- DataX - [03] 使用案例
题记部分 001 || mysql2hdfs (1)查看MySQL被迁移的数据情况 (2)根据需求确定reader为mysqlreader,writer为hdfswriter 查看reader和wri ...
- @autowired注解报错原因及解决办法
@autowired 注入dao层的时候,标红报错,但不影响编译使用 按照严格的spring注解方式在dao层加入@Repository注解
- centos 运行springboot 项目
jar文件发布: 准备工作: 发布在springboot项目中的pom.xml文件添加如下: <build> <plugins> <plugin> <grou ...