消費者
1. 消費者和消費者組
每一個消費者例項相當於一個消費者,而一個消費者必須存在於某個消費者組下,如果建立時不指定消費者組,則系統會預設建立一個。所以一個消費者組至少有一個消費者存在。
2. 分割槽和消費者組的分配(分割槽數:4)
為了實現更好的負載均衡,所以主題下可以配置多個分割槽,而每個分割槽中的資料內容不一樣。對於消費者而言,一個分割槽只能被一個消費者組下的某一個消費者使用。
原因:
- 避免重複消費。因為通常來講一個消費者組都是做同一件事,如果某個分割槽資料被一個組內的兩個成員都消費過,則這份資料就被消費了兩次。
- 方便記錄消費位移。kafka記錄消費位移是以主題-分割槽-消費者組為維度來記錄的,這樣即便是消費者數量發生變更,仍然可以計算出整個消費者對於某個分割槽消費的位移值。
注意:當消費者數量發生變化時,此前以分配好的分割槽會重新分配,在此期間所有消費者都不可用。
2.1 當消費者組數量為1
這種情況下,如果當前主題資料只被這一個消費者使用的話,4個分割槽和1個分割槽並沒有太大區別。
2.2 當消費者組數量為2
2.3 當消費者組數量為4
這種情況下效能是最高的,每一個消費者對應一個分割槽。
2.4 當消費者組數量為5
當消費者數量大於分割槽數時,會有一個消費者始終得不到資料,造成浪費。
3. 消費者例項流程
- 配置消費者客戶端引數(設定服務節點、消費者組等引數)
- 建立消費者例項
- 訂閱主題
- 拉取資料並消費
- 提交位移(很重要,如果不提交會造成重複消費)
- 關閉消費者例項
4. 主題訂閱與分割槽
消費者需指定一個主題進行訂閱,才可以從對應主題獲取到資料。
4.1 訂閱方式
4.1.1 集合
常用的訂閱方式是集合,這種方式明確指定訂閱的主題列表(可同時訂閱多個主題),其中任一主題生產者投遞資料後都可以被當前消費者接收到。
4.1.2 正則
正則方式訂閱主題,這種方式好處在於主題名按照一定規律進行新增時,消費者客戶端程式碼不需進行調整即可實現訂閱,方便做橫向擴充套件。
4.2 訂閱型別
訂閱型別分為兩類:「主題訂閱」和「主題分割槽訂閱」,其中主題訂閱會接收主題下所有分割槽的資料,而後者則只會接收主題下指定分割槽的資料。
5. 位移提交
5.1 自動提交(預設方式)
5.1.1 引數
auto.commit = true
auto.commit.interval.ms = 5000 (自動提交間隔時間)
5.1.2 機制
自動提交為預設提交方式,消費者每隔一段時間就對已消費資料位移進行提交,此操作是在pool邏輯中實現的,在進行下一次資料拉取前會檢查當前位移是否可以提交,如果可以就會提交上一輪的位移。
5.1.3 利弊
好處:程式碼中不需要處理提交邏輯,更美觀簡潔。
壞處:容易產生重複消費。因為是間隔提交,所以在已消費未提交這個時期發生當機,那麼當伺服器恢復或再均衡之後,這段資料會被再次消費。
5.2 手動提交(同步)
5.2.1 按消費批次提交
預設無參,會提交所有分割槽已消費資料位移,在一次性拉取比較多的資料時,如果發生意外則會導致較多的資料被重複消費,所以此方式效能高但安全性較低。
5.2.2 按條件提交
可以指定分割槽引數,在程式邏輯中按照單條任務位移提交或指定分割槽位移提交。比如每消費一條資料就提交一次或按分割槽消費資料,在發生意外時儘可能的減少受影響的資料,此方式效能較低但安全性較高。
本作品採用《CC 協議》,轉載必須註明作者和本文連結