Kafka消費者組原理剖析
消費者組(Consumer Group)是什麼
Consumer Group 是kafka提供的可擴充套件且具有容錯性的消費者機制,消費者組內有多個消費者,它們被同一個ID所標識,這個ID被稱為Group ID,組內所有的消費者通過協調機制一起消費訂閱主題的分割槽,每個分割槽只能由一個消費者例項去消費。
消費者組解決了什麼問題
我們知道訊息中介軟體通常有兩種引擎模型,點對點模型和釋出/訂閱模型。 點對點模型的訊息一旦被消費就會從佇列中刪除,而且訊息只能被一個消費者消費,這種模型典型的缺點是伸縮性比較差。而釋出/訂閱模型要求每個消費者訂閱主題的所有分割槽,這種做法伸縮性也不好。Kafka消費者組很好的解決了上述兩種模型伸縮性差的問題。如果kafka所有消費者例項都屬於同一個Group那麼它實現的就是點對點模型,如果所有消費者例項分別屬於不同的Group那麼它實現的就是釋出/訂閱模型。在消費者組中,理想狀態下,消費者例項的數量應當與消費者組訂閱主題的分割槽總數。
消費者組Rebalance
Rebalance 本質上是一種協議,規定了一個 Consumer Group 下的所有 Consumer 如何達成一致,來分配訂閱 Topic 的每個分割槽
消費者組出發Rebalance主要有以下三個條件:
- 消費者組內消費者例項發生變化
- 消費者組訂閱的主題數量發生變更
- 訂閱主題的分割槽數發生變更
Rebalance 發生時,Group 下所有的 Consumer 例項都會協調在一起共同參與。你可能會問,每個 Consumer 例項怎麼知道應該消費訂閱主題的哪些分割槽呢?這就需要分配策略的協助了。
當前 Kafka 預設提供了 3 種分配策略,每種策略都有一定的優勢和劣勢,我們今天就不展開討論了,你只需要記住社群會不斷地完善這些策略,保證提供最公平的分配策略,即每個 Consumer 例項都能夠得到較為平均的分割槽數。比如一個 Group 內有 10 個 Consumer 例項,要消費 100 個分割槽,理想的分配策略自然是每個例項平均得到 10 個分割槽。這就叫公平的分配策略。如果出現了嚴重的分配傾斜,勢必會出現這種情況:有的例項會“閒死”,而有的例項則會“忙死”。
Rebalance會導致消費者組內的所有消費者例項都停止消費,知道Rebalance過程結束,因此應該儘量避免出現這種情況。