Skip to content

顺序矩阵

本页结论:四个产品都只提供「某个单元内有序」——RabbitMQ 单队列、Kafka 分区、RocketMQ MessageGroup、Pulsar 分区+订阅类型;全局顺序只能靠单一顺序单元 + 单消费者换来,且失败重试会不同程度地破坏顺序。

覆盖 spec §8.2「顺序与回放矩阵」的顺序部分。版本基线与标记规则见矩阵总览(checkedAt: 2026-08-19)。

最小顺序单元

能力RabbitMQKafkaRocketMQPulsar
局部顺序单元✅ 单个 Queue 内 FIFO:入队顺序即投递顺序(routing✅ 单个 Partition 内按 offset 严格有序(routing✅ FIFO 消息按 MessageGroup:同组有序,组间无序(routing✅ 分区内有序;消费侧取决于订阅类型:Key_Shared 同 key 有序,Exclusive/Failover 分区级有序(routing
同业务 Key 聚到同一单元🔧 把 key 编入 routing key + 绑定规则,属使用约定(routing✅ partition key 哈希,同 key 必进同一分区(routing✅ 发送时指定 MessageGroup(如 orderId)(routing✅ 分区 key 哈希 + Key_Shared 按 key 绑定消费者(routing
全局顺序🔧 只用一个队列 + 单消费者,牺牲全部并行(pitfalls🔧 单分区 Topic + 单消费者,牺牲全部并行(pitfalls🔧 单 MessageQueue + 顺序消费单线程,牺牲并行(pitfalls🔧 单分区 Topic + Exclusive 单消费者(pitfalls

「Kafka 保证全局顺序」是禁止表述;「单分区/单队列内顺序」也不等于端到端业务完成顺序——业务处理失败重试后,完成顺序仍可能变化。

失败与重试对顺序的影响

场景RabbitMQKafkaRocketMQPulsar
消费失败后的顺序🔧 nack+requeue 会把消息重新排入队列,打破原 FIFO;TTL+DLX 重试同样使消息乱序重入(reliability✅ Broker 不重投:失败后从已提交位点重读,分区内顺序保持,但可能重复处理(reliability✅ FIFO 消费失败会挂起该顺序组等待重试,保序但可能阻塞后续同组消息;普通消息失败进重试队列,不阻塞但乱序(reliability🔧 Shared 重投可能换消费者、乱序;Key_Shared 同 key 重投仍绑定同一 key 的顺序约束;Exclusive/Failover 顺序保持(reliability
生产者发送重试与乱序🔧 无内置发送排序保证,乱序风险需业务容忍或串行发送(pitfalls✅ 幂等 Producer(enable.idempotence=true)保证重试写入不打乱分区内顺序(reliability🔧 需 FIFO 发送语义配合(同 MessageGroup 串行确认),乱发则无保序(reliability🔧 同分区并发发送可能乱序,需同 key 串行发送或顺序保证配置(pitfalls
毒消息对顺序的阻塞🔧 队头毒消息反复 requeue 会卡住整个队列(labs✅ 位点继续前移由应用决定:跳过则不阻塞,重试则整分区暂停(reliability🔧 FIFO 队列中一条坏消息挂起整组,需人工介入或跳过策略(pitfalls🔧 Key_Shared 下一个 key 反复失败会卡住该 key 的消息流(pitfalls

消费并行与顺序的互斥

顺序与并行天然互斥:同一顺序单元内只能串行消费。

产品并行上限顺序代价
RabbitMQ🔧 队列数 × 每队列消费者数:并行靠拆分队列手动获得(routing需要某 key 有序时只能让该 key 独占一个队列
Kafka✅ Consumer Group 内消费者数 ≤ 分区数:并行度由分区数原生决定(routing同 key 消息集中在一个分区,热点 key 无法再拆分(routing
RocketMQ✅ 队列数与消费线程数:集群消费模式组内分担队列(routingFIFO 消费下同一 MessageGroup 串行,挂起会放大延迟
Pulsar✅ 取决于订阅类型:Shared 最自由、Key_Shared 按 key 并行、Exclusive/Failover 单活(routingKey_Shared 在 key 倾斜时出现消费者负载不均

脚注:同名异义

  • 「分区」:Kafka/Pulsar 的 Partition 是顺序、并行与复制的基本单位;RocketMQ 的 MessageQueue 是消费视角的逻辑队列(写入先进共享 CommitLog,索引按队列组织);RabbitMQ 队列没有分区概念,「分区」一词不适用。
  • 「MessageGroup vs partition key」:RocketMQ MessageGroup 是逐条消息显式指定的顺序组标签,可以多个组映射到同一队列;Kafka partition key 通过哈希决定分区,key 与分区是固定映射。两者都能实现「同 orderId 有序」,但粒度与映射方式不同。
  • 「有序消费」:RocketMQ 的 FIFO 消息类型是 Topic 级约束(该 Topic 只收 FIFO 消息);Pulsar 的顺序由订阅类型决定,同一 Topic 上不同订阅可以有不同顺序语义。

相关页面

以统一实验验证消息系统语义边界