1. 程式人生 > 其它 >Kafka消費者組原理剖析

Kafka消費者組原理剖析

消費者組(Consumer Group)是什麼

Consumer Group 是kafka提供的可擴充套件且具有容錯性的消費者機制,消費者組內有多個消費者,它們被同一個ID所標識,這個ID被稱為Group ID,組內所有的消費者通過協調機制一起消費訂閱主題的分割槽,每個分割槽只能由一個消費者例項去消費。

消費者組解決了什麼問題

我們知道訊息中介軟體通常有兩種引擎模型,點對點模型和釋出/訂閱模型。 點對點模型的訊息一旦被消費就會從佇列中刪除,而且訊息只能被一個消費者消費,這種模型典型的缺點是伸縮性比較差。而釋出/訂閱模型要求每個消費者訂閱主題的所有分割槽,這種做法伸縮性也不好。Kafka消費者組很好的解決了上述兩種模型伸縮性差的問題。如果kafka所有消費者例項都屬於同一個Group那麼它實現的就是點對點模型,如果所有消費者例項分別屬於不同的Group那麼它實現的就是釋出/訂閱模型。在消費者組中,理想狀態下,消費者例項的數量應當與消費者組訂閱主題的分割槽總數。

假設一個 Consumer Group 訂閱了 3 個主題,分別是 A、B、C,它們的分割槽數依次是 1、2、3,那麼通常情況下,為該 Group 設定 6 個 Consumer 例項是比較理想的情形,因為它能最大限度地實現高伸縮性。如果你設定了 8 個例項,那麼很遺憾,有 2 個例項(8 – 6 = 2)將不會被分配任何分割槽,它們永遠處於空閒狀態。因此,在實際使用過程中一般不推薦設定大於總分割槽數的 Consumer 例項。設定多餘的例項只會浪費資源,而沒有任何好處。

消費者組Rebalance

Rebalance 本質上是一種協議,規定了一個 Consumer Group 下的所有 Consumer 如何達成一致,來分配訂閱 Topic 的每個分割槽

。比如某個 Group 下有 20 個 Consumer 例項,它訂閱了一個具有 100 個分割槽的 Topic。正常情況下,Kafka 平均會為每個 Consumer 分配 5 個分割槽。這個分配的過程就叫 Rebalance。

消費者組出發Rebalance主要有以下三個條件:

  • 消費者組內消費者例項發生變化
  • 消費者組訂閱的主題數量發生變更
  • 訂閱主題的分割槽數發生變更

Rebalance 發生時,Group 下所有的 Consumer 例項都會協調在一起共同參與。你可能會問,每個 Consumer 例項怎麼知道應該消費訂閱主題的哪些分割槽呢?這就需要分配策略的協助了。

當前 Kafka 預設提供了 3 種分配策略,每種策略都有一定的優勢和劣勢,我們今天就不展開討論了,你只需要記住社群會不斷地完善這些策略,保證提供最公平的分配策略,即每個 Consumer 例項都能夠得到較為平均的分割槽數。比如一個 Group 內有 10 個 Consumer 例項,要消費 100 個分割槽,理想的分配策略自然是每個例項平均得到 10 個分割槽。這就叫公平的分配策略。如果出現了嚴重的分配傾斜,勢必會出現這種情況:有的例項會“閒死”,而有的例項則會“忙死”。

Rebalance會導致消費者組內的所有消費者例項都停止消費,知道Rebalance過程結束,因此應該儘量避免出現這種情況。