
在电商、金融等场景中,消息的顺序性直接决定业务逻辑的正确性。比如用户下单后,必须依次处理"扣库存 → 加积分 → 生成物流单",顺序颠倒可能导致超卖或积分错误。本文用通俗易懂的方式,拆解消息有序性的核心原理。
在分布式系统中,消息乱序几乎是"默认状态"。原因有三:
乱序原因 | 说明 |
|---|---|
多分区/多队列 | 同一业务的消息被分散到不同队列,各队列独立处理 |
并发消费 | 多个消费者并行拉取消息,处理速度不同步 |
网络重试 | 消息重试时可能被插入队列尾部,打乱原有顺序 |

所有消息严格按照**先进先出(FIFO)**处理。实现简单,但性能极差——只能单队列、单线程,吞吐量成为瓶颈。
适用场景:对顺序要求极度严格且并发量极低的场景,如金融核心的撮合交易。
将消息按**业务标识(如订单ID、用户ID)**分组,同一组内的消息保证顺序,不同组之间无需保证顺序。
核心公式:
Queue = hash(业务Key) % 队列总数这样既能保证业务层面的顺序,又能通过多队列并行提升吞吐量。

Kafka 的同一个 Partition 内消息天然有序。保证顺序的关键是:让相同 Key 的消息落入同一个 Partition。
// 生产者:指定 Key,确保同一订单的消息进入同一 Partition
ProducerRecord<String, String> record = new ProducerRecord<>(
"order-topic", // topic
orderId, // key(关键!相同 key 进入同一 partition)
messageBody // value
);
producer.send(record);消费端注意:一个 Partition 只能被一个 Consumer 消费,Consumer Group 内的消费者数量不要超过 Partition 数量。
RocketMQ 通过 MessageGroup(或 ShardingKey)实现分区顺序。相同 MessageGroup 的消息会被路由到同一个 MessageQueue。
// 生产者:使用 MessageQueueSelector 按订单ID路由
SendResult sendResult = producer.send(msg, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
Long orderId = (Long) arg;
// 相同 orderId 的消息进入同一个队列
int index = (int) (orderId % mqs.size());
return mqs.get(index);
}
}, orderId); // arg 传入 orderId// 消费者:使用顺序消费监听器
consumer.registerMessageListener(new MessageListenerOrderly() {
@Override
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
for (MessageExt msg : msgs) {
// 按顺序逐条处理
processOrderMessage(msg);
}
return ConsumeOrderlyStatus.SUCCESS;
}
});阿里云 RocketMQ 官方文档强调:顺序消息需要单一生产者 + 串行发送,多线程并发发送无法保证顺序。
RabbitMQ 的队列本身就是 FIFO 的,但多个消费者并发消费时会破坏顺序。保证顺序的方案:
消息有序性需要从生产、存储、消费三个阶段协同保证:
方案 | 顺序性 | 吞吐量 | 适用场景 |
|---|---|---|---|
全局顺序 | ⭐⭐⭐ | ⭐ | 撮合交易、库存扣减 |
分区顺序 | ⭐⭐ | ⭐⭐⭐ | 订单状态流转、用户消息 |
无序+幂等 | ⭐ | ⭐⭐⭐⭐⭐ | 日志收集、通知推送 |
工程实践建议:绝大多数业务采用分区顺序即可满足需求。如果业务对顺序要求不极端严格,也可以采用无序消息 + 幂等性 + 业务层排序的组合方案,换取更高的吞吐量。
Q:我已经按 Key 路由了,为什么还是乱序?
检查以下几点:
Q:顺序消息消费太慢怎么办?
保证消息有序性的核心思路可以总结为一句话:
同一业务标识 → 同一队列/分区 → 单线程串行处理
理解了这个链路,无论使用 Kafka、RocketMQ 还是 RabbitMQ,都能因地制宜地设计出合适的顺序消息方案。
下载本文配图: