Событие потерялось между коммитом в базу и отправкой в Kafka
Сервис заказов сохраняет заказ и уведомляет остальных:
if err := tx.Commit(); err != nil {
return err
}
if err := producer.Send(ctx, "orders", event); err != nil {
log.Error("send event failed", err)
}
При перезапуске пода и при недоступности брокера часть заказов есть в базе, но склад и биллинг о них не узнали. Какой подход закрывает эту дыру?
- Отправлять событие в Kafka до коммита транзакции: если брокер принял сообщение, заказ в базе точно появится
- Включить продюсеру `acks=all` и бесконечный retry — отправка станет надёжной, и окно между коммитом и Kafka закроется
- Transactional Outbox: событие пишется в таблицу той же транзакцией, а отдельный процесс читает её и публикует в Kafka с повторами
- Отправлять событие из `defer` в конце функции — так оно уйдёт при любом выходе, включая ранний возврат по ошибке
