[英]Concurrently Consume Multiple topics as a kafka consumer
我正在关注这个 url https://cwiki.apache.org/confluence/display/KAFKA/Consumer+Group+Example 中关于并发消费 kafka 主题的示例。
在创建线程池部分,他们有以下代码
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(a_numThreads);
// now create an object to consume the messages
//
int threadNumber = 0;
for (final KafkaStream stream : streams) {
executor.submit(new ConsumerTest(stream, threadNumber));
threadNumber++;
}
}
我可以向 topicCountMap 添加更多主题。 例如,
topicCountMap.put("channel1", new Integer(a_numThreads));
topicCountMap.put("channe2", new Integer(a_numThreads));
topicCountMap.put("channel3", new Integer(a_numThreads));
在上面的代码中,在我看来,流对象只映射到主题之一
List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic);
我不完全确定如何创建多个流对象,每个对象都映射到给定的主题,然后遍历它们以从每个通道获取数据并将它们提交给执行程序。
假设你有:
String topic1 = "channel1";
String topic2 = "channel2";
String topic3 = "channel3";
然后,你确实可以这样做:
topicCountMap.put(topic1, new Integer(a_numThreads_topic1));
topicCountMap.put(topic2, new Integer(a_numThreads_topic2));
topicCountMap.put(topic3, new Integer(a_numThreads_topic3));
一旦您获得了您的 consumerMap(执行此操作的代码不会改变),您将能够检索每个主题的流:
List<KafkaStream<byte[], byte[]>> topic1_streams = consumerMap.get(topic1);
List<KafkaStream<byte[], byte[]>> topic2_streams = consumerMap.get(topic2);
List<KafkaStream<byte[], byte[]>> topic3_streams = consumerMap.get(topic3);
要从流中使用,您需要创建正确数量的执行程序:
executors_topic1 = Executors.newFixedThreadPool(a_numThreads_topic1);
executors_topic2 = Executors.newFixedThreadPool(a_numThreads_topic2);
executors_topic3 = Executors.newFixedThreadPool(a_numThreads_topic3);
最后 :
int threadNumber = 0;
for (final KafkaStream stream : topic1_streams) {
executors_topic1.submit(new ConsumerTest(streams, threadNumber));
threadNumber++;
}
for (final KafkaStream stream : topic2_streams) {
executors_topic2.submit(new ConsumerTest(stream, threadNumber));
threadNumber++;
}
for (final KafkaStream stream : topic3_streams) {
executor_topic3.submit(new ConsumerTest(stream, threadNumber));
threadNumber++;
}
当然,这只是给你的想法。 显然,代码可以改进。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.