- Опубликовано
💯 надёжности: шаблон гарантированной доставки сообщений
- Автор
- Имя
- Максим | Системный анализ
- Telegram
- Максим | Системный анализ349 подписчиков95 постовКак войти в IT через системный анализ и получить оффер от 200к+. Опыт Senior аналитика из топ-банков. Разборы, практика, собесы, техника мышления аналитика. Бесплатная консультация - в закрепе.
Кратко
надёжности: шаблон гарантированной доставки сообщенийПрактически любой бизнес-заказчик требует, чтобы события не терялись и не дублировались,...
надёжности: шаблон гарантированной доставки сообщений
Практически любой бизнес-заказчик требует, чтобы события не терялись и не дублировались, чтобы не списывались деньги за заказ, который так и не создался, чтобы товар не добавлялся два раза из-за того, что сеть "моргнула" и случился ретрай.
Для этого есть специальная механика: 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







