Ответ
Да, может. Consumer в Kafka, являясь частью consumer group, может читать данные из нескольких партиций одного или нескольких топиков.
Как это работает:
- Распределение партиций (Partition Assignment): Когда consumer подписывается на топик, координатор группы (Group Coordinator) с помощью стратегии (например,
RangeAssignorилиRoundRobinAssignor) назначает ему подмножество партиций этого топика. - Балансировка нагрузки: Если количество 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.