Получить доступ

Как @KafkaListener связан с listener container и offset commit?

SeniorSpring KafkaKafka
Ещё спрашивают так:
  • Когда Spring Kafka коммитит offset?
Коротко

@KafkaListener — метод, который вызывает listener container: контейнер крутит цикл poll() в своих потоках, вызывает метод для записей и коммитит offset по AckMode. По умолчанию BATCH — после обработки всей пачки из poll().

  • enable.auto.commit Spring Kafka выключает — коммитит сам контейнер
  • AckMode: RECORD, BATCH, MANUAL (Acknowledgment.acknowledge()), MANUAL_IMMEDIATE
  • Исключение в методе → DefaultErrorHandler: повторы с отсрочкой, затем recoverer (DLT)

А ещё concurrency — число потребителей в контейнере, не больше числа партиций

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Устройство. Для каждого @KafkaListener фабрика (ConcurrentKafkaListenerContainerFactory) создаёт контейнер: concurrency потребителей (KafkaMessageListenerContainer), каждый в своём потоке вызывает poll(), передаёт записи вашему методу и управляет offset. Метод может принимать запись, значение с заголовками или список (batch listener).

Коммит. Spring Kafka выключает автокоммит клиента и коммитит сам:

  • BATCH (по умолчанию) — после того, как обработаны все записи из очередного poll();
  • RECORD — после каждой записи (надёжнее, но медленнее);
  • MANUAL / MANUAL_IMMEDIATE — когда вы вызвали acknowledgment.acknowledge() (например, после асинхронной обработки).

Это at-least-once: если приложение упадёт после обработки, но до коммита, записи придут снова. Обработчик должен быть идемпотентным.

Ошибки. Исключение из метода перехватывает DefaultErrorHandler: делает несколько повторов с BackOff (по умолчанию 9 повторов без задержки — стоит настроить), потом передаёт запись recoverer'у, например DeadLetterPublishingRecoverer в топик .DLT, и идёт дальше. Ошибки десериализации — через ErrorHandlingDeserializer, иначе ядовитая запись зациклит потребителя.

Транзакции: с transactionManager у контейнера offset коммитится в транзакции Kafka вместе с отправленными сообщениями.

Что хотят услышать

  • Контейнер, его потоки и вызов метода.
  • AckMode и момент коммита.
  • At-least-once и идемпотентность.
  • DefaultErrorHandler и DLT.

Частые ошибки

  • Не настроить ErrorHandlingDeserializer — бесконечный цикл на битой записи.
  • Оставить повторы по умолчанию без отсрочки.

Что спросят дальше

  • Что такое AckMode.MANUAL?
  • Почему concurrency ограничена partitions?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем