RocketMQ顺序消费

根据公司项目的一个使用场景,针对实时预警任务,会有同时消费某个设备正常或异常的事件,而这类事件具有时间维度上的先后性,需要符合先进先出(FIFO)原则进行发布和消费,而MQ消费为了吞吐量基本会使用多线程消费,RocketMQ也会分为多个消息队列,会造成消费无序的情况,这时候为了综合兼顾顺序消费+性能的考虑,可以使用分区顺序消息的策略。

生产顺序性

发送时将Sharding Key相同(例如同一设备)的消息路由到一个队列中。这样保证同一队列中消息的时序性。

部分代码参考如下:

asyncSendOrderly方法中的hashKey就是选择队列

复制代码
@param hashKey use this key to select queue. for example: orderId, productId ...
java 复制代码
    @Resource
    private RocketMQTemplate rocketMQTemplate;
    
    rocketMQTemplate.asyncSendOrderly(destination, msg, deviceStatusInfoDTO.getDeviceId() + ":" + deviceStatusInfoDTO.getDeviceUniqueCode() + ":" + deviceStatusInfoDTO.getShopCode(), new SendCallback() {
                @Override
                public void onSuccess(SendResult sendResult) {
                    
                }

                @Override
                public void onException(Throwable e) {
                }
            });

消费顺序性

顺序消费的Class实现MessageListenerOrderly接口即可。在多线程消费场景下,一个线程只去消费一个队列上的消息,那么自然就保证了消息消费的顺序性,同时也保证了多个线程之间的并发性。

相关推荐
hujinyuan2016012 分钟前
2026年3月 中国电子学会青少年软件编程(Python)三级考试试卷 真题及答案
java·python·算法
basketball61628 分钟前
C++ 高级编程:2. 基本线程池实现
java·开发语言·c++
MageGojo1 小时前
天气 API 接入实战:基于 ApiZero 实现实时天气、分钟级降水和 15 天预报查询
java·后端·spring·api 接口接入·接口实战
自动跟随1 小时前
UWB自动跟随技术全栈解析:从定位算法到“位控一体化“
java·网络·人工智能
喜欢打篮球的普通人1 小时前
LLVM 后端流程与关键数据结构:从 IR 到机器码的入门笔记
java·数据结构·笔记
弹简特1 小时前
【Java项目-轻聊】07-实现主页面模块
java·开发语言
wuminyu1 小时前
Java锁机制之轻量级锁判断与尝试逻辑源码剖析
java·linux·c语言·jvm·c++
Misnearch1 小时前
1、数组/字符串
java·数据结构·算法
☆cwlulu1 小时前
Linux系统调用与C库I/O的底层奥秘
java·spring boot·spring
不惑_2 小时前
手摸手教你在腾讯云CVM搭建RocketMQ
云计算·rocketmq·腾讯云