Kafka 四 請求過程

2021-08-20 23:34:39 字數 1345 閱讀 3800

元資料請求:

因為kafka所有的請求都必須經過分割槽首領,但是分割槽首領(因為建立了分割槽副本)是分布在不同的broker上面的,所以生產者在傳送訊息之前必須獲取分割槽的元資料資訊。這就是元資料請求。這種請求包含了客戶端感興趣的主題列表。伺服器端的響應訊息裡指明了這些主題所包含的分割槽、每個分割槽都有哪些副本, 以及哪個副本是首領。元資料請求可以傳送給任意乙個 broker ,因為所有 broker 都快取了這些資訊。

一般情況下,客戶端會把這些資訊快取起來,並直接往目標 broker 上傳送生產請求和獲取請求。它們需要時不時地通過傳送元資料請求來重新整理這些資訊(重新整理的時間間隔通metadata.max.age.ms引數來配置),從而知道元資料是否發生了變更一一比如,在新broker 加入集群時,部分副本會被移動到新 broker 上。另外,如果客戶端收到「非首領」錯誤,它會在嘗試重發請求之前先重新整理元資料,因為這個錯誤說明了客戶端正在使用過期的元資料資訊,之前的請求被發到了錯誤的 broker上。

生產者請求:

生產者在獲取到元資料資訊後,將訊息傳送到包含首領副本的broker上,通過配置acks來判斷是否我們寫入成功,不同的acks的寫入成功是不樣的。之後,訊息被寫入本地磁碟。在 linux 系統上,訊息會被寫到檔案系統快取裡,並不保證它們何時會被重新整理到磁碟上。kafka不會一直等待資料被寫到磁碟上一一它依賴複製功能來保證訊息的永續性。

如果訊息的acks被設定為all,那麼需要所有同步副本收到訊息才算寫入成功。請求會被儲存在乙個叫做煉獄的緩衝區裡,直到首領發現所有的跟隨者副本都複製了訊息,才會給客戶端響應。

獲取請求(消費者):

消費者可以指定分割槽和offset來對訊息進行消費,同時也可以指定消費訊息的上限大小和下限。分割槽首領獲取到請求後會先檢查請求是否有效,比如偏移量在分割槽上是否存在等等。如果請求的偏移量存在,broker將按照客戶端指定的數量上限從分割槽裡讀取訊息,再把訊息返回給客戶端。kafka使用零複製技術向客戶端傳送訊息——也就是說,kafka直接把訊息從檔案(或者更準確的說是從liunx檔案系統快取)裡傳送到網路通道,而不需要進過任何中介緩衝區。

並不是所有的訊息都可以被消費者消費的,只有哪些同步到了所有同步副本中的訊息才能被消費者消費。訊息同步的延遲時間可以通過引數replica.lag.time.max.ms來配置,它指定了副本在複製訊息時可被允許的最大延遲時間。

同步副本是指持續請求首領副本並得到最新訊息的副本。在首領發生失效時,只有同步副本才有可能被選為新首領。

同步副本的要求:

與zookeeper之間有乙個活躍的會話,也就是說,它在過去的6s(可配置)內向zookeeper 傳送過心跳。

在過去的10s 內(可配置)從首領那裡獲取過訊息。

在過去的10s內從首領那裡獲取過最新的訊息。光從首領那裡獲取訊息是不夠的,它還必須是幾乎零延遲的。

kafka 請求處理與RPC原理解析 四

kafka server啟動後,會監聽一些埠,然後開始接收請求進行日常的工作。與請求處理相關的元件有 socketserver kafkaapis kafkarequesthandlerpool。這些都是在kafka server啟動時初始化並開始執行的。socketserver是乙個nio服務,基...

kafka學習 四 kafka集群部署

1 broker.id 1 保證每個broker唯一,第一台可以不修改預設為0,後面兩台需要修改,如改為2和3 2 num.partitions 3 分割槽數量一般與broker保持一致 3 listeners plaintext 192.168 172 129 9092 修改為本機ip 4 zoo...

Kafka學習(四) Kafka架構詳解

1 生產者 api 2 消費者 api 說明 kafka訊息保留在磁碟上,並在集群內複製以防止資料丟失 不能提高資料的讀取效率 consumer group 每乙個consumer屬於乙個特定的consumer group 可以為每個consumer指定 groupname broker kafka...