Может ли consumer в Apache Kafka читать из нескольких партиций?

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

Ответ

Да, может. Consumer в Kafka, являясь частью consumer group, может читать данные из нескольких партиций одного или нескольких топиков.

Как это работает:

  1. Распределение партиций (Partition Assignment): Когда consumer подписывается на топик, координатор группы (Group Coordinator) с помощью стратегии (например, RangeAssignor или RoundRobinAssignor) назначает ему подмножество партиций этого топика.
  2. Балансировка нагрузки: Если количество consumers в группе меньше количества партиций, один consumer будет читать из нескольких партиций. Если consumers больше, некоторые могут остаться без работы.

Пример кода consumer'a, читающего из нескольких партиций:

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-consumer-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

try (KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props)) {
    consumer.subscribe(List.of("my-topic")); // Топик с N партициями

    while (true) {
        ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
        // records могут содержать сообщения из разных партиций
        for (ConsumerRecord<String, String> record : records) {
            System.out.printf("Partition: %d, Offset: %d, Key: %s, Value: %s%n",
                record.partition(), record.offset(), record.key(), record.value());
        }
    }
}

Важно: Consumer не может явно контролировать, из каких именно партиций он читает (в режиме группы). Распределением управляет брокер Kafka.