---
title: "Kafka Simulator v1.4 — delivery semantics, transactions and active/active"
date: 2026-08-24T00:00:00.000Z
author: "michal"
excerpt: "Exactly-once, read_committed and the last stable offset, begin/commit/abort, and the consume–process–produce loop. The transactions module makes EOS — Kafka's hardest topic — something you can step through. Free play also gains a new cluster type: active/active."
---
v1.4 adds the **transactions** module to the [Kafka Simulator](/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_committed` and 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.** `west` owns `west.orders`, `east` owns `east.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](/kafka-simulator/), begin a transaction, produce into it, and abort — then watch what a `read_committed` consumer does and does not see.