《Kafka實戰》之架構和設計邏輯

lyzx_in_csdn發表於2018-08-25
kafka架構
kafka架構圖

1、訊息佇列的型別

  1.1 點對點  

      只有一個消費者做消費TopicA,其他消費者不能消費TopicA中的訊息

  1.2釋出訂閱

    只要訂閱了某個Topic的消費者都可以消費該Topic中的資料

對於TopicA,可以由多個消費者訂閱 也可以由多多個消費者消費,同一個組中的消費者不能重複消費

eg:TopicA中有訊息  M1 M2 M3 M4 M5 M6 6條訊息

     組G1、G2    G1下有消費者C1 C2 C3   G2下有消費者  C4 C5 C6  

   如果C1可以消費了M1 C2消費了M2  C3消費了M3 ,那麼C4 C5 C6依然可以消費  M1 M2 M3 因為他們不屬於同一個組


2、kafka分割槽

   分割槽的目的

  2.1、可以使多個同一個組的消費者消費不同分割槽的資料  這樣可以做到並行消費 提升消費者的速率

  2.2、便於log的分散   kafka基於Log追加的方式持久化訊息 ,分割槽可以有效的分散日誌檔案
    生產者可以指定傳送到Topic的具體某個partition中
    生產者非同步傳送,即不會每一條訊息都傳送一次  而是先積攢在生產者的記憶體中,達到一定量的時候一起傳送,節省網路資源

3、borker


    borker通過日誌追加的方式持久化訊息 每個分割槽一個獨立的日誌檔案   kafka訊息有序
    為了減少磁碟寫入的次數,broker會將訊息暫時buffer起來,當訊息的個數(或尺寸)達到一定閥值時,再flush到磁碟,這樣減少了磁碟IO呼叫的次數 
    broker不儲存消費者的狀態 即不儲存某個消費者消費到哪兒了,有消費者自己管理
    而無狀態的訊息也使得訊息刪除也成了麻煩,kafka基於時間的SLA(服務水平保證)


4、Message    

訊息是kafka通訊的單位  每個訊息儲存在一個Partition中

每條訊息包含3個屬性

1、offset

2、訊息大小 MessageSize

3、data 訊息的具體內容


5、kafka 持久化

kafka不同於傳統的訊息佇列持久化,傳統的持久化方式是把記憶體作為磁碟的buffer,而kafka開發者發現,線性的訪問磁碟在很多時候比隨機訪問記憶體還要快,所以kafka直接把訊息線性的寫入磁碟 

寫的時候線性的寫入即順序寫入亦即線性追加,讀的時候直接讀檔案即可,這樣做的好處是讀寫不互斥,訊息的持久化不會影響訊息的讀取

持久化時每個Partition都有一個獨立的檔案,每個partition內部都是有序的,每條訊息都會有一個唯一的id即offset偏移


6、稀疏索引

kafka內部建立的是洗漱索引,所謂的稀疏索引指的是每隔一定的位元組數建立一條索引,這樣做的好處是索引檔案變小

稀疏索引圖如下

kafka稀疏索引示意圖

當需要按照offset查詢某個訊息,如果找到就直接返回,如果沒找到就按照類似於二分法的方式查詢

7、資料傳輸的事務定義

7.1、at most once:

   最多一次,如果某個消費者C1消費了Topic T1中的某個資料,offset為儲存但依然fetch不到該資料

7.2、at least once:

  至少一次,如果fetch到某條資料後offset沒有更改,此情況下依然能再次fetch到這條資料,推薦這種方式,畢竟多次消費資料比資料丟失要好得多

相關文章