我一直在與卡夫卡合作,對消費者羣體下的消費者有點混淆。混淆的核心是是否將消費者實施爲流程或線程。對於這個問題,假設我正在使用高級消費者。卡夫卡消費者 - 消費者流程和主題分區與主題分區的關係如何?
讓我們考慮一個我已經嘗試過的場景。在我的話題中有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
感謝您的編輯。這真的回答了我的好奇心。與此同時,我對多個流程做了一些進一步的實驗,並看到重新平衡正在發生:)。 –