2015-04-26 107 views

回答

3

多個線程無法使用相同的分區,除非這些線程位於不同的使用者組中。儘管您有大量閒置消費者,但只有一個線程會佔用單個分區中的消息。

分區數是卡夫卡的並行度單位。爲了讓多個消費者使用相同的分區,您必須增加主題的分區數量,直至達到您想要達到的並行度或將每個線程放入不同的使用者組中,但我認爲後者並不可取。

2

如果您有多個消費者從同一個消費羣下的相同主題消費,那麼主題中的消息會分發給這些消費者。換句話說,每個消費者都會得到一個不重疊的消息子集。以下幾行取自Kafka FAQ頁面

我應該爲消費者選擇多個組ID還是單個組ID?
如果所有消費者使用相同的組ID,則主題中的消息將分發給這些消費者。換句話說,每個消費者都會得到一個不重疊的消息子集。 在同一組中有更多的消費者增加了消費的並行度和整體吞吐量程度。請參閱下一個關於消費者實例數量選擇的問題。另一方面,如果每個消費者都在自己的組中,每個消費者都將獲得所有消息的完整副本。

爲什麼一些消費羣體中的某些消費者從未收到任何消息? 目前,主題分區是我們在同一消費羣中的消費者之間分發消息的最小單元。因此,如果消費者數量大於Kafka集羣中的分區總數(跨所有經紀人),則某些消費者將永遠不會獲得任何數據。解決的辦法是增加經紀人的分區數量

0

沒有在極端情況下。

卡夫卡高級消費者可以確保一條消息只會被消費一次。並確保一個分區最多隻能被一個線程佔用。

因爲在卡夫卡高級消費者中有一個本地隊列。 消費者考慮您是否從本地隊列中輪詢消息,您已消費該消息。

所以讓我們講一個故事:

  1. 線程1佔用分區0

  2. 線程1輪詢消息M0。消息m1,m2 ...已經在本地隊列中。

  3. 重新平衡後,kafka將清除本地隊列並重新註冊。

  4. 線程2現在消耗分區0,但線程1仍在消耗m0。

  5. 線程2可以輪詢m1,m2 ...現在。

您可以看到兩個線程此時正在使用相同的分區。

相關問題