К списку
Асинхронные системы и очередиSeniorТехническое

Как проверить атомарность Outbox pattern при записи и публикации событий

Краткий ответ

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

Развёрнуто

Краткий ответ

Для проверки атомарности outbox pattern необходимо симулировать аварийные ситуации после фиксации данных в базе и до публикации события. Это позволяет убедиться, что система корректно перезапускает отправку (ретраит) и не теряет или не дублирует сообщения.


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

Outbox pattern гарантирует атомарность между записью бизнес-данных и публикацией событий в асинхронных системах. Внутри одной транзакции данные записываются в основную таблицу и в outbox — специальную таблицу для событий. После коммита отдельный процесс (диспетчер) считывает события из outbox и публикует их в очередь или брокер.

Чтобы протестировать эту схему, нужно искусственно вызвать сбой после коммита транзакции, но до публикации, и проверить, что:

  • Диспетчер повторно отправляет события (ретраит).
  • Нет потери сообщений — каждое событие в итоге публикуется.
  • Отсутствуют дубликаты, даже при многократных попытках отправки.
Сценарий Ожидаемое поведение
Сбой до коммита Транзакция откатывается, нет событий
Сбой после коммита, до публикации Повторная отправка события, без потерь и дубликатов

Пример

1. Транзакция:
   - Записать заказ в orders
   - Записать событие в outbox
   - Commit

2. Сбой на уровне приложения после commit, до публикации

3. Диспетчер outbox повторно читает событие и публикует в очередь

4. Система проверяет журнал публикаций — событие опубликовано ровно один раз

Что важно знать на собеседовании

  • Outbox pattern решает проблему согласованности данных и сообщений в распределённых системах.
  • Тестирование требует имитации сбоев именно между commit и публикацией.
  • Ретрай-механизм должен быть идемпотентным, чтобы избежать дубликатов.
  • Использование транзакций гарантирует атомарность записи данных и событий.
  • Мониторинг и логирование помогают выявить проблемы с потерей или дублированием сообщений.

Тема: Асинхронные системы и очереди | Уровень: senior