我看到以下代码用于消费来自Kafka的消息。有一个主题有20个分区,使用ExecutorService创建了20个线程。每个从1个分区读取的消息流有20个。运行此程序时,将读取20条消息,并将从主题处理。当其中一个线程完成处理时,我假设将读取下一条消息。
如果在主题中有100条消息的示例场景中,所有消息都将被读取并保存在内存中,并且将由线程一次处理,或者仅在当前消息之后才从主题读取消息正在处理线程处理?
public void run(int a_numThreads) {
Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
topicCountMap.put(topic, new Integer(a_numThreads));
Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer.createMessageStreams(topicCountMap);
List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic);
// now launch all the threads
//
executor = Executors.newFixedThreadPool(20);
// now create an object to consume the messages
//
int threadNumber = 0;
for (final KafkaStream stream : streams) {
executor.submit(new ConsumerTest(stream, threadNumber));
threadNumber++;
}
}
编辑:我在post中看到了答案。但是我有以下问题:
如果单个主题有20个分区,我可以在2个不同的节点上运行使用者吗?我是否应该在每个消费者中提到消息流的数量为10?当我的节点出现故障或存在性能问题时,数据流是否会自动重新平衡到工作节点?
答案 0 :(得分:1)
是的,您可以在不同节点上运行多个使用者来使用同一主题。根据机器配置,消息流的数量可以是10个不同。如果它的小机器你可以给5个左右。
如果一个节点发生故障,它会自动转移到加载到其他节点。除了失败之外,还有其他属性,例如topic.metadata.refresh.interval.ms,它决定何时重新平衡加载。