1. 程式人生 > >認識KafKa-KafKa架構深度剖析

認識KafKa-KafKa架構深度剖析

為什麼會有訊息佇列

  • 解耦
  • 擴充套件 能力
  • 持久化
  • 峰值處理能力
  • 可恢復

訊息佇列種類

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。