Вопрос с собеседования · Брокеры сообщений

Чем commitSync() отличается от commitAsync() у Kafka consumer?

SeniorKafka ConsumerKafka
Ещё спрашивают так:
  • Как правильно коммитить offset в Kafka?
Коротко

commitSync блокирует и повторяет до успеха или неустранимой ошибки — надёжно, но медленнее. commitAsync не ждёт и не повторяет — быстро, но ошибки нужно обрабатывать в callback.

  • Частый приём: commitAsync в цикле, commitSync при закрытии и перед ребалансом
  • commitAsync не повторяют автоматически: поздний повтор старого offset перезапишет новый
  • Коммитят offset следующего сообщения (последний обработанный + 1)

А ещё В Spring Kafka это скрыто за AckMode

Подробно

commitSync() отправляет offset и ждёт ответа координатора, повторяя при временных ошибках. Поток стоит на время запроса — при коммите после каждого сообщения это заметно снижает пропускную способность.

commitAsync() отправляет и сразу возвращается; результат приходит в callback. Не повторяет при ошибке намеренно: если повторить коммит offset 100 после того, как уже прошёл коммит offset 200, позиция откатится назад. Ошибки логируют или повторяют только если номер последовательности совпадает с последним.

Типичная схема:

  • в цикле обработки — commitAsync() после каждой пачки;
  • в finally при закрытии потребителя и в onPartitionsRevoked при ребалансе — commitSync(), чтобы зафиксировать обработанное до передачи партиций.

Что коммитят: offset следующего ожидаемого сообщения, то есть последний обработанный + 1. Можно коммитить явно по партициям (Map<TopicPartition, OffsetAndMetadata>).

Частота — компромисс: реже коммит — меньше нагрузка, но больше повторной обработки после сбоя.

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

  • Блокирующий и неблокирующий коммит, их плюсы и минусы.
  • Почему commitAsync не повторяют автоматически.
  • Схема сочетания и коммит при ребалансе.

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

  • Повторять commitAsync с устаревшим offset.
  • Коммитить offset последнего обработанного, а не следующего.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗commitSync пишет offset на диск брокера, а commitAsync — только в память клиента
  • ✗Это синонимы, выбор не имеет значения
  • ✓commitSync блокирует и ретраит ошибки; commitAsync не блокирует, но и не повторяет
  • ✗commitAsync блокирует поток, а commitSync — нет

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

  • Что такое auto commit?
  • Почему commit после обработки даёт at-least-once?

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования