14. Kafka
Как Kafka обеспечивает семантику «ровно один раз» (exactly-once processing), и какие проблемы при этом возникают?
MiddleОтвет: Kafka обеспечивает семантику «ровно один раз» (EOS) с помощью:
- Идемпотентные продюсеры: Гарантируют, что повторные попытки не приведут к появлению дубликатов.
- Транзакции: Группируют несколько операций Kafka в единую атомарную единицу.
- Управление смещениями потребителей: При использовании Kafka Streams или транзакционных потребителей смещения фиксируются атомарно.
Проблемы:
- Требуется идемпотентность на стороне потребителя.
- Необходимо включить
acks=all,enable.idempotence=trueу продюсеров. - Увеличение задержки из-за транзакционных записей.
Подробное руководство по Kafka
Какова роль High-Water Mark (HW) в Kafka и как это влияет на потребителей?
MiddleОтвет:
- High-Water Mark (HW) — это последнее смещение, которое считается «зафик сированным» и может быть прочитано потребителями.
- Если реплика-последователь отстает, она не будет выбрана лидером, так как у нее нет HW.
- Потребители не могут читать незафиксированные данные (за HW), что обеспечивает согласованность.
Сложный сценарий: Если брокер упадет до того, как HW будет обновлен, некоторые зафиксированные сообщения могут временно исчезнуть, но они будут восстановлены после выбора лидера.
Как Kafka обрабатывает сбой лидера и что происходит с сообщениями «в полете»?
MiddleОтвет:
- Kafka использует ZooKeeper/KRaft для выбора нового лидера из синхронных реплик (ISR).
- Сообщения «в полете» (
ack=1илиack=0) могут быть потеряны, если они не были реплицированы. - Если
acks=all, сообщение считается безопасным только в том случае, если лидер успешно реплицировал его в ISR до падения. - Незафиксированные сообщения (ниже HW) могут быть потеряны в сценарии отказа.
Крайний случай: Если нет синхронных реплик, Kafka приостановит запись, чтобы предотвратить потерю данных, пока последователь не догонит лидера.
Объясните уплотнение логов (log compaction) в Kafka. Чем оно отличается от политик удержания (retention policies)?
MiddleОтвет:
- Уплотнение логов сохраняет как минимум одну версию для каждого ключа, удаляя старые версии.
- Политики удержания (
log.retention.ms,log.retention.bytes) удаляют сообщения по времени или размеру, независимо от ключа.
Вариант использования:
- Уплотнение полезно для журналов изменений (последнее состояние) в базах данных.
- Удержание полезно для журналов событий (например, отслеживание активности пользователей).
Каверзный вопрос: Что произойдет, если потребитель никогда не прочитает уплотненный топик? Если потребитель был отключен слишком долго, он может потерять некоторые исторические обновления, так как старые сообщения удаляются.