消息顺序

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;
    }
});
相关推荐
云水初1 小时前
【项目篇】基于LanGraph的自动处理客服邮件的 Agent汇总
开发语言·笔记·python·学习·fastapi·langgraph
茉莉玫瑰花茶1 小时前
GO [ 内存与变量逃逸分析 ]
开发语言·后端·golang
我命由我123451 小时前
SQL 检测脚本
java·数据库·sql·功能测试·单元测试·压力测试·可用性测试
lhh_qrsly2 小时前
OTA 加密完整方案(嵌入式 IoT 常用)
开发语言·物联网·php
Nontee2 小时前
Quartz 新手入门:定时任务的两个承诺
开发语言·windows·python
Hpc_Fun2 小时前
GPU 工作站品牌怎么比?五把可核验尺子、加权评分脚本与场景重排
java·信创·gpu工作站·品牌对比·加权评分
const_qiu2 小时前
第四章 03:4.3 Tools —— 让 Agent 会用工具
java·人工智能
Rain的Java大神之路2 小时前
百万并发直播弹幕系统设计全解:看懂了扇出,你就看懂了高并发的八成
java·后端·面试
\光辉岁月/2 小时前
2.异常类
java·开发语言·异常类