Сколько топиков и партиций нужно создать в Kafka для интеграции с тремя потребителями?
Что проверяют
Понимаете ли вы, что параллелизм в Kafka упирается в партиции, а не в топики, и уточняете ли вы условие вместо того, чтобы назвать число. Вопрос с подвохом: «три потребителя» читается двумя способами, и хороший ответ начинается с того, что вы это заметили.
Как отвечать
Уточните, что имеется в виду: три разных сервиса, у каждого своя group.id, или три экземпляра одного сервиса в одной группе.
- три независимые группы: каждая читает топик целиком, смещения у них свои. Числу групп ничего в топике соответствовать не должно, партиции выбираются по нагрузке;
- три экземпляра одной группы: партиция закрепляется ровно за одним потребителем в группе, значит партиций нужно не меньше трёх, иначе лишний экземпляр будет простаивать.
Число топиков определяется данными, а не потребителями: один топик на один тип события со своей схемой. Разводить по разным топикам стоит, когда у сообщений разный контракт, разный retention или разные права доступа.
Скажите и про необратимость: партиции можно только добавить, и после добавления ключ начнёт попадать в другую партицию, то есть порядок по ключу для уже записанного нарушится. Поэтому берут с запасом и кратно ожидаемому числу потребителей. В Spring ограничение то же самое: @KafkaListener(concurrency = 3) поднимает три потребителя внутри приложения, и без трёх партиций работать будет один.
Где спотыкаются
Выпаливают число, не спросив про группы. Ответ «три топика по числу потребителей» показывает, что человек не понимает, что такое группа и зачем она нужна.
Второе: советуют четыре партиции на трёх потребителей. Делится неровно: кому-то достанется две, остальным по одной, и перекос по нагрузке получится на ровном месте. Кратное число распределяется честно.
Третье: рассчитывают на глобальный порядок сообщений. Порядок гарантирован только внутри партиции, поэтому связанные события кладут с общим ключом. Заодно забывают, что каждая партиция стоит файловых дескрипторов, памяти и времени ребалансировки, и «побольше на всякий случай» тоже имеет цену.