Чем commitSync() отличается от commitAsync() у Kafka consumer?
- Как правильно коммитить 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?
Разбор темы
- Kafka Consumer и consumer group
Группа и распределение партиций, poll-цикл, heartbeat и таймауты, модели commit offset, ребаланс и роль идемпотентности.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.