kafka高吞吐,低延遲的分布式消息隊列


核心概念

  • broker是kafka的節點,多台broker集群就是kafka

  • topic消息分為多個topic

  • partition分區,topic划分了多個partition分區,存在負載均衡策略

    每個分區由一個個消息構成,消息在分區中被標識了遞增的序號(表明了消息的偏移量)

    每個分區各自維護一套偏移量

  • producer生產者,選擇topic插入消息數據。根據kafka的分配策略,將消息插入某個分區隊尾。

  • consumer消費者,選擇topic並根據offset偏移量來獲取消息數據,記錄當前讀取的消息的偏移量,下次讀取從前一次的偏移量基礎上繼續讀取。

    消費者需要自己保存偏移量,通過修改偏移量實現讀取不同位置的消息。多個消費者不會相互影響,線程安全,實現高並發消費。

  • 消息數據的刪除時間默認為7天

  • 以partition為單位進行備份,每個partition設置一個leader(本身)和若干follower,隨機分配在集群上。leader處理讀寫請求,follower不對外服務,拉取leader數據。

  • 消費者組

    偏移量實際屬於消費者組。用戶綁定消費者組,消費者組之間相互獨立。

    一條消息在一個組內只能消費一次,組中的多個用戶不能多次讀取這條消息

    組會阻塞多用戶同時訪問一個分區

集群部署

 

 

消息同步ISR

isr列表監控follower的同步狀態,isr列表由leader動態維護。

將同步狀態滿足條件的follower記錄在列表中,將不滿足條件的follower移出列表。

leader下線后,從isr列表中的follower中選舉新的leader

條件參數

  • follower的fech拉取請求間隔時間(10s)

    replica.lag.time.max.ms=10000

  • leader與follower相差記錄數(4000)

    replica.lag.max.messages=4000

API

生產者

 

消費者

 

數據丟失和重復讀取

生產者消息丟失

原因1:kafka數據先存儲在內存中,一段時間后溢寫到硬盤中。那么節點宕機,在內存中的消息未持久化,隨着內存一起丟失。

原因2:分區主從備份,leader分區宕機,從分區未及時拉取同步,導致數據丟失

處理方式:修改持久化觸發參數(數據量,時間)

處理方式:修改。。。。

消息丟失(消費者)

原因:在High level模式下,客戶端向zk提交了偏移量,但數據讀取時消費節點掛了,導致偏移量之前的數據沒處理完畢。消費節點再次上線,從zk獲取偏移量並向后讀取,之前的數據不再處理,最終導致消費數據的丟失。

解決:客戶端每條消息處理完,再手動提交偏移量,關閉偏移量自動提交。

重復消費(消費者)

原因:數據處理完以后,偏移量自動提交,設置間隔時間較長。節點宕機后,獲取的偏移量是前一次的,節點會重復執行已執行的消息。

解決:手動提交數偏移量

高吞吐

高吞量

  • pagecache(頁緩存),基於系統內存的數據接收

  • 磁盤順序寫,相對隨機存效率百倍以上,尤其對於磁盤存儲。

高吐量

  • 零拷貝計數

    pagecache -- 網卡bufffer(數據)+socket(描述符)-- 客戶端

高吞吐

  • producer消息存入速度與consumer讀取數據速度維持均衡,保證在數據flush到磁盤前讀取數據,實現只在pagecache內存層面的隊列高速吞吐。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM