200/s
the ceiling of one globally ordered lane
At 5 ms a message, one lane handles 1 ÷ 0.005 s, however many machines you own. A 40,000-a-second sale needs 200 lanes.
Order per key, one lane per order, lanes in parallel
A1 never overtakes A2, but orders A and B interleave freely. That is all the business needed.
“Kafka is ordered”?
Bad: Kafka is ordered
Only within a partition, and a thread pool after poll() scrambles even that.
Good: Order per key
Key payment events by payment ID for order per payment and 48-way parallelism.
Per-key order rests on three rules
- Same key, same lane
- Each lane is first in, first out
- One message per key in flight at a time
- Most real ordering bugs break the third rule
You take a keyed Kafka topic from 12 to 16 partitions.
The catch
About 75% of keys move. Their old events sit in one partition and new ones in another, read at different speeds.
One poison refund stops its whole lane
Dead-lettering it lets later events overtake it. For money and stock, park the key, holding it and its later messages while others flow.
When order slips anyway, version every event
Stored at v7, a late v6 is skipped, v8 is applied, and a v9 arriving before v8 waits. Use versions, not timestamps.
Remember
Ask for order per key, not globally. One lane and one reader per key; park stuck keys; version every event.