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

Ответ

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

Ответ 18+ 🔞

Да ты посмотри на эту дичь, блядь! Оптимальное количество консьюмеров в группе, ёпта, определяется количеством партиций в топике. Это как закон, сука. Одна партиция в один момент времени — она как девственница, блядь, только для одного консьюмера из группы, больше никому!

Главное правило, которое надо выжечь на жопе: Количество консьюмеров в группе ≤ количеству партиций в топике.

  • Если консьюмеров больше, чем партиций — лишние будут сидеть, как манулы в зоопарке, без дела, блядь (idle, сука). Паразиты, ебать.
  • Если консьюмеров меньше — ну, тут понятно, некоторым счастливчикам достанется по две, а то и больше партиций, будут впахивать за себя и за того парня.

Смотри сюда, пример для топика, где партиций, допустим, аж три штуки:

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 консьюмера на 3 партиции.
KafkaConsumer<String, String> consumer1 = new KafkaConsumer<>(props);
KafkaConsumer<String, String> consumer2 = new KafkaConsumer<>(props);
KafkaConsumer<String, String> consumer3 = new KafkaConsumer<>(props);
// Каждому достанется ровно одна партиция, и все будут счастливы, как слоны в банановой роще.

А если тебе, сука, захотелось масштабироваться по-горизонтальному, чтобы всё летало — запомни, блядь, порядок действий, а то накосячишь! Сначала ты увеличиваешь количество партиций в топике (и помни, операция необратимая, назад не свернёшь, ёпта!), а уж потом добавляешь новых консьюмеров. А не наоборот, а то получишь тех самых безработных манулов, которые будут глазеть на работающих и завидовать.