Outbox паттерн - это способ надежной обработки событий в приложении.
Вместо того чтобы сразу отправлять события (в RabbitMQ, другуе сервисы и т.д.),
мы сохраняем их в базу данных (таблицу outbox_messages) и обрабатываем
отдельным воркером.
Если после регистрации пользователя упадет сервер, событие не потеряется - оно уже в базе данных и будет обработано при следующем запуске.
Если обработчик события упал с ошибкой (например, бонусный сервис временно недоступен),
воркер автоматически попробует снова (поле attempts).
События обрабатываются пачками, можно контролировать скорость обработки.
Все события хранятся в таблице, можно легко найти проблемное событие и посмотреть что пошло не так.
1 ) Событие (UserRegistered) → Сохраняется в outbox_messages
-
OutboxWorker (каждую секунду) → Забирает новые события
-
Dispatcher → Находит нужный Listener по типу события
-
Listener → Выполняет бизнес-логику (начисление бонусов)
| Поле | Описание |
|---|---|
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 событий и выйтиphp artisan outbox:monitor --stats