Как определить оптимальное количество Consumer’ов в Kafka Consumer Group для Topic?

«Как определить оптимальное количество Consumer’ов в Kafka Consumer Group для Topic?» — вопрос из категории Брокеры сообщений, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оптимальное количество 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'ов.