Вопрос проверяет понимание отказоустойчивости Kafka и поведения consumer-групп при сбоях.
При сбое consumer’а Kafka инициирует ребаланс consumer-группы. Partition’ы, которые были закреплены за упавшим consumer’ом, перераспределяются между оставшимися. Новый consumer продолжит чтение с последнего закоммиченного offset’а. Неподтверждённые сообщения могут быть прочитаны повторно. Это нормальное и ожидаемое поведение.
Kafka проектировалась с учётом неизбежных сбоев.
Rebalance — процесс перераспределения partition’ов между consumer’ами внутри одной группы.
Когда consumer перестаёт отвечать:
Он не отправляет heartbeat
Group coordinator считает его мёртвым
Запускается rebalance
Partition’ы перераспределяются
Другие consumer’ы продолжают работу
Зависит от коммита offset’ов.
Offset закоммичен
сообщения считаются обработанными
повторного чтения нет
Offset не закоммичен
сообщения будут прочитаны повторно
возможны дубликаты
Kafka следует модели:
at-least-once по умолчанию
Поэтому:
Повторная обработка допустима
Логика должна быть идемпотентной
Коммитить offset после обработки
Делать обработку идемпотентной
Использовать exactly-once при необходимости
Сбой consumer’а не приводит к потере данных. Kafka перераспределяет нагрузку и продолжает работу, допуская повторную обработку сообщений.