一、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的更多相关文章

  1. [No0000A7]批处理经常用到的变量及批处理>NUL详细介绍

    绝对路径是指调用绝对的程序位置的路径,例如: start C:\Windows\test.exe 相对路径是文件改变路径以后还会按照变量的路径所在位置去调用,例如: start %WINDIR%\te ...

  2. linux配置网卡IP地址命令详细介绍及一些常用网络配置命令

    linux配置网卡IP地址命令详细介绍及一些常用网络配置命令2010-- 个评论 收藏 我要投稿 Linux命令行下配置IP地址不像图形界面下那么方 便,完全需要我们手动配置,下面就给大家介绍几种配置 ...

  3. _MSC_VER详细介绍

    _MSC_VER详细介绍 转自:http://www.cnblogs.com/braver/articles/2064817.html _MSC_VER是微软的预编译控制. _MSC_VER可以分解为 ...

  4. php CGI、Fastcgi、PHP-FPM的详细介绍与之间的关系

    以下PHP CGI.Fastcgi.PHP-FPM的一些信息归纳和汇总----->详细介绍与之间的关系 一:CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的 web ...

  5. RabbitMQ消息队列(一): Detailed Introduction 详细介绍

     http://blog.csdn.net/anzhsoft/article/details/19563091 RabbitMQ消息队列(一): Detailed Introduction 详细介绍 ...

  6. doT.js详细介绍

    doT.js详细介绍   doT.js特点是快,小,无依赖其他插件. 官网:http://olado.github.iodoT.js详细使用介绍 使用方法:{{= }} for interpolati ...

  7. Linux截屏工具scrot用法详细介绍

    Scrot是Linux命令行中使用的截图工具,能够进行全屏.选取等操作,下面小编将针对Scrot截图工具的用法给大家做个详细介绍,通过操作实例来学习Scrot的使用.   在Linux中安装Scrot ...

  8. Oracle Merge into 详细介绍

    Oracle Merge into 详细介绍 /*Merge into 详细介绍MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语句.通过MERGE语句,根据一张表或子查 ...

  9. cPage分页详细介绍

    asp.net中各种数据控件,datalist.gridview.Repeater等分页是最常用的功能,几乎任何一个B/S项目,无论是系统还是网站都会用到.分页时,读取整个数据,直接绑定到控件,都可以 ...

  10. 【转载】硬盘MBR详细介绍

    原文地址:http://blog.chinaunix.net/uid-15007890-id-106892.html 硬盘MBR详细介绍      硬盘是现在计算机上最常用的存储器之一.我们都知道,计 ...

随机推荐

  1. webrtc-streamer实时播放监控

    公司要做web端监控实时播放,经过调研,webrtc-streamer的方式对前后端项目侵入最少,且没有延迟卡钝的现象. 一.准备工作 一个摄像头,摄像头对应的rtsp流链接,一台电脑,一个vue项目 ...

  2. Bottleup pg walkthrough Intermediate

    一开始看到page=view/.html的时候就想到目录穿越了尝试../../../../../../../../../../../etc/passwd 发现不行 找半天其他可能存在漏洞的地方又找不到 ...

  3. XReport通过数据控制控件是否打印

    需求场景:医嘱单在患者出院的时候,需要标记一条红线,表示以下没有医嘱了.数据库中此记录的一个字段属性isRed值来标记这一行. 实现:XReport报表的明细区域增加一个line1对象.然后在明细表格 ...

  4. VMware常用操作

    VMware常用操作 VMware作为一款功能强大的虚拟化软件,为用户提供了一个灵活.高效的虚拟环境.在日常使用中,掌握VMware的常用操作对于提高工作效率.优化资源配置至关重要.以下将详细介绍VM ...

  5. Q: 如何实现右键选择打开文件的应用程序

    1.win+R打开cmd窗口,输入regedit,打开注册表 2.依次找到HKEY_CLASSESS_ROOT->*->Shell,下面新建项 "用notepad打开" ...

  6. THUWC 之后到 2.9 的总结

    考试 题解还没来得及写. 还是出现没有得到预期得分的情况,有时是没有调试完成,有时是挂分. 但是从做题情况看来,做我熟悉的题目比方说偏数学和性质的一般没有劣势.但是在数据结构比较不熟练,技巧和 tri ...

  7. ssh免密登录和代理连接线上服务器

    一.本地ssh配置 1.本地没有.ssh目录,第一次初始化ssh,一直回车键默认值 ssh-keygen -t rsa -P '' 2.设置目录权限 chmod 700 -R .ssh 设置目录权限 ...

  8. 表治理-Iceberg过期快照清理

    总结 指标 清理前(已优化小文件) 清理后 查询速度 13秒 15秒(波动) 表总大小 26.4G 17.2G metadata目录文件数 75 42 data目录文件数 1501 602 !!!需要 ...

  9. iceberg调研-查询Iceberg表流程

    1.查询表结构 show create table data_lake_ods.dws_service_subclazz_lesson_user_learn_stat_rt_v2 CREATE TAB ...

  10. mybatis之增删改查

    核心配置文件中配置数据库连接及注册mapper.xml mapper.xml用来编写执行的sql(namespace为对应的接口类,标签id为接口类中的方法名) User为实体对象类 UserDao为 ...