RabbitMQ Messaging & Async Systems · Урок

Шаблон Outbox для надёжной публикации

Изучите транзакционный шаблон Outbox, чтобы атомарно фиксировать состояние бизнеса и исходящие сообщения, устраняя проблему двойной записи в системах, управляемых событиями.

Урок 4 из 413 шагов

«Шаблон Outbox для надёжной публикации» — бесплатный урок RabbitMQ Messaging & Async Systems на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения RabbitMQ Messaging & Async Systems, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс RabbitMQ Messaging & Async Systems содержит 4 уроков всего.

Части этого урока еще не переведены и отображаются на английском.

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.

Можно начать бесплатно

Изучай RabbitMQ Messaging & Async Systems с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
11
Уроки
44

Часто задаваемые вопросы

Урок «Шаблон Outbox для надёжной публикации» бесплатный?

Да — полный текст урока «Шаблон Outbox для надёжной публикации» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс RabbitMQ Messaging & Async Systems, подпишись на CoddyKit PRO. Курс RabbitMQ Messaging & Async Systems содержит 4 уроков всего.

Чему я научусь в уроке «Шаблон Outbox для надёжной публикации»?

Изучите транзакционный шаблон Outbox, чтобы атомарно фиксировать состояние бизнеса и исходящие сообщения, устраняя проблему двойной записи в системах, управляемых событиями. Ты практикуешь RabbitMQ Messaging & Async Systems с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать RabbitMQ Messaging & Async Systems?

Предыдущий опыт не требуется. RabbitMQ Messaging & Async Systems на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Шаблон Outbox для надёжной публикации»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке RabbitMQ Messaging & Async Systems?

Да. Каждый урок RabbitMQ Messaging & Async Systems включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Идемпотентность обработки сообщений
  2. Шаблон Saga с RabbitMQ
  3. Разделение ответственности команд и запросов (CQRS)
  4. Шаблон Outbox для надёжной публикации
← Назад к RabbitMQ Messaging & Async Systems