Почему для трех систем не использовать одну партицию или много партиций в Kafka?
Что проверяют
Понимаете ли вы, что партиция в Kafka одновременно единица параллелизма и единица порядка, а число партиций не выводится из числа систем. Следом обычно спрашивают, что будет, если партиций меньше, чем консьюмеров, и можно ли потом их количество уменьшить.
Как отвечать
Сначала уточните, кто эти три системы. Если они читают топик, каждая получает свой group.id и читает все сообщения независимо, делить партиции между системами не нужно. Если они пишут, вопрос сводится к ключу и порядку.
- одна партиция: строгий порядок всех сообщений, но внутри группы читает только один консьюмер, а вся запись идёт через одного лидера. Масштабироваться некуда;
- много партиций: параллелизм растёт, но порядок гарантирован только внутри партиции, то есть для одного ключа. Цена: больше файлов и памяти на брокерах, отдельный батч продюсера на каждую партицию, дольше ребалансы и перевыборы лидеров;
- ключ по системе: если ключом сделать идентификатор системы, дефолтный партиционер (хеш murmur2 от ключа) разложит три ключа максимум в три партиции, остальные останутся пустыми, а две системы могут и совпасть в одной;
- расчёт: число партиций считают от целевой пропускной способности, делённой на пропускную способность одного консьюмера, с запасом на рост. В Spring Kafka
concurrencyбольше числа партиций даёт простаивающие потоки.
Отдельно скажите про необратимость: партиции можно добавить, но нельзя убрать, а добавление меняет соответствие ключа и партиции и ломает порядок для уже идущих ключей. Поэтому количество закладывают заранее.
Где спотыкаются
Связывают отказоустойчивость с числом партиций. За неё отвечают replication.factor и min.insync.replicas: одна партиция с тремя репликами переживает падение брокера.
Говорят, что одну партицию может читать только один потребитель вообще. Ограничение действует внутри группы, разные группы читают её параллельно.
Ставят сотни партиций «на вырост» на маленьком кластере и получают долгие ребалансы и лишнюю нагрузку на брокеры без выигрыша.