Consumer Group
Consumer Group 是 Kafka 提供的可擴充且具有容錯性的消費者機制。既然是一個組,那麼組内必然可以有多個消費者或消費者執行個體(Consumer Instance),它們共享一個公共的 ID,這個 ID 被稱為 Group ID。組内的所有消費者協調在一起來消費訂閱主題(Subscribed Topics)的所有分區(Partition)。當然,每個分區隻能由同一個消費者組内的一個 Consumer 執行個體來消費。個人認為,了解 Consumer Group 記住下面這三個特性就好了。
1:Consumer Group 下可以有一個或多個 Consumer 執行個體。這裡的執行個體可以是一個單獨的程序,也可以是同一程序下的線程。在實際場景中,使用程序更為常見一些。
2:Group ID 是一個字元串,在一個 Kafka 叢集中,它辨別唯一的一個 Consumer Group。
3:Consumer Group 下所有執行個體訂閱的主題的單個分區,隻能配置設定給組内的某個 Consumer 執行個體消費。這個分區當然也可以被其他的 Group 消費。
Consumer 執行個體設定
你可能會有這樣的疑問:在實際使用場景中,我怎麼知道一個 Group 下該有多少個 Consumer 執行個體呢?
理想情況下,Consumer 執行個體的數量應該等于該 Group 訂閱主題的分區總數。
舉個簡單的例子,假設一個 Consumer Group 訂閱了 3 個主題,分别是 A、B、C,它們的分區數依次是 1、2、3(總共是 6 個分區),那麼通常情況下,為該 Group 設定 6 個 Consumer 執行個體是比較理想的情形,因為它能最大限度地實作高伸縮性。
你可能會問,我能設定小于或大于 6 的執行個體嗎?當然可以!如果你有 3 個執行個體,那麼平均下來每個執行個體大約消費 2 個分區(6 / 3 = 2);
如果你設定了 8 個執行個體,那麼很遺憾,有 2 個執行個體(8 – 6 = 2)将不會被配置設定任何分區,它們永遠處于空閑狀态。是以,在實際使用過程中一般不推薦設定大于總分區數的 Consumer 執行個體。設定多餘的執行個體隻會浪費資源,而沒有任何好處。
Consumer Group Rebalance(重平衡)
Rebalance 本質上是一種協定,規定了一個 Consumer Group 下的所有 Consumer 如何達成一緻,來配置設定訂閱 Topic 的每個分區。比如某個 Group 下有 20 個 Consumer 執行個體,它訂閱了一個具有 100 個分區的 Topic。正常情況下,Kafka 平均會為每個 Consumer 配置設定 5 個分區。這個配置設定的過程就叫 Rebalance。那麼 Consumer Group 何時進行 Rebalance 呢?Rebalance 的觸發條件有 3 個。
1:組成員數發生變更。比如有新的 Consumer 執行個體加入組或者離開組,抑或是有 Consumer 執行個體崩潰被“踢出”組。
2:訂閱主題數發生變更。Consumer Group 可以使用正規表達式的方式訂閱主題,比如 consumer.subscribe(Pattern.compile("t.*c")) 就表明該 Group 訂閱所有以字母 t 開頭、字母 c 結尾的主題。在 Consumer Group 的運作過程中,你新建立了一個滿足這樣條件的主題,那麼該 Group 就會發生 Rebalance。