【发布时间】:2015-12-04 21:38:00
【问题描述】:
我最近一直在使用 Kafka,对消费者组下的消费者有点困惑。混淆的中心是是否将消费者实现为进程或线程。对于这个问题,假设我使用的是高级消费者。
让我们考虑一个我尝试过的场景。在我的主题中有 2 个分区(为简单起见,我们假设复制因子仅为 1)。我创建了一个消费者 (ConsumerConnector) 进程 consumer1 和组 group1,然后创建了一个大小为 2 的主题计数映射,然后在该进程下生成了 2 个消费者线程 consumer1_thread1 和 consumer1_thread2。看起来 consumer1_thread1 正在使用分区 0 并且 consumer1_thread2 正在使用分区 1。这种行为总是确定性的吗?下面是代码sn-p。 TestConsumer 类是我的消费线程类。
...
Map<String, Integer> topicCountMap = new HashMap<String, Integer>();
topicCountMap.put(topic, new Integer(2));
Map<String, List<KafkaStream<byte[], byte[]>>> consumerMap = consumer.createMessageStreams(topicCountMap);
List<KafkaStream<byte[], byte[]>> streams = consumerMap.get(topic);
executor = Executors.newFixedThreadPool(2);
int threadNumber = 0;
for (final KafkaStream stream : streams) {
executor.submit(new TestConsumer(stream, threadNumber));
threadNumber++;
}
...
现在,让我们考虑另一种情况(我没有尝试过,但很好奇),我启动了 2 个消费者进程 consumer1 和 consumer2,它们都具有相同的组 group1,并且它们每个都是单线程进程.现在我的问题是:
在这种情况下,两个独立的消费者进程(尽管在同一个组下)如何与分区相关联?和上面的单进程多线程场景有什么区别?
一般来说,消费者线程或进程如何映射/关联到主题中的分区?
Kafka 文档确实说过,消费者组下的每个消费者都会消费一个分区。但是,这是指消费者线程(如我上面的代码示例)还是独立的消费者进程?
关于将消费者实现为进程与线程,我在这里是否遗漏了什么微妙的东西?提前致谢。
【问题讨论】:
标签: java multithreading distributed-computing apache-kafka kafka-consumer-api