Kafka 顺序消息实战:同一个订单的消息必须按序消费——分区键设计+单分区单消费者
引言 去年大促当晚 21:47,客诉群炸了: "我明明付了钱,订单还是显示待支付!" 更离谱的是有用户截图:已经发货的订单,状态被改回了"待支付"。 排查 40 分钟后真相大白:订单状态流转靠 Kafka 消息驱动,order.created、order.paid、order.shipped 三个事件发到一个 32 分区的 Topic 上——发消息时压根没传 key。Kafka 默认分区策略把同一个订单的三个事件轮询(3.3+ 是粘性策略)散到了不同分区,各分区消费进度不一,paid 比 created 早了 400ms 被消费。消费端逻辑是"收到什么事件就改成什么状态",于是刚付完款,一条迟到的 created 把状态从"已支付"打回了"待支付"。 当晚 6700 笔订单触发"状态回退"告警,客诉 300+。修完这个事故,团队对 Kafka 顺序的理解被彻底刷新: 以为"Kafka 天然有序"——错,Kafka 只保证单分区内有序,分区之间谁先谁后它管不着 以为"加了分区就更快"——对,但分区越多,没做分区键设计的消息散得越开,乱序概率越高 以为"消息按序到了就稳了"——错,消....