Skip to content

HarAlb/outbox-pattern

Repository files navigation

Outbox Pattern Implementation

Что это?

Outbox паттерн - это способ надежной обработки событий в приложении. Вместо того чтобы сразу отправлять события (в RabbitMQ, другуе сервисы и т.д.), мы сохраняем их в базу данных (таблицу outbox_messages) и обрабатываем отдельным воркером.

Зачем это нужно?

📦 Гарантированная доставка

Если после регистрации пользователя упадет сервер, событие не потеряется - оно уже в базе данных и будет обработано при следующем запуске.

🔄 Повторные попытки (Retry)

Если обработчик события упал с ошибкой (например, бонусный сервис временно недоступен), воркер автоматически попробует снова (поле attempts).

🚦 Контроль нагрузки

События обрабатываются пачками, можно контролировать скорость обработки.

🔍 Отладка и мониторинг

Все события хранятся в таблице, можно легко найти проблемное событие и посмотреть что пошло не так.

Как это работает?

Схема работы:

1 ) Событие (UserRegistered) → Сохраняется в outbox_messages

  1. OutboxWorker (каждую секунду) → Забирает новые события

  2. Dispatcher → Находит нужный Listener по типу события

  3. Listener → Выполняет бизнес-логику (начисление бонусов)

Структура таблицы outbox_messages:

Поле Описание
id Уникальный ID события
type Тип события (например, "UserRegistered")
payload Данные события в JSON (userId, email и т.д.)
attempts Сколько раз пытались обработать
error Ошибка при последней попытке
processed Обработано успешно
failed Окончательно провалено
occurred_at Когда произошло событие
aggregate_id ID сущности (например, user_id)
correlation_id ID всей бизнес-операции

Команды для работы

Запуск воркера (обработчика событий)

php artisan outbox:work
# Опции:
# --sleep=1  - спать 1 секунду если нет событий
# --limit=100 - обработать 100 событий и выйти

Мониторинг outbox

php artisan outbox:monitor --stats

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages