Как работает распределение потребителей в Kafka при одной партиции и нескольких потребителях с одним group id
Что проверяют
Понимаете ли вы, что единица параллелизма в Kafka это партиция, а не потребитель. Следом обычно спрашивают, что будет при падении активного потребителя и как ускорить обработку без новых партиций.
Как отвечать
Внутри группы каждую партицию в каждый момент читает ровно один потребитель. При одной партиции и трёх потребителях с одним group.id партицию получит один, двое других состоят в группе без назначений и простаивают.
Что происходит под капотом:
- координатор группы: брокер, который следит за участниками по heartbeat. В классическом протоколе раскладку считает лидер группы на клиенте по
partition.assignment.strategy, в новом (KIP-848,group.protocol=consumer) её считает брокер; - ребалансировка: если активный потребитель вышел, молчал дольше
session.timeout.ms(по умолчанию 45 секунд) или не вызывалpoll()дольшеmax.poll.interval.ms(5 минут), партиция уходит простаивающему; - оффсеты: новый владелец читает с последнего закоммиченного оффсета. Обработанное, но не закоммиченное придёт повторно, поэтому обработчик должен быть идемпотентным;
- порядок: внутри партиции он сохраняется, и одна партиция это способ получить строгий порядок ценой параллелизма.
Лишние потребители здесь горячий резерв. Чтобы распараллелить, добавляют партиции (уменьшить их число потом нельзя, а ключи переедут в другие партиции) или параллелят обработку внутри одного потребителя пулом потоков, аккуратно коммитя оффсеты. В свежих версиях Kafka есть share groups (KIP-932): партицию читают совместно, но без гарантии порядка.
Где спотыкаются
Думают, что сообщения раздаются потребителям группы по кругу. В обычной группе это неверно.
Путают группы: потребители с разными group.id нагрузку не делят, каждая группа получает все сообщения.
Держат тяжёлую обработку между вызовами poll() дольше max.poll.interval.ms. Потребителя выкидывают из группы, начинаются повторные ребалансировки и повторная обработка.