消息顺序

RocketMQ 中消息错乱的核心原因:多队列并发消费破坏了消息的顺序性。

Topic A 下有多个队列(queue0/1/2),生产端默认会把消息分散发送到不同队列(比如 "创建 1" 发 queue0、"付款 2" 发 queue1、"推送 3" 发 queue2)。

同一业务 流程的有序消息被分散到了 多个队列 ,多队列并发消费导致顺序错乱。

理想状态

这样就有序了 实现队列内有序 队列外无序

复制代码
//正确的发送 队列选择器
for (OrderStep orderStep : orderList) {
    Message message = new Message(topic:"topic12", tags:"tag1", orderStep.toString().getBytes());
    SendResult sendResult = producer.send(message, new MessageQueueSelector() {
        //队列选择的方法
        @Override
        public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
            //确定orderId(1,3,1000,20000) 对应 确定的队列(queue0 1 2 3)
            //队列数
            int size = mqs.size();
            //获取
            int orderId = (int)(orderStep.getOrderId());
            int i = orderId % size; //0 1 2
            //取出确定的队列
            MessageQueue messageQueue = mqs.get(i);
            return messageQueue;
        }
    }, arg:null);
}

//消费者 起一个 顺序监听, 一个线程, 只监听一个queue
consumer.registerMessageListener(new MessageListenerOrderly() {
    @Override
    public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
        //写我们的业务逻辑
        for (MessageExt msg : msgs) {
            System.out.println(msg);
            byte[] body = msg.getBody();
            System.out.println(new String(body));
        }
        return ConsumeOrderlyStatus.SUCCESS;
    }
});
相关推荐
Sakura_j_h_5 小时前
从零写一个 MCP stdio Server:用 Python 校验博客文章格式
开发语言·python·自动化·ai工具·mcp·json-rpc
装不满的克莱因瓶6 小时前
【SpringAI Alibaba】ReactAgent记忆管理MessageTrimmingHook与MessageDeletionHook
java·人工智能·ai·ai编程·springai·springaialibaba
文丑颜不良啊6 小时前
LeetCode2241~2260题目解析
java·leetcode
文丑颜不良啊6 小时前
LeetCode2321~2340题目解析
java·leetcode
驭渊的小故事7 小时前
Spring AOP 核心概念与通知类型详解
java·后端·spring
vipxieliang7 小时前
ValidX vs 手写验证代码:开发效率对比实测
java·spring boot·后端
白杨尚青7 小时前
C++进阶篇(五):红黑树——四条规则、三种插入情况与旋转变色
开发语言·数据结构·c++·stl·红黑树·平衡二叉树
vipxieliang7 小时前
虚拟线程与 GraalVM:Spring Boot 3.x 云原生性能跃迁
java·spring boot·后端
Rain的Java大神之路7 小时前
面试官最烦的答案:“我用 Redis + Token”!接口幂等 8 种方案 + 四层防御,把重复扣款工单干到 0
java·后端·面试
.道阻且长.7 小时前
Linux基本开发工具:gdb和cgdb的使用
linux·运维·服务器·开发语言