全书目录

第二十篇:Kafka 完全指南 —— 城市事件广播总线宇宙

第七章:顺序性与分区 —— Kafka 的顺序从来不是免费的

1 分钟 350 字 第 374 / 962 个阅读单元

很多人说“Kafka 有顺序”,这句话不完整。

完整说法应该是:

Kafka 只保证单分区内的写入顺序与读取顺序。

#如果你要“订单维度有序”

正确做法通常是:

  • orderId 当 key
  • 让同一个订单的所有事件打到同一个 partition

例如:

java
producer.send(new ProducerRecord<>("order-events", orderId, eventJson));

这样同一个 orderId 的事件,大概率会按同一分区顺序排下去。

#如果你要“整个系统全局有序”

代价会非常大,通常意味着:

  • 只用一个 partition
  • 或者自己做更重的顺序控制

但一旦只有一个 partition,并行能力就会明显下降。

所以顺序和吞吐,本质上是交换关系:

text
更强的全局顺序
=
更弱的并行扩展性
#一个实用判断
  • 需要“同一用户 / 同一订单 / 同一账户”局部有序:Kafka 很适合
  • 需要“整个 topic 所有事件绝对全局有序”:Kafka 不擅长,或者代价很高