v1.4 adds the transactions module to the Kafka Simulator — 10 new scenarios on the topic engineers most often nod along to and least often actually see: exactly-once semantics. The curriculum reaches 55 of 125.
What’s in v1.4
Transactions turn a stream of writes into an atomic unit, and they change what a consumer is allowed to see:
read_committedand the last stable offset (LSO) — why a transactional consumer reads up to the LSO rather than the high watermark, and how an open transaction holds that ceiling in place.- begin / commit / abort — the producer transaction lifecycle as a state machine you can drive, including what an abort marker does to the records it covers.
- The consume–process–produce loop —
sendOffsetsToTransaction, and why committing offsets inside the transaction is what makes end-to-end exactly-once real. - Fencing — how a zombie producer gets fenced by epoch, and why that is the safety net under the whole model.
Exactly-once is hard to teach because so much of it is invisible: markers, the LSO, epochs, and a consumer that quietly skips aborted records. The simulator puts all of it on the timeline — you can watch the LSO sit still under an open transaction and jump forward the moment it commits.
New cluster type in free play: active/active
Continuing the topology ladder that started with active/passive in v1.3, the free-play cluster picker gains a third shape: Active / active — two regions, both accepting writes, each mirroring to the other.
It is deliberately not “active/passive with the arrow doubled”. The preset is symmetric:
- Each region owns its own topic.
westownswest.orders,eastownseast.orders, and each is mirrored read-only into the other region — so both sides hold the whole stream with no same-name ambiguity about who may write what. - Each region writes locally and reads globally. A producer only ever appends to its own region’s topic; each region’s consumer group reads both the local topic and the mirrored-in copy, so every record is seen once per side.
- Each region is its own cluster. Both run an independent KRaft quorum, so you can kill one region’s controllers — or the whole region — and watch what the surviving side can and cannot do.
That last point is the pointed contrast with the transactional guarantees this pack teaches: exactly-once is a per-cluster promise, and an active/active pair is two clusters. Everything the transactions module gives you holds inside one region and stops at the mirror.
The DR curriculum that explains these shapes still lands in v1.8 — the sandboxes arrive first, on purpose, so you have somewhere to try the ideas before the scenarios narrate them.
Building on replication
This pack sits directly on v1.3. A transaction is a durability guarantee with atomicity added on top, so the ISR and high watermark you learned to read there are still the ground truth here — the LSO is simply a stricter ceiling above them.
Open the simulator, begin a transaction, produce into it, and abort — then watch what a read_committed consumer does and does not see.