Kafka是大型架构核心,下面我详解Kafka如何保证消息顺序@mikechen
单分区全局有序(最简单,牺牲吞吐)
Kafka 保证顺序的首要前提,是同一个分区内的消息写入和读取是有序的。

Kafka 的消息在分区内按追加写入方式存储,消息会按照写入时间顺序依次排列,消费者拉取时也会按 offset 顺序读取。
因此,只要业务上的同一类消息始终落在同一分区,就能够天然保持顺序。
一个 Topic 只创建一个 Partition,所有消息都写入该分区,Kafka 天然保证顺序。
// 生产者
props.put("max.in.flight.requests.per.connection", 1); // 关键!!!
// Topic 创建
kafka-topics.sh --create --topic order-topic --partitions 1 --replication-factor 3
优缺点:实现简单,无需额外逻辑。
但完全丧失 Kafka 的并行优势(生产/消费无法水平扩展)。
适用场景:对全局顺序要求极高、吞吐量不大的场景(如日志严格时序、单一业务线)。
Key 路由 + 同分区方案(局部顺序,推荐主流方案)
常见做法是按照业务主键进行分区,例如使用订单 ID、用户 ID 或设备 ID 作为 key。

Kafka 默认会根据 key 的哈希值决定消息进入哪个分区,这样同一个 key 的消息通常会被路由到固定分区,从而保证该 key 维度上的有序性。
对于需要严格顺序的业务,应尽量避免使用轮询分区策略,因为轮询会将消息分散到不同分区,难以维持顺序。
ProducerRecord<String, String> record = new ProducerRecord<>("topic", "order-123", "支付成功"); // Key 为 order-123
producer.send(record);
支持多 Partition 提升整体吞吐量,同时保证业务局部有序。
适用场景:大多数业务场景(如同一订单的状态流转:创建→支付→发货,必须严格顺序;不同订单可并行)。