Sobes.tech
Назад к вопросам
Senior
4

Расскажи про паттерн Outbox для гарантии доставки сообщений.

Компании, где спрашивали
СБЕРСБЕР

Ответ от нейросети

sobes.tech AI

Паттерн Outbox используется для гарантии доставки сообщений между микросервисами или компонентами, особенно когда нужно обеспечить атомарность записи данных и отправки сообщений.

Идея:

  1. Вместо того чтобы сразу отправлять сообщение в брокер, сервис записывает событие (сообщение) в специальную таблицу "outbox" в той же транзакции, где изменяются бизнес-данные.
  2. Отдельный процесс или поток периодически читает из таблицы outbox новые сообщения и отправляет их в систему обмена сообщениями.
  3. После успешной отправки сообщение помечается как отправленное или удаляется из таблицы.

Так достигается гарантия, что сообщение не потеряется и не будет отправлено дважды, так как запись в outbox и изменение данных происходят в одной транзакции базы данных.

Пример:

// В транзакции
updateOrderStatus(orderId, "PAID");
insertOutboxMessage(orderId, "OrderPaidEvent");

// Отдельный процесс
List<Message> messages = fetchUnsentOutboxMessages();
for (Message msg : messages) {
    sendToMessageBroker(msg);
    markMessageAsSent(msg);
}

Это надёжный способ интеграции с асинхронными системами, минимизирующий потерю данных и рассинхронизацию.