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

相关推荐
BD_Marathon2 分钟前
【JavaWeb】Tomcat_部署项目方式
java·tomcat
倔强的小石头_4 分钟前
Python 从入门到实战(六):字典(关联数据的 “高效管家”)
java·服务器·python
毕设源码-郭学长4 分钟前
【开题答辩全过程】以 个性化电影推荐系统为例,包含答辩的问题和答案
java
500847 分钟前
存量 Flutter 项目鸿蒙化:模块化拆分与插件替换实战
java·人工智能·flutter·华为·ocr
Tao____16 分钟前
基于若依RuoYi框架开发的物联网平台
java·物联网·mqtt·ruoyi·设备对接
caterpillar17 分钟前
Spring Method Agent:一款无侵入的Spring方法级调试神器
java
程序员西西18 分钟前
深入探索 Spring Boot3 中 Profiles 多环境配置
java·后端·架构
斯班奇的好朋友阿法法22 分钟前
JAVA映射实体类对象和LIst
java·python·list
yyovoll22 分钟前
java线程知识点介绍1
java·开发语言
一念一花一世界28 分钟前
Arbess从基础到实践(5) - 集成GitLab+SonarQube搭建Java项目自动化部署
java·gitlab·sonarqube·cicd·arbess