---
title: "Symulator Kafki v1.4 — semantyka dostarczania, transakcje i active/active"
date: 2026-08-24T00:00:00.000Z
author: "michal"
excerpt: "Exactly-once, read_committed i last stable offset, begin/commit/abort oraz pętla consume–process–produce. Moduł transakcji sprawia, że EOS — najtrudniejszy temat Kafki — można przejść krok po kroku. Free play zyskuje też nowy typ klastra: active/active."
---
Wydanie v1.4 dodaje do [Symulatora Kafki](/kafka-simulator/) moduł **transakcji** — **10 nowych scenariuszy** o temacie, przy którym inżynierowie najczęściej kiwają głową ze zrozumieniem, a najrzadziej naprawdę go widzą: o semantyce exactly-once. Program sięga **55 ze 125**.

## Co jest w v1.4

Transakcje zamieniają strumień zapisów w jednostkę atomową — i zmieniają to, co konsumentowi wolno w ogóle zobaczyć:

- **`read_committed` i last stable offset (LSO)** — dlaczego konsument transakcyjny czyta do LSO, a nie do high watermark, i w jaki sposób otwarta transakcja trzyma ten sufit w miejscu.
- **begin / commit / abort** — cykl życia transakcji producenta jako maszyna stanów, którą sam prowadzisz, łącznie z tym, co znacznik abort robi z objętymi nim rekordami.
- **Pętla consume–process–produce** — `sendOffsetsToTransaction` i dlaczego dopiero commit offsetów *wewnątrz* transakcji czyni exactly-once od końca do końca realnym.
- **Fencing** — jak producent-zombie zostaje odcięty przez epokę i dlaczego to jest siatka bezpieczeństwa pod całym modelem.

Exactly-once trudno się uczy, bo tak wiele w nim pozostaje niewidoczne: znaczniki, LSO, epoki i konsument, który po cichu pomija przerwane rekordy. Symulator kładzie to wszystko na osi czasu — możesz patrzeć, jak LSO stoi w miejscu pod otwartą transakcją i skacze do przodu w chwili, gdy ta się zatwierdza.

## Nowy typ klastra we free play: active/active

Drabina topologii, która zaczęła się w v1.3 od active/passive, rośnie dalej: wybór klastra we free play zyskuje trzeci kształt — **Active / active**: dwa regiony, oba przyjmują zapisy i każdy replikuje do drugiego.

To celowo nie jest „active/passive z podwojoną strzałką". Ten preset jest *symetryczny*:

- **Każdy region ma własny temat.** `west` jest właścicielem `west.orders`, `east` — `east.orders`, a każdy z nich jest replikowany tylko do odczytu do drugiego regionu, więc obie strony trzymają cały strumień bez dwuznaczności, kto może pisać pod tą samą nazwą.
- **Każdy region pisze lokalnie, a czyta globalnie.** Producent dopisuje wyłącznie do tematu własnego regionu; grupa konsumentów każdego regionu czyta zarówno temat lokalny, jak i lustrzaną kopię tego drugiego, więc każdy rekord jest widziany raz na stronę.
- **Każdy region jest osobnym klastrem.** Oba prowadzą niezależne kworum KRaft — możesz więc ubić kontrolery jednego regionu (albo cały region) i zobaczyć, co strona, która przetrwała, potrafi, a czego nie.

I właśnie ten ostatni punkt jest wyrazistym kontrastem wobec gwarancji transakcyjnych, których uczy ten pakiet: exactly-once to obietnica *w obrębie jednego klastra*, a para active/active to dwa klastry. Wszystko, co daje moduł transakcji, obowiązuje wewnątrz jednego regionu i kończy się na mirrorze.

*Program* DR, który tłumaczy te kształty, nadal pojawi się dopiero w v1.8 — piaskownice lądują najpierw celowo, żeby było gdzie wypróbować te pomysły, zanim scenariusze je opowiedzą.

## Nadbudowa nad replikacją

Ten pakiet stoi wprost na v1.3. Transakcja to gwarancja trwałości z dołożoną atomowością, więc ISR i high watermark, poznane tam wcześniej, wciąż są tutaj gruntem — LSO jest po prostu ostrzejszym sufitem ponad nimi.

Otwórz [symulator](/kafka-simulator/), rozpocznij transakcję, wyprodukuj do niej i przerwij ją — a potem zobacz, co konsument `read_committed` widzi, a czego nie.