0Pricing
Advanced Spring Boot 4: Event-Driven Architecture (Kafka) · Lekcja

Wzorzec transakcyjnej skrzynki nadawczej

Dowiedzą się Państwo, jak wzorzec transactional outbox niezawodnie łączy transakcję bazy danych z publikowaniem do Kafka, unikając niespójności podwójnego zapisu w Spring Boot.

Wzorzec transakcyjnej skrzynki nadawczej to bezpłatna lekcja Advanced Spring Boot 4: Event-Driven Architecture (Kafka) na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Advanced Spring Boot 4: Event-Driven Architecture (Kafka), a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Advanced Spring Boot 4: Event-Driven Architecture (Kafka) zawiera 4 lekcji w sumie.

Części tej lekcji nie zostały jeszcze przetłumaczone i są wyświetlane po angielsku.

The Dual-Write Problem

A common bug: a service updates its database and publishes a Kafka event in two separate operations. If one succeeds and the other fails, the system becomes inconsistent.

The transactional outbox pattern eliminates this risk.

Core Idea

Instead of publishing directly, write the event into an outbox table within the same database transaction as your business change.

A separate process then reads the outbox and publishes to Kafka.

The Outbox Table

The outbox table stores serialized events plus metadata.

CREATE TABLE outbox (
  id UUID PRIMARY KEY,
  aggregate_type VARCHAR(255),
  aggregate_id VARCHAR(255),
  event_type VARCHAR(255),
  payload JSONB,
  created_at TIMESTAMP DEFAULT now(),
  published BOOLEAN DEFAULT false
);

Writing in One Transaction

Both the domain entity and the outbox row are saved inside one @Transactional method, so they commit or roll back together.

@Transactional
public void placeOrder(Order order) {
    orderRepository.save(order);
    outboxRepository.save(OutboxEvent.from(order));
}

Atomicity Guarantee

Because both writes share the database transaction, there is no window where the order exists without its event recorded. This is the key correctness property.

The Relay Process

A background relay polls unpublished outbox rows and sends them to Kafka, marking them published on success.

@Scheduled(fixedDelay = 500)
public void relay() {
    for (OutboxEvent e : outboxRepository.findUnpublished()) {
        kafkaTemplate.send(e.getTopic(), e.getPayload());
        e.markPublished();
    }
}

At-Least-Once Publishing

If the relay crashes after sending but before marking published, the event is sent again. Consumers must therefore be idempotent, often using the event id as a dedup key.

Change Data Capture Alternative

Instead of polling, tools like Debezium tail the database transaction log and stream outbox inserts to Kafka automatically — lower latency and no polling load.

Cleaning Up the Outbox

Periodically delete or archive published rows to keep the table small and queries fast.

DELETE FROM outbox WHERE published = true AND created_at < now() - INTERVAL '7 days';

When to Use It

Use the outbox when you must keep a database state change and an event publication consistent. It is simpler and more portable than spanning a Kafka transaction across an external database.

Putting It Together

The outbox pattern turns two unreliable writes into one atomic database commit plus a reliable relay. Combine it with idempotent consumers for end-to-end consistency.

Quick Check

Test your understanding of the outbox pattern.

Recap

You learned the transactional outbox pattern.

  • Avoids dual-write inconsistency by using one DB transaction.
  • An outbox table stores pending events.
  • A relay (polling or CDC) publishes to Kafka.
  • Consumers must be idempotent due to at-least-once delivery.

Często zadawane pytania

Czy lekcja „Wzorzec transakcyjnej skrzynki nadawczej” jest bezpłatna?

Tak — pełny tekst „Wzorzec transakcyjnej skrzynki nadawczej” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Advanced Spring Boot 4: Event-Driven Architecture (Kafka), przejdź na CoddyKit PRO. Kurs Advanced Spring Boot 4: Event-Driven Architecture (Kafka) zawiera 4 lekcji w sumie.

Co nauczysz się w „Wzorzec transakcyjnej skrzynki nadawczej”?

Dowiedzą się Państwo, jak wzorzec transactional outbox niezawodnie łączy transakcję bazy danych z publikowaniem do Kafka, unikając niespójności podwójnego zapisu w Spring Boot. Ćwiczysz Advanced Spring Boot 4: Event-Driven Architecture (Kafka) z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Advanced Spring Boot 4: Event-Driven Architecture (Kafka)?

Nie wymagamy żadnego doświadczenia. Advanced Spring Boot 4: Event-Driven Architecture (Kafka) w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Wzorzec transakcyjnej skrzynki nadawczej”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Advanced Spring Boot 4: Event-Driven Architecture (Kafka)?

Tak. Każda lekcja Advanced Spring Boot 4: Event-Driven Architecture (Kafka) zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Zrozumienie transakcji Kafki
  2. Implementowanie producentów transakcyjnych
  3. Semantyka przetwarzania dokładnie raz
  4. Wzorzec transakcyjnej skrzynki nadawczej
← Powrót do Advanced Spring Boot 4: Event-Driven Architecture (Kafka)