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;
}
});