Outbox (исходящие сообщения) – паттерн в архитектуре приложения, который предусматривает создание специальной таблички в базе данных (обычно OUTBOX), в которую складываются сообщения, которые нужно отправить через брокера сообщений. Предполагается, что будет запускаться периодическая работа, которая будет вычитывать ещё неотправленные сообщения из этой таблицы и пытаться их отправить. В принципе также предполагается, что 99,99% сообщений будут надлежащим образом отправлены и доставлены с первого раза, но, если что-то где-то пойдёт не так, то при следующем запуске периодической работы, будет предпринята ещё одна попытка отправки сообщения, что в свою очередь должно гарантировать, что сообщение никогда не будет потеряно.
Поводом для отправки сообщения может быть, например, факт сохранение в базу данных какой-то сущности. Например, в микросервис прилетел новый заказ и мы сохраняем данные заказа в таблицу ORDERS. Если по этому поводу нам нужно сделать оповещение других сервисов через Кафку, то может случиться так (и иногда будет случаться), что строчку в ORDERS мы сохранили, но сообщение должным образом по тем или иным причинам с первого раза не отправили. И это может быть очень неприятной ситуацией.
Механизм фиксации транзакций (коммиты) БД вместе с паттерном outbox – один из способов решения этой проблемы. Мы делаем записи в таблицы ORDERS и OUTBOX в рамках одной транзакции, коммитим изменения. Затем периодическая процедура пытается отправить необходимые сообщения столько раз, сколько понадобится, чтобы всё отработало должны образом.