Как влияет соотношение партиций и консьюмеров на обработку сообщений в Kafka
Что проверяют
Понимаете ли вы модель группы потребителей: кто какую партицию читает и где потолок параллелизма. Следом обычно спрашивают, что будет при добавлении партиций в живой топик и как не потерять порядок сообщений.
Как отвечать
Базовое правило: внутри одной группы (group.id) каждая партиция в каждый момент назначена ровно одному консьюмеру. Отсюда три случая:
- партиций больше, чем консьюмеров: каждый читает несколько партиций, непрочитанных партиций нет, просто нагрузка на консьюмера выше;
- поровну: одна партиция на консьюмера, максимальный параллелизм для этой группы;
- консьюмеров больше: лишние не получают ни одной партиции и простаивают как горячий резерв.
Значит, число партиций задаёт потолок параллелизма, и закладывать его нужно с запасом. Уменьшить число партиций нельзя, а увеличение меняет соответствие ключа и партиции: сообщения с тем же ключом начнут попадать в другую партицию, и на переходе порядок по ключу нарушится. Порядок в Kafka гарантирован только внутри партиции.
Для Python есть свои детали. Из-за GIL один процесс плохо масштабируется по CPU, поэтому консьюмеров запускают отдельными процессами или подами, так, чтобы их было не больше, чем партиций. Если обработка медленная и интервал между вызовами poll() превысит max.poll.interval.ms (по умолчанию пять минут), консьюмера исключат из группы и начнётся ребалансировка. Смягчает её стратегия cooperative-sticky, которая не отбирает партиции у всех разом. У confluent-kafka разбиение по ключу по умолчанию не совпадает с Java-клиентом: если в топик пишут оба, задайте partitioner=murmur2_random.
Разные группы читают топик независимо, и каждая получает все сообщения.
Где спотыкаются
Говорят, что при партициях больше, чем консьюмеров, часть партиций не читается. Читаются все, консьюмер просто берёт несколько.
Добавляют консьюмеров сверх числа партиций, чтобы разогнать обработку, и не видят прироста.
Увеличивают число партиций на живом топике с ключами, не подумав о порядке. Для заказов или балансов это расхождения, которые трудно заметить.