我的 Kafka 旅程 – Producer

原理闡述

Producer生產者是數據的入口,它先將數據序列化後於內存的不同隊列中,它用push模式再將內存中的數據發送到服務端的broker,以追加的方式到各自分區中存儲。生產者端有兩大線程,以先後的順序,分別負責各自的任務處理,可並行或同步的方式,完成生產者端的所有處理過程。

生產者端的兩大線程

  • 生產者線程:先將數據按規則放到內存當中
  • Sender線程:再將內存中的數據發送到broker

生產者線程

生產者線程發送數據,經過序列化後再內存中分隊列存儲,每個隊列中的數據塊默認為16K,每個數據塊的過期時間為0ms。

內存中有多個分區隊列,生產者線程的分區工作原理/三大分區策略:

  • 線程中的send方法指定分區號的,按指定分區存放
  • 線程中的send方法無分區號的,有 key value 的,按key的hash值計算出一個固定區號存放
  • 線程中的send方法只有value的,一個數據塊填滿後,隨機按序平均存放到不同的分區

生產者線程也可以自定義分區策略

  • 自定義類實現 Partitioner 接口
  • 重寫 Partition 方法(按收到的消息,指定到分區)
  • 實現類配置到 Producer Properties 中

Sender線程

Sender線程處理生產者線程於內存中的隊列數據塊,它建立內存隊列與服務端broder分區的數據通道,當數據塊達到16K或超過過期時間,從內存中取出數據塊並發送到服務端broker對應的分區;默認情況下,不用等broker分區的應答,最多連續發送5個數據塊,失敗時重發;數據塊發送成功後,內存隊列中的相應數據塊刪除,再進行下一次的發送。

服務端broker分區中,有兩種不同的角色,leader 和 副本,leader負責接收數據,並把數據同步給各個副本以做備份,當Leader發送異常狀況後,可啟用副本繼續運行。後續章節再繼續闡述broker分區的內容。

當Sender線程將內存中的數據塊發送給服務端的broker leader 時,borker 對 Sender線程的應答機制:

  • 0:broker leader接收的數據,不用等保存到磁盤就及時應答給Sender線程
  • 1:leader保存磁盤後,不用等同步給副本,就應答給負責發送的Sender線程
  • 2、leader和副本全部都磁盤保存完成後,再應答給負責發送的Sender線程

按實際場景可以選擇broker不同的應答機制:
如果對數據的完整性要求最高的話,應答機制2是最好的選擇,如銀行流水數據;
如果對處理速度要求最高的話,允許偶然個別數據的缺失,應答機制0是最好的選擇,如日誌。

生產者端 – 整體運行圖

為了更好的直觀的便於理解,以圖例方式展現上述所有的闡述內容:

上圖需要關注的點:
序列化的數據壓縮方式、
數據分區策略、
內存總大小、
內存數據塊大小、
數據塊過期時間、
broker應答機制。

Tags: