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

相关推荐
ArabySide1 分钟前
【Java Web】过滤器的核心原理、实现与执行顺序配置
java·spring boot·java-ee
稚辉君.MCA_P8_Java5 分钟前
Gemini永久会员 Java 返回最长有效子串长度
java·数据结构·后端·算法
我超级能吃的14 分钟前
线程池核心原理及使用
java·开发语言
路边草随风19 分钟前
java 实现 flink 读 kafka 写 delta
java·大数据·flink·kafka
逆风局?19 分钟前
后端Web实战(部门管理)——日志技术
java·前端
小马爱打代码23 分钟前
Spring AI:ChatClient实现对话效果
java·人工智能·spring
zzhongcy26 分钟前
RocketMQ、Kafka 和 RabbitMQ 等中间件对比
kafka·rabbitmq·rocketmq
无敌最俊朗@28 分钟前
C++ 内存管理与编译原理 (面试复习2)
java·开发语言·jvm
赴前尘32 分钟前
docker 配置ipv6地址
java·docker·容器
开开心心就好34 分钟前
图片批量压缩工具:支持有损无损两种模式
java·游戏·pdf·excel·散列表·启发式算法·1024程序员节