IT заметки по программированию
IT заметки по программированию
IT заметки по программированию
IT заметки по программированию

Transactional Outbox таблица PostgreSQL

Transactional Outbox — это шаблон для надёжной передачи событий из базы данных в брокер сообщений (Kafka, RabbitMQ, NATS и т. д.). Он помогает избежать проблем с «двойной записью» (Dual Write Problem), обеспечивая атомарность базы данных и брокера сообщений.

Структура таблицы outbox

Стандартная таблица Transactional Outbox содержит следующие ключевые поля:

Объяснение полей:

📌 Поле 📜 Описание
id Уникальный ID события (UUID).
aggregate_id ID связанной сущности (например, заказа, пользователя).
aggregate_type Тип агрегата (например, «Order», «User»).
event_type Тип события (например, «ORDER_CREATED», «USER_REGISTERED»).
payload Данные события в формате JSON (гибкость хранения данных).
created_at Время создания записи.
processed_at Время обработки (NULL = ещё не обработано).
status Состояние обработки (PENDING, PROCESSED, FAILED).

Как работает Transactional Outbox?

1️⃣ Сервис записывает событие в outbox в рамках основной транзакции.
2️⃣ Фоновый «Outbox Processor» читает новые события (PENDING).
3️⃣ Отправляет их в брокер (Kafka, RabbitMQ, NATS и т. д.).
4️⃣ После успешной отправки обновляет статус на PROCESSED.


Обновление статуса после обработки

После успешной отправки сообщения в брокер нужно обновить статус:

Если произошла ошибка (например, сбой сети), можно пометить как FAILED:

Очистка старых записей

Чтобы база не разрасталась, можно удалять старые записи:

ИЛИ использовать партиционирование по дате (created_at), чтобы эффективно очищать старые данные.


Вывод

🔹 Transactional Outbox — это надёжный способ доставки событий.
🔹 Запись в outbox идёт в той же транзакции, что и основная БД, исключая расхождения.
🔹 Фоновый процессор гарантированно отправит события в брокер сообщений.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *