Перейти к содержимому
Опубликовано

💯 надёжности: шаблон гарантированной доставки сообщений

Автор
  • Имя
    Максим | Системный анализ
    Telegram

Кратко

надёжности: шаблон гарантированной доставки сообщенийПрактически любой бизнес-заказчик требует, чтобы события не терялись и не дублировались,...

надёжности: шаблон гарантированной доставки сообщений

Практически любой бизнес-заказчик требует, чтобы события не терялись и не дублировались, чтобы не списывались деньги за заказ, который так и не создался, чтобы товар не добавлялся два раза из-за того, что сеть "моргнула" и случился ретрай.

Для этого есть специальная механика: outbox и inbox.

Основная идея: работать с событиями в рамках транзакции базы данных

Как это работает в outbox, со стороны продюсера: сохранить все данные по бизнес-процесу, а потом положить сообщение в специальную таблицу сообщений со статусом 'NEW'. И только после этого закрыть транзакцию в БД. Получается, что если при сохранении сообщения система упала, то весь бизнес-процесс откатится. Это снижает доступность, но гарантирует доставку. Дальше отдельный процесс по расписанию отправляет сообщения из этой таблицы в kafka и помечает их как 'SENT'. Если после нескольких ретраев не получается отправить сообщение, то оно уходит в отдельную таблицу Dead Letter Queue (DLQ) на ручной разбор сопровождению.

Как это работает в inbox, со стороны консьюмера: консьюмер вычитывает сообщение, сохраняет его в таблицу и, не закрывая транзакцию, выполняет весь бизнес-процесс, коммитит и только после этого двигает оффсет. Если бизнес-процесс не выполнился, то сообщение будет прочитано ещё раз. Если вдруг outbox отправил сообщение два раза, то на дубликате мы получим ошибку: сообщение с таким id уже есть в таблице inbox.

О чем важно подумать аналитику, который применяет inbox и outbox: Точно ли во всех процессах нужен этот паттерн Как компенсировать участившиеся отказы в бизнес-процессах Нужно ли сохранять порядок сообщений для каждой сущности, или достаточно по user_id Индексы для таблицы outbox Какая политика ретраев при отправке из outbox Сколько дней хранить сообщения? Как сопровождение узнает о распухании outbox и DLQ Обговорено ли с бизнесом, что события могут задерживаться

P.S. здесь

@maximbelovmentor

Максим | Системный анализ
349 подписчиков
95 постов
Как войти в IT через системный анализ и получить оффер от 200к+. Опыт Senior аналитика из топ-банков. Разборы, практика, собесы, техника мышления аналитика. Бесплатная консультация - в закрепе.
💯 надёжности: шаблон гарантированной доставки сообщений | Максим | Системный анализ