Вопрос проверяет знание внутренних механизмов Kafka и понимание, как достигается надежность в распределенной системе.
Kafka обеспечивает надежность за счет репликации, подтверждений записи и управления offset’ами. Сообщения записываются на диск и дублируются между брокерами. Producer может ждать подтверждения от нескольких реплик. Consumer сам управляет моментом подтверждения обработки. В совокупности это позволяет избежать потерь данных.
Надежность Kafka строится не на одном механизме, а на их комбинации.
Каждая партиция может иметь несколько реплик:
одна leader
несколько follower
Сообщение считается надежно записанным, когда оно:
сохранено на leader
подтверждено follower’ами (в зависимости от настроек)
Producer может управлять уровнем надежности через параметр acks:
acks=0 — без подтверждений
acks=1 — только leader
acks=all — leader + все in-sync реплики
Чем выше acks, тем выше надежность и задержки.
Kafka:
пишет данные последовательно
использует файловую систему
не хранит сообщения только в памяти
Это позволяет переживать перезапуски брокеров без потери данных.
Consumer:
сам решает, когда зафиксировать offset
может коммитить offset после успешной обработки
Пример:
// обработка сообщения
process(record);
// фиксация offset после обработки
consumer.commitSync();
Это позволяет реализовать at least once доставку.
Kafka поддерживает:
idempotent producer
транзакционные записи
Это снижает вероятность дубликатов и позволяет приблизиться к exactly once семантике.
Вывод: Kafka обеспечивает надежность за счет репликации, подтверждений, дискового хранения и контроля обработки на стороне consumer’а.