Назад к вопросам
Senior
5
Расскажи про Outbox Pattern — как он работает?
Компании, где спрашивали
Штрафов нет
Ответ от нейросети
sobes.tech AI
Outbox Pattern — это паттерн для обеспечения надежной доставки сообщений между сервисами в распределенной системе, особенно когда нужно гарантировать согласованность между базой данных и системой обмена сообщениями.
Как он работает:
- Вместо того, чтобы сразу отправлять событие в очередь сообщений, сервис записывает событие в специальную таблицу "outbox" в той же транзакции, где изменяет основную бизнес-данные.
- Отдельный процесс или воркер периодически читает новые записи из таблицы outbox и отправляет их в систему обмена сообщениями (например, Kafka, RabbitMQ).
- После успешной отправки событие помечается как отправленное или удаляется из таблицы.
Таким образом достигается атомарность: либо данные и событие сохраняются вместе, либо не сохраняются вовсе, что исключает потерю сообщений или рассинхронизацию.
Пример упрощенной схемы:
// В транзакции
tx.Exec("UPDATE orders SET status = ? WHERE id = ?", newStatus, orderId)
tx.Exec("INSERT INTO outbox (event_type, payload) VALUES (?, ?)", "OrderUpdated", payloadJson)
// commit tx
// В отдельном воркере
for {
events := db.Query("SELECT * FROM outbox WHERE sent = false")
for _, event := range events {
sendToMessageBroker(event)
markAsSent(event.id)
}
time.Sleep(pollInterval)
}