Как распределяются партиции топика Kafka между консьюмерами в группе, если консьюмеров меньше чем партиций
Что проверяют
Понимаете ли вы модель группы консьюмеров настолько, чтобы тестировать сервис на Kafka: где будет дисбаланс, что происходит при падении экземпляра и откуда берутся дубли. Следом обычно спрашивают обратный случай, когда консьюмеров больше, чем партиций.
Как отвечать
Правило одно: внутри группы партиция принадлежит ровно одному консьюмеру, а консьюмер может читать несколько партиций. Если консьюмеров меньше, все партиции всё равно читаются, просто кто-то получает больше. Простаивают консьюмеры только в обратной ситуации.
Как именно делится, решает partition.assignment.strategy. По умолчанию в Java-клиенте это RangeAssignor вместе с CooperativeStickyAssignor. Range раскладывает подряд: 5 партиций на 3 консьюмера дадут 2, 2 и 1. Есть также RoundRobinAssignor и StickyAssignor, последний при ребалансе старается оставить партиции на прежних местах. В Kafka 4.0 стал общедоступен новый протокол групп (KIP-848, group.protocol=consumer): назначение считает брокер, ребаланс идёт инкрементально.
Что проверять тестировщику:
- распределение и лаг:
kafka-consumer-groups.sh --describe --group orders-serviceпоказывает, кто держит какую партицию, текущий офсет и лаг. То же видно в Kafka UI; - падение экземпляра: после
session.timeout.ms(45 секунд по умолчанию) его партиции переходят к оставшимся, лаг должен рассосаться; - долгая обработка: если между вызовами
poll()прошло большеmax.poll.interval.ms(5 минут), консьюмер исключается из группы; - дубли: при ребалансе сообщения после последнего закоммиченного офсета читаются повторно, обработчик должен быть идемпотентным;
- порядок: он гарантирован только внутри партиции.
Где спотыкаются
Говорят, что при нехватке консьюмеров часть сообщений не будет прочитана. Будет, просто нагрузка распределится неравномерно.
Путают стратегии назначения партиций консьюмерам с партиционером продюсера. Sticky partitioner относится к записи, а не к чтению.
Не проверяют ребаланс и дубли, ограничиваясь «сообщение дошло». Основные дефекты живут именно там.