Ответ
Оптимальное количество Consumer'ов в группе определяется количеством партиций в топике. Одна партиция может быть назначена только одному Consumer'у из группы в данный момент.
Основное правило: Количество Consumer'ов в группе ≤ количеству партиций в топике.
- Если Consumer'ов больше партиций — лишние Consumer'ы будут бездействовать (idle).
- Если Consumer'ов меньше — некоторые Consumer'ы будут обрабатывать несколько партиций.
Пример настройки для топика с 3 партициями:
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-app-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
// Идеально: 3 Consumer'а в группе для 3 партиций.
KafkaConsumer<String, String> consumer1 = new KafkaConsumer<>(props);
KafkaConsumer<String, String> consumer2 = new KafkaConsumer<>(props);
KafkaConsumer<String, String> consumer3 = new KafkaConsumer<>(props);
// Каждому будет назначена ровно одна партиция.
Для горизонтального масштабирования обработки сначала увеличьте количество партиций в топике (это необратимая операция), а затем добавьте Consumer'ов.