0Pricing
RabbitMQ Messaging & Async Systems · Lekcja

Wzorzec Outbox dla niezawodnego publikowania

Poznaj transakcyjny wzorzec outbox, który pozwala atomowo zatwierdzać stan biznesowy i wiadomości wychodzące, eliminując problem podwójnego zapisu w systemach sterowanych zdarzeniami.

Wzorzec Outbox dla niezawodnego publikowania to bezpłatna lekcja RabbitMQ Messaging & Async Systems 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 RabbitMQ Messaging & Async Systems, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs RabbitMQ Messaging & Async Systems 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

Saving to a database and publishing to RabbitMQ are two separate operations. If one succeeds and the other fails, your state and your events drift apart.

This is the dual-write problem.

What Is the Outbox Pattern?

The outbox pattern writes the business change and the outgoing message into the same database transaction, then publishes the message asynchronously from the outbox table.

The Outbox Table

Create a table that stores pending messages alongside your domain data.

CREATE TABLE outbox (
  id UUID PRIMARY KEY,
  payload JSONB,
  published BOOLEAN DEFAULT FALSE,
  created_at TIMESTAMPTZ DEFAULT now()
);

Atomic Write

In one transaction, update the business row and insert the outbox row. Either both commit or neither does.

BEGIN;
INSERT INTO orders (id, status) VALUES ('42', 'paid');
INSERT INTO outbox (id, payload) VALUES (gen_random_uuid(), '{"order":"42"}');
COMMIT;

The Relay Process

A separate relay (or message dispatcher) polls the outbox for unpublished rows, publishes them to RabbitMQ, and marks them published.

Polling the Outbox

The relay selects pending rows in order and publishes each one.

SELECT id, payload FROM outbox WHERE published = FALSE ORDER BY created_at;

At-Least-Once Delivery

If the relay crashes after publishing but before marking the row, it republishes on restart. So consumers must be idempotent to tolerate duplicates.

Change Data Capture Alternative

Instead of polling, tools like Debezium tail the database write-ahead log and stream outbox inserts to RabbitMQ, reducing latency and load.

Combining With Confirms

The relay should use publisher confirms so it only marks a row published after the broker acknowledges the message, closing the loss window.

Outbox vs Saga

The outbox guarantees a single service reliably emits its events. A saga coordinates a multi-service workflow. They complement each other: each saga step can publish via its own outbox.

Cleanup and Retention

  • Periodically delete or archive published rows
  • Index on published for fast polling
  • Monitor relay lag to catch stalls early

Quick Check

Test your outbox understanding.

Recap

The outbox pattern stores outgoing messages in the same transaction as business data, then a relay publishes them to RabbitMQ asynchronously.

It eliminates the dual-write problem, requires idempotent consumers due to at-least-once delivery, and pairs well with publisher confirms and sagas.

Często zadawane pytania

Czy lekcja „Wzorzec Outbox dla niezawodnego publikowania” jest bezpłatna?

Tak — pełny tekst „Wzorzec Outbox dla niezawodnego publikowania” 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 RabbitMQ Messaging & Async Systems, przejdź na CoddyKit PRO. Kurs RabbitMQ Messaging & Async Systems zawiera 4 lekcji w sumie.

Co nauczysz się w „Wzorzec Outbox dla niezawodnego publikowania”?

Poznaj transakcyjny wzorzec outbox, który pozwala atomowo zatwierdzać stan biznesowy i wiadomości wychodzące, eliminując problem podwójnego zapisu w systemach sterowanych zdarzeniami. Ćwiczysz RabbitMQ Messaging & Async Systems 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ąć RabbitMQ Messaging & Async Systems?

Nie wymagamy żadnego doświadczenia. RabbitMQ Messaging & Async Systems 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 Outbox dla niezawodnego publikowania”?

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 RabbitMQ Messaging & Async Systems?

Tak. Każda lekcja RabbitMQ Messaging & Async Systems 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. Idempotencja przetwarzania wiadomości
  2. Wzorzec Saga z RabbitMQ
  3. Rozdzielenie odpowiedzialności za polecenia i zapytania (CQRS)
  4. Wzorzec Outbox dla niezawodnego publikowania
← Powrót do RabbitMQ Messaging & Async Systems