[Перевод] Паттерн Outbox для надежного обмена сообщениями в микросервисах
Краткое резюме
Паттерн Outbox — эффективное решение для обеспечения надёжной связи между компонентами в распределённой системе. Он позволяет достичь транзакционных гарантий в рамках одного сервиса и обеспечить доставку сообщений во внешние системы по принципу «как минимум один раз».
Работа с микросервисами представляет собой сложную задачу, аналогичную работе с любыми распределёнными системами. В таких системах существует множество потенциальных проблем, о которых написаны научные статьи. Для более глубокого понимания этой темы рекомендуется ознакомиться с информацией о распространённых заблуждениях в области распределённых вычислений.
Одной из ключевых задач инженера, занимающегося проектированием распределённой системы, является сокращение количества возможных точек отказа. В этом выпуске мы рассмотрим, как можно достичь этой цели с помощью паттерна Outbox.
Паттерн Outbox представляет собой эффективное решение для обеспечения надёжной связи между компонентами в распределённой системе. Он позволяет достичь транзакционных гарантий в рамках одного сервиса и обеспечить доставку сообщений во внешние системы по принципу «как минимум один раз».
Для понимания проблемы, которую решает паттерн Outbox, рассмотрим пример потока регистрации пользователя. В этом процессе выполняются несколько действий: сохранение пользователя в базу данных, отправка приветственного письма и публикация события в брокер.
В идеальном случае все операции выполняются без ошибок. Однако если одна из операций завершается некорректно, возникают проблемы. Например, база данных может быть недоступна, почтовый сервис может не работать или публикация события в брокер может не пройти.
Представим ситуацию, когда пользователь был сохранён в базе данных, приветственное письмо было отправлено, но событие UserRegisteredEvent не было опубликовано для уведомления других сервисов. В таком случае возникает вопрос о том, как восстановить работу после сбоя.
Паттерн Outbox позволяет решать эту проблему путём атомарного обновления базы данных и отправки сообщений в брокер сообщений.
Для реализации паттерна Outbox необходимо выполнить следующие шаги:
* Добавить в базу данных таблицу, представляющую исходящие сообщения (Outbox). Эта таблица предназначена для хранения всех сообщений, которые должны быть гарантированно доставлены потребителю. Вместо прямых запросов к внешним сервисам сообщения сохраняются как новые строки в таблице Outbox. Обычно сообщения хранятся в базе данных в формате JSON.
* Внедрить фоновый процесс, который будет периодически опрашивать таблицу OutboxMessages. Если рабочий процесс находит строку с необработанным сообщением, он публикует это сообщение и помечает его как отправленное. Если публикация сообщения по какой-либо причине не удалась, рабочий процесс может повторить попытку при следующем запуске.