Learning Platform
Глоссарий Troubleshooting
Урок 04.07 · 10 мин
Средний
SummaryReview

Итоги модуля: Consumers

Этот модуль охватил полный цикл работы с consumer-стороной Kafka: от базового API и управления offset до advanced механизмов ребалансировки, static membership и share groups. Ключевые акценты — KIP-848 как современный стандарт протокола ребалансировки в Kafka 4.0 и KIP-932 как production-ready queue semantics в Kafka 4.2.


Что мы изучили

Карта концепций: Module 03 — Consumers

Consumer API

Consumer API (Урок 01): KafkaConsumer(bootstrap_servers, group_id, auto_offset_reset). subscribe(topics) vs assign(partitions). poll() loop — единственный способ получить данные. ConsumerRecord(topic, partition, offset, key, value, timestamp).

Управление Offset

Offset Management (Урок 02): auto_offset_reset='earliest'/'latest'. enable_auto_commit — удобно, но риск потери. Manual commit (enable_auto_commit=False) + commit() после обработки = at-least-once. seek() для replay.

Consumer Groups

Consumer Groups (Урок 03): group.id объединяет consumer. Каждая партиция → ровно один consumer. Group coordinator хранит offsets в __consumer_offsets. Масштабируем до num_partitions. Несколько групп = независимое чтение.

Протоколы ребалансировки

Ребалансировка (Урок 04): Eager (legacy) — глобальный стоп-мир, JoinGroup/SyncGroup. Cooperative — двухфазный, только затронутые партиции. KIP-848 (стандарт Kafka 4.0) — сервер-driven, ConsumerGroupHeartbeat API, без синхронизационного барьера, до 20x быстрее.

Static Membership

Static Membership (Урок 05): group.instance.id — стабильный ID вместо эфемерного. Reconnect без ребалансировки при рестарте меньше session.timeout.ms. Идеально для Kubernetes StatefulSet. max.poll.interval.ms — отдельный таймаут для poll().

Share Groups (KIP-932)

Share Groups KIP-932 (Урок 06): queue semantics в Kafka 4.2. Несколько consumer'ов читают одну partition кооперативно через acquisition lock. Per-record ACCEPT/RELEASE/REJECT. Встроенный poison message protection через delivery_attempt_limit. Replaces RabbitMQ для task queue use case'ов.

Дерево решений: выбор стратегии offset

Правильная стратегия управления offset зависит от требований к надёжности и производительности:

Когда использовать какую стратегию offset

Нет закоммиченного offset — что читать?

Стартовая точка: новая consumer group, нет закоммиченного offset.
нужна история

earliest — читать с начала

auto_offset_reset='earliest': обработать всю историю с offset 0. Типичный случай: аналитика, batch обработка, новая версия сервиса.
real-time только

latest — только новые

auto_offset_reset='latest': пропустить историю, читать только новые сообщения. Типичный случай: метрики, уведомления в реальном времени.
после старта

Как фиксировать прогресс?

После первого poll() — нужно управлять offset.
простота важна

Auto-commit (некритичные данные)

enable_auto_commit=True: Kafka автоматически коммитит каждые 5 сек. At-most-once при crash между auto-commit и обработкой. Для некритичных данных: метрики, логи.
надёжность важна

Manual commit (критичные данные)

enable_auto_commit=False + commit() после обработки: at-least-once. Для финансовых транзакций, заказов, критичных бизнес-событий.

KIP-848: стандарт для Kafka 4.0

Ключевой вывод модуля: KIP-848 — это не опция и не «расширенная возможность». Это стандартный протокол ребалансировки в Kafka 4.0+, который заменяет устаревший JoinGroup/SyncGroup подход.

KIP-848: конфигурация по умолчанию

Kafka 4.0: group.protocol=consumer (opt-in)

Kafka 4.0: group.protocol=consumer включается явно на стороне consumer. Сервер поддерживает оба протокола (classic + consumer). Рекомендуется для всех новых приложений.

Kafka 4.2: default (без конфигурации)

Kafka 4.2: group.protocol=consumer является дефолтным значением. Устаревший classic protocol доступен через явную настройку group.protocol=classic.
# consumer.properties для Kafka 4.0
group.id=my-application
group.protocol=consumer
# Опционально: стабильное членство
# group.instance.id=consumer-pod-0

Краткая шпаргалка по конфигурациям

ПараметрПо умолчаниюЧто изменить
auto_offset_resetlatestearliest для обработки истории
enable_auto_commitTrueFalse для at-least-once гарантий
auto_commit_interval_ms5000Уменьшить если нужно частый коммит
session_timeout_ms45000Увеличить для стабильной среды
max_poll_interval_ms300000Увеличить для долгой обработки
group.protocolclassic (4.0)consumer для KIP-848
group.instance.id(нет)Установить для static membership

Следующий шаг

Модуль 04 — «Внутреннее устройство Kafka» — раскрывает, что происходит на диске: файлы лог-сегментов (.log, .index, .timeindex), механика LEO vs High Watermark, log compaction и tiered storage. Понимание internals критически важно для диагностики production-проблем.

Проверка знанийKnowledge check
Приложение обрабатывает финансовые транзакции из Kafka. Инженер настроил consumer с enable_auto_commit=True. В чём риск этой конфигурации, и как правильно настроить consumer для надёжной обработки транзакций?
ОтветAnswer
Риск: при enable_auto_commit=True Kafka коммитит offset по таймеру (каждые 5 сек), независимо от состояния обработки. Если consumer упадёт после авто-коммита, но до завершения обработки транзакции — транзакция будет потеряна (at-most-once семантика). Для финансовых данных это недопустимо. Правильная настройка: enable_auto_commit=False, обработать каждое сообщение полностью (включая запись в БД и ACK к внешнему сервису), затем consumer.commit() для синхронного подтверждения offset. Это обеспечивает at-least-once: при падении до commit() — транзакция будет повторно обработана (нужна идемпотентность). Дополнительно: group.instance.id для предотвращения лишних ребалансировок при рестарте, group.protocol=consumer для KIP-848.

Проверьте понимание

Результат: 0 из 0
Аналитический
Вопрос 1 из 4. Команда разрабатывает consumer для обработки медицинских данных (критичные записи — потеря недопустима, дубликаты допустимы при наличии идемпотентной обработки). Consumer должен работать в Kubernetes. Какая комбинация настроек наиболее подходит?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 7