2017-06-16 124 views
1

我正在爲我們的應用程序實施基於卡夫卡的解決方案。 根據Kafka文檔,我瞭解的是消費者組中的一個消費者(它是一個線程)內部映射到訂閱主題中的一個分區。卡夫卡:多個實例中的單一消費羣體

比方說,我有一個主題與40個分區,我有一個高級消費者運行在4個實例。我不希望一個實例消耗另一個實例消耗的相同消息。但是如果有一個實例出現故障,其他三個實例應該能夠處理所有消息。

  • 我應該去同一個消費者組,每個實例有10個線程嗎? - 說#2實例之間相同的消費羣體作爲傳統的同步隊列機制

In Apache Kafka why can't there be more consumer instances than partitions?

  • 或者我應該去爲每個實例不同的消費羣?

使用簡單的消費或低層次的消費使控制的分區,但這時如果一個實例出現故障時,其他三個實例不會處理從一審消耗的分區

回答

3

首先解釋消費者&消費羣體的概念,

消費者提供了消費羣體的名字標榜自己,併發布到一個話題每個記錄每個訂閱內交付給一個消費者實例消費羣體。

記錄將在消費羣中的消費者實例上有效地進行負載平衡。如果所有消費者實例具有不同的消費者組,則每條記錄都將廣播給所有消費者進程。

卡夫卡實現的方式是將日誌中的分區分配給消費者實例,以便每個實例在任何時間點都是「公平分享」分區的唯一消費者。如果新實例加入該組,則他們將接管來自該組的其他成員的一些分區;如果一個實例死亡,其分區將分配給其餘實例。

現在回答你的問題,

1.我不想一個實例來消費由另一個實例消耗相同的消息。但是如果有一個實例出現故障,其他三個實例應該能夠處理所有消息。

這在Kafka架構中默認是可能的。您只需使用相同的使用者組名稱標記所有4個實例。

2.我應該去每個實例有10個線程的同一個消費羣體嗎?

這樣做會爲每個線程分配一個kafka分區,以便從中分配數據,這是最優的。減少線程數量將負載平衡消費者實例之間的記錄分佈,並可以重載一些消費者實例。

3.在Apache Kafka爲什麼不能有比分區更多的消費者實例?

在Kafka中,分區只能分配給一個消費者實例。因此,創建比分區更多的消費者實例會導致閒置的消費者不會消費來自卡夫卡的任何記錄。

4.我應該去每個實例的不同消費羣體嗎?

不會。這會導致記錄重複,因爲每條記錄都將發送到所有實例,因爲它們來自不同的消費羣。

希望這可以澄清你的疑惑。

+0

感謝您的解釋。所以我認爲我應該爲我的用例選擇第一個選項。如果分區增加,我們最終應該增加消費者線程的數量 – Sudharsan

+0

是的。但試着確保你的消費者線程不超過第3點所述的分區。 –

+0

@DaniccanVP根據答案#1,是否有可能讓多個消費者以序列化的方式處理消息。即如果一個消息正在被一個實例處理,另一個消息應該等待。這是高可用性原因所必需的。 – TechEnthusiast

0

有幾件事情的消息在設計卡夫卡回聲系統時需要注意:

  1. 消費者本質上是一個線程,您不希望多線程試圖更改您的偏移量標記。這就是爲什麼消費者體系應該被設計成一個消費者一線的原因。

  2. 抵消提交,在您想要執行抵消提交的頻率之間存在微妙的平衡。如果頻率較高,則會對系統性能產生不利影響(Zk將成爲瓶頸)。如果頻率是兩個低,那麼您可能會冒重複的信息。

0

在卡夫卡你有兩種方式做競爭,消費者和發佈 - 訂閱模式:

  • 競爭消費者:它可能把消費者同樣的消​​費羣體裏面。這樣每個分區只能由一個消費者訪問(當然,消費者可以閱讀多個分區)。這意味着消費者羣中的分區數不會超過消費者數量,因爲其他消費者在未分配任何分區的情況下將處於空閒狀態。當然,如果消費者羣體中的一位消費者出現故障,那麼閒置的消費者中的一位將進入該分區。
  • 發佈訂閱:如果您擁有不同的消費者羣體,則不同消費羣體中的所有消費者都會收到相同的消息。在消費者羣體內部,上述模式將被應用。