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

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

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

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

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

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

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