我一直在与卡夫卡合作,对消费者群体下的消费者有点混淆。混淆的核心是是否将消费者实施为流程或线程。对于这个问题,假设我正在使用高级消费者。卡夫卡消费者 - 消费者流程和主题分区与主题分区的关系如何?
让我们考虑一个我已经尝试过的场景。在我的话题中有2个分区(为了简单起见,我们假设复制因子只是1)。我用group1
组创建了一个消费者(ConsumerConnector
)进程consumer1
,然后创建了大小为2的主题计数映射,然后在该进程下生成了2个消费者线程consumer1_thread1
和consumer1_thread2
。它看起来像consumer1_thread1
正在消耗分区0
和consumer1_thread2
正在消耗分区1
。这种行为总是确定性的吗?以下是代码片段。类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
和他们每个人是一个单线程过程。现在我的问题是:
在这种情况下,两个独立的消费者过程(在同一组下)如何与分区相关?它与上面的单进程多线程场景有什么不同?
一般来说,消费者线程或进程如何映射/关联到主题中的分区?
卡夫卡文档确实说消费者组下的每个消费者都会消费一个分区。但是,它是指消费者线程(如我的上面的代码示例)还是独立的消费者进程?
有没有什么微妙的东西我在这里丢失关于实现消费者作为进程vs线程?提前致谢。
我明白你的意思。但是,我最初的问题主要关注的是线程与进程。我想知道在同一个进程下有两个消费者线程,而不是两个消费者进程(在这两种情况下,组是相同的)有什么区别? –
@AsifIqbal更新了我的回答 – user2720864
感谢您的编辑。这真的回答了我的好奇心。与此同时,我对多个流程做了一些进一步的实验,并看到重新平衡正在发生:)。 –