很多人说“Kafka 有顺序”,这句话不完整。
完整说法应该是:
Kafka 只保证单分区内的写入顺序与读取顺序。
#如果你要“订单维度有序”
正确做法通常是:
- 把
orderId当 key - 让同一个订单的所有事件打到同一个 partition
例如:
producer.send(new ProducerRecord<>("order-events", orderId, eventJson));这样同一个 orderId 的事件,大概率会按同一分区顺序排下去。
#如果你要“整个系统全局有序”
代价会非常大,通常意味着:
- 只用一个 partition
- 或者自己做更重的顺序控制
但一旦只有一个 partition,并行能力就会明显下降。
所以顺序和吞吐,本质上是交换关系:
更强的全局顺序
=
更弱的并行扩展性#一个实用判断
- 需要“同一用户 / 同一订单 / 同一账户”局部有序:Kafka 很适合
- 需要“整个 topic 所有事件绝对全局有序”:Kafka 不擅长,或者代价很高