「Kafka應用」消費者

ligkwww發表於2021-01-05

消費者

1. 消費者和消費者組

每一個消費者例項相當於一個消費者,而一個消費者必須存在於某個消費者組下,如果建立時不指定消費者組,則系統會預設建立一個。所以一個消費者組至少有一個消費者存在。

2. 分割槽和消費者組的分配(分割槽數:4)

為了實現更好的負載均衡,所以主題下可以配置多個分割槽,而每個分割槽中的資料內容不一樣。對於消費者而言,一個分割槽只能被一個消費者組下的某一個消費者使用。
原因:

  1. 避免重複消費。因為通常來講一個消費者組都是做同一件事,如果某個分割槽資料被一個組內的兩個成員都消費過,則這份資料就被消費了兩次。
  2. 方便記錄消費位移。kafka記錄消費位移是以主題-分割槽-消費者組為維度來記錄的,這樣即便是消費者數量發生變更,仍然可以計算出整個消費者對於某個分割槽消費的位移值。

注意:當消費者數量發生變化時,此前以分配好的分割槽會重新分配,在此期間所有消費者都不可用。

2.1 當消費者組數量為1

這種情況下,如果當前主題資料只被這一個消費者使用的話,4個分割槽和1個分割槽並沒有太大區別。
image

2.2 當消費者組數量為2

image

2.3 當消費者組數量為4

這種情況下效能是最高的,每一個消費者對應一個分割槽。
image

2.4 當消費者組數量為5

當消費者數量大於分割槽數時,會有一個消費者始終得不到資料,造成浪費。
image

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 協議》,轉載必須註明作者和本文連結

相關文章