Надёжный потребитель Kafka
Вопрос
Как вы спроектируете надёжный потребитель Kafka на Spring Boot, который пишет в базу?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Ключ сообщения и порядок внутри партиции
At-least-once: коммит после обработки
Идемпотентность: таблица обработанных id или upsert в той же транзакции
DefaultErrorHandler с backoff и DLT, неретраибельные ошибки сразу в DLT
ErrorHandlingDeserializer для ядовитых сообщений
Концурентность не больше числа партиций, контроль max.poll.interval.ms, метрики лага
Что могут спросить следом
- Блокирующие или неблокирующие повторы?
- Как переобработать сообщения из DLT?
Разбор
Начинаю с гарантий: работаю в at-least-once, offset коммитится после успешной обработки, поэтому обработчик идемпотентный. В той же транзакции БД записываю id сообщения в таблицу обработанных или делаю upsert, повтор ничего не испортит. Ошибки обрабатываю DefaultErrorHandler: несколько повторов с экспоненциальной паузой для временных сбоев, а для ошибок валидации и десериализации сразу DeadLetterPublishingRecoverer в DLT. Десериализацию оборачиваю ErrorHandlingDeserializer, чтобы ядовитое сообщение не стопорило партицию. Если порядок не важен, а внешний сервис может лежать долго, беру неблокирующие повторы через @RetryableTopic. Concurrency ставлю не больше числа партиций, слежу, чтобы обработка пачки укладывалась в max.poll.interval.ms, и мониторю consumer lag. Для DLT есть процедура разбора и повторной публикации.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.