Outbox Pattern - это паттерн, используемый в микросервисной архитектуре для гарантирования доставки сообщений между микросервисами. Этот паттерн особенно полезен в сценариях, где необходимо обеспечить атомарность операции: т.е. либо все части операции успешно завершаются, либо все они откатываются.
В контексте Outbox Pattern, при выполнении операции (например, обновление записи в базе данных), микросервис также записывает сообщение в "исходящий ящик" (outbox) в той же транзакции базы данных. Это сообщение затем асинхронно отправляется в брокер сообщений (например, Kafka или RabbitMQ), который обеспечивает его доставку до других микросервисов. Если первоначальная операция не удаётся, то сообщение в исходящем ящике не будет записано, и, следовательно, не будет отправлено.
Этот паттерн помогает обеспечить согласованность данных между микросервисами и уменьшить вероятность потери сообщений при сбоях.
Outbox Pattern часто используется в связке с паттерном Saga, так как оба этих паттерна направлены на решение проблемы консистентности данных в микросервисной архитектуре.
Паттерн Saga предполагает выполнение длительной транзакции, которая разделена на ряд более мелких операций, каждая из которых управляется отдельным микросервисом. Если какая-то из этих операций не удаётся, то должны быть выполнены компенсационные операции для отката всей транзакции.
Outbox Pattern может использоваться для передачи сообщений о том, что определенная операция в Saga была выполнена или не удалась, и это может быть использовано для инициации следующей операции или для запуска компенсационных операций.
Как оркестрация, так и хореография могут быть использованы в контексте Saga. Оркестрация предполагает, что есть централизованный сервис (или несколько сервисов), который управляет выполнением операций и обрабатывает ошибки. Хореография, с другой стороны, предполагает, что каждый микросервис сам определяет, какие операции следует выполнить дальше на основе сообщений, которые он получает.
То есть, выбор между оркестрацией и хореографией зависит от конкретной архитектуры и требований к системе. Outbox Pattern может быть эффективно использован в обоих подходах.
Итог:
БД.старт_транзакции
пишем запись в таблицу outbox
отправляем в кафка
устанавливаем статус отправлено в таблице outbox
БД.коммит