iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
Software Development

從零開始構建能理解語義的 Linebot 架構系列 第 14

Kafka 概念介紹及部署: Rebalance機制

  • 分享至 

  • xImage
  •  

Rebalance

Rebalance是一個動態分配Partition給不同 Consumer Instance的過程。

什麼是 Rebalance?

  • Rebalance是將某些Partition的Owner從一個Consumer Instance轉移到另一個的過程。如前面所述,Kafka限制一個Partition只能指派給一個Consumer Instance消費,而如果有不同的Consumer Group訂閱同一個Topic,則不同的 Group內的Instance可以同時消費這些Partition。
  • 例如下圖是把Consumer C加入一個只有A,B兩個Instance的Group以後,重新分派Partition的過程:
    https://ithelp.ithome.com.tw/upload/images/20240928/20105227qonxivskpV.png
    (圖轉載自: https://www.cnblogs.com/huxi2b/p/6223228.html)

Rebalance 與 Commit Offset

  • 當Rebalance發生,要指派接手的Consumer Instance時,Kafka會根據上一個Consumer已提交的偏移量(Committed Offset),來決定接手的Instance從哪裡開始繼續消費。

Partition的分配

  • Kafka會盡量平均的把Partition分配給Consumer Instance。
  • 例如: 假設一個Topic有100個partition,而某個訂閱它的Consumer Group內有20 個 Consumer Instance,這樣每個 Consumer Instance 在正常情況下,會被分配到 5 個 partition 來進行消費。

Group Coordinator 的角色

Group Coordinator是一種Kafka broker,負責管理 Consumer Group 內的 Consumer 分配關係和 Offset 狀態。每個Consumer會定期發送心跳訊號(Heartbeat)給Group Coordinator,藉此維護以下資訊:

  • 每個Partition是被指派給哪個Consumer Instance消費。
  • Consumer Group內有哪些 Consumer Instance。

什麼情況會觸發 Rebalance?

  • Heartbeat丟失:
    • 如果Group Coordinator沒有收到某個Consumer Instance的Heartbeat,則視該 Consumer 為不可用,進而觸發 Rebalance。
    • Consumer在以下情況會送Heartbeat:
      • 設定好的間隔時間
        • Consumer每隔一段時間就會送Heartbeat給Group Coordinator
      • Consumer取得data
        • Call poll時會送Heartbeat
      • Consumer Commit
        • Update Offset時會送Heartbeat
  • Consumer Group變動:當有新的Consumer Instance加入或離開Group時,也會觸發 Rebalance。
    • 注意: 如果是使用assign() API來訂閱並指定partition給consumer,則不會觸發 rebalance,用subsrcibe()才會
  • Topic的變動: 如果Group訂閱的Topic 有新增或變更(例如使用正則表達式訂閱的情況),Kafka 會根據新的 Topic 狀態進行 Rebalance。
  • Partition 數量變更

如何做 Rebalance ?

Rebalance的具體操作由Group Coordinator 負責,目前 Kafka 支援3種分配策略:

  • Range分配
  • Round-robin分配
  • 開發者自定義分配策略

Partition 的指派過程

當一個Consumer Instance要加入Group 時,會向Group Coordinator發送JoinGroup請求。
第一個成功加入的 Consumer 會被選為Group Leader,負責決定每個Consumer應該消費哪些Partition。
其過程如下:

  • GroupLeader 取得 Consumer清單:
    • 從Group Coordinator取得所有正常運作的Consumer列表。
  • 分配 Partition
    • Group Leader根據分配策略來分配每個Consumer應該消費的partition。
  • 通知 Consumer
    • Group Leader將分配結果同步給Group Coordinator,最終由Group Coordinator將分配結果通知給所有 Consumer。

值得注意的是,只有Group Leader擁有所有Partition與Consumer的指派清單,其餘的Consumer只會知道自己被分配到的 Partition。

結論

本章介紹了Rebalance的底層運作機制,以及Group Leader,GroupLeader,和Consumer Instance這些角色的互動。 下一張將以圖例,以及假設本專案會遇到的情境當例子,來說明Rebalance在實際場景是如何運作的。


上一篇
Kafka 概念介紹及部署: Consumer、Partition 及 Offset 管理
下一篇
Kafka 概念介紹及部署: 以 Line Bot 專案為例圖解Rebalance
系列文
從零開始構建能理解語義的 Linebot 架構30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言