Вступить в клуб →
средняявопросKafka и надёжность интеграций

Событие потерялось между коммитом в базу и отправкой в 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` в конце функции — так оно уйдёт при любом выходе, включая ранний возврат по ошибке

🔒 Проверка ответа — для участников клуба

  • Проверка ответа
  • Подсказка, если застряли
  • Разбор с объяснением, почему так
  • Прогресс по всем задачам и виртуальные собеседования
Зарегистрироваться →

Регистрация занимает минуту

Другие задачи раздела