Технологии

[Перевод] Паттерн Outbox для надежного обмена сообщениями в микросервисах

Краткое резюме

Паттерн Outbox — эффективное решение для обеспечения надёжной связи между компонентами в распределённой системе. Он позволяет достичь транзакционных гарантий в рамках одного сервиса и обеспечить доставку сообщений во внешние системы по принципу «как минимум один раз».

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

Фильтры и сортировка