認識KafKa-KafKa架構深度剖析
阿新 • • 發佈:2019-01-12
為什麼會有訊息佇列
- 解耦
- 擴充套件 能力
- 持久化
- 峰值處理能力
- 可恢復
訊息佇列種類
ActivaMQ
- 基於JMS規範
- 支援事務
KafKa
- 輕量級,不完全服從JMS
- 無狀態代理
- 消費者分組:每個消費者屬於一個分組,每個訊息可以被多個分組獲得,但在一個分組中只有一個消費者獲得
- 主題和分割槽
KafKa架構介紹
- 生產者、消費者、Broker(代理)、Zookeeper
Topic
- KafKa用topic組織訊息
- 每條訊息都屬於且僅屬於一個Topic
- Producer釋出資料時,必須指定該訊息釋出到哪一個Topic
- Consumer訂閱訊息時,也必須指定訂閱哪個Topic的訊息
- 一個Topic的訊息可分佈在一個或多個節點(Broker)上
- 一個Topic包含一個或多個Partition
Partition(類似磁碟目錄) & segment(類似磁碟檔案)
- 在KafKa的檔案儲存中,同一個topic下有多個不同的partition(每個topic有幾個partition是在建立topic是指定的),每一個partition為一個目錄,partition命名規則為<topic名稱-有序序號>,第一個partition的有序序號為0,最後一個partition的有序序號是partition數量減1。比如:建立一個名為test的topic,有5個partition,則就有5個目錄:test-0,test-1,test-2,test-3,test-4。
- 每個partition(目錄)相當於一個巨型檔案被平均分配到多個大小相等segment(段)資料檔案中,但每個段segment file訊息數量不一定相等,這種特性方便old segment file快速被刪除。預設保留7天的資料。
- segment file由兩大部分組成,分別為index file和data file,此兩個檔案一一對應,成對出現,字尾為“.index”和“.log”分別為segment的索引檔案和資料檔案。
00000000000000000000.index
00000000000000000000.log
訊息
- 記錄只會被追加到segment中,不會被單獨刪除或者修改。
- 清除過期日誌時,直接刪除一個或多個segment,保留策略。
- 每個訊息只屬於一個並且只屬於一個topic。
Consumer group
- 每個consumer只是consumer group中的一個程序。一個topic中的一條訊息只能被consumer group中的一個consumer程序消費。也就是說,如果要求topic中中的某訊息被多個consumer消費,則這些consumer必須在不同的consumer group中。
offset(偏移量)
- broker是無狀態的,也就是說,在broker中不儲存哪些訊息被哪些consumer消費了,這些消費記錄被設計儲存在consumer中。consumer總是從一個特定的partition順序地消費訊息,並應答消費了的訊息的offset。