Вопрос проверяет понимание поведения Kafka при сбоях консьюмеров и связи этого поведения с гарантиями доставки сообщений.
Если консьюмер падает, Kafka считает его недоступным и запускает ребалансировку. Партиции, которые он читал, будут переданы другим консьюмерам в группе. Если offset не был закоммичен, сообщения будут прочитаны повторно. Это приводит к дубликатам, но не к потере данных. Итог зависит от того, когда именно был закоммичен offset.
Падение консьюмера — это нормальная ситуация для Kafka, и система изначально спроектирована так, чтобы корректно её обрабатывать.
Consumer failure handling — это механизм перераспределения партиций и продолжения обработки данных при падении консьюмеров.
Kafka использует:
heartbeat-запросы;
таймауты (session.timeout.ms).
Если брокер не получает heartbeat:
консьюмер считается «мертвым»;
начинается ребалансировка.
Во время ребаланса:
партиции упавшего консьюмера освобождаются;
назначаются другим участникам группы.
После этого:
обработка продолжается с сохранённого offset.
Сценарий:
сообщение обработано;
консьюмер упал до коммита.
Результат:
сообщение будет прочитано повторно;
возникает дубликат (at least once).
Сценарий:
offset сохранён;
консьюмер упал после коммита.
Результат:
повторной обработки не будет;
если бизнес-логика не успела выполниться — данные потеряны для группы.
Kafka не знает:
выполнилась ли бизнес-логика;
были ли побочные эффекты (запись в БД, вызов API).
Поэтому ответственность за корректность:
лежит на приложении;
реализуется через порядок коммита и идемпотентность.
Чтобы сбои были безопасными:
коммитьте offset после успешной обработки;
делайте обработку идемпотентной;
корректно настраивайте таймауты heartbeat.
Падение консьюмера приводит к ребалансировке и повторной обработке сообщений, если offset не был закоммичен. Это нормальный и ожидаемый сценарий, к которому нужно быть готовым на уровне бизнес-логики.