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

相关推荐
FAFU_kyp8 分钟前
Java基础与核心知识面试题逐字稿模板
java
程序员西西12 分钟前
深入剖析 Java 中的 ZGC 机制:原理、优势与实践
java·后端·算法
月明长歌14 分钟前
【码道初阶】Leetcode.189 轮转数组:不熟悉ArrayList时踩得坑,被Arraylist初始化骗了?
java·算法·leetcode·职场和发展
BBB努力学习程序设计15 分钟前
Java设计模式实战指南:创建型模式深度解析
java
BBB努力学习程序设计16 分钟前
Java内存管理与JVM调优完全指南
java
编程火箭车24 分钟前
【Java SE 基础学习打卡】22 分支结构 - if
java·流程控制·编程基础·if语句·分支结构·条件判断·新手避坑
Ivy_belief24 分钟前
C++新特性汇总:涵盖C++11到C++23
java·c++·c++11·c++23
哈哈哈笑什么29 分钟前
Spring Boot接口国际化异常信息方案
java·spring boot·后端
qq_1629876930 分钟前
SpringBoot框架选型
java·spring boot·后端
爱学习的小可爱卢38 分钟前
JavaEE进阶-SpringBoot三层架构:餐厅模式解析
java·java-ee