我的 Kafka 旅程 - Producer

原理闡述【我的 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是最好的選擇,如日志 。生產者端 - 整體運行圖為了更好的直觀的便于理解,以圖例方式展現上述所有的闡述內容:
我的 Kafka 旅程 - Producer

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

    推薦閱讀