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接口即可。在多线程消费场景下,一个线程只去消费一个队列上的消息,那么自然就保证了消息消费的顺序性,同时也保证了多个线程之间的并发性。

相关推荐
杀死那个蝈坦4 分钟前
Docker
java·docker·eclipse·tomcat·hibernate
a3158238064 分钟前
Android13隐藏某个App需要关注的源码文件
android·java·framework·launcher3·隐藏app
悟空码字11 分钟前
SpringBoot实现消息推送:让服务器学会“主动搭讪”
java·spring boot·后端
蒟蒻小袁18 分钟前
Hot100--找到字符串中所有字母异位词
java·算法·leetcode·面试
+VX:Fegn089528 分钟前
人力资源管理|基于springboot + vue人力资源管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
即随本心0.o37 分钟前
SSE服务搭建
java·spring boot
MarkHD38 分钟前
车辆TBOX科普 第56次 从模块拼接到可靠交付的实战指南
java·开发语言
灰什么鱼40 分钟前
OkHttp + Retrofit2 调用第三方接口完整教程(以nomad为例)
java·spring boot·okhttp·retrofit
掘金-我是哪吒1 小时前
第378集设备服务接入系统Java微服务后端架构实战
java·开发语言·spring·微服务·架构