消息隊列——Kafka學習

點對點消息傳遞模式

生產者發送一條消息到queue,只有一個消費者能收到。

發佈-訂閱消息傳遞模式

發佈者發送到topic的消息,只有訂閱了topic的訂閱者纔會收到消息。

一、Kafka中核心概念

(1)Broker(代理)

是一個物理概念。
一臺kafka服務器就可以稱之爲broker.一個集羣由多個broker組成,一個broker可以有多個topic

(2)Topic(主題)

是一個邏輯概念。
每一條發送到kafka集羣的消息都可以有一個類別,這個類別叫做topic,不同的消息會進行分開存儲,如果topic很大,可以分佈到多個broker上,也可以這樣理解:
topic被認爲是一個隊列,每一條消息都必須指定它的topic,可以說我們需要明確把消息放入哪一個隊列。

對於傳統的message queue而言,一般會刪除已經被消費的消息,而Kafka集羣會保留所有的消息,無論其被消費與否。
當然,因爲磁盤限制,不可能永久保留所有數據(實際上也沒必要),因此Kafka提供兩種策略刪除舊數據。一是基於時間,二是基於Partition文件大小。例如可以通過配置$KAFKA_HOME/config/server.properties,讓Kafka刪除一週前的數據,也可在Partition文件超過1GB時刪除舊數據。

(3)Partition(分區)

是一個物理概念。
爲了使得kafka吞吐量線性提高,物理上把topic分成一個或者多個分區,每一個分區是一個有序的隊列。且每一個分區在物理上都對應着一個文件夾,該文件夾下存儲這個分區所有消息和索引文件。分區的表示: topic名字-分區的id。

  1. 分區中每條消息都有一個當前Partition下唯一的64字節的offset,它指明瞭這條消息的起始位置。
  2. 每個Partition是有序的,Kafka只保證一個分區的數據順序發送給消費者,而不保證整個topic裏多個分區之間的順序。
  3. Kafka中數據存儲的基本單元。
  4. 消費時,每個消費線程最多隻能使用一個partition。
  5. 一個topic中partition的數量,就是每個Consumer group中消費該topic的最大並行度數量。
  6. 一個topic數據,會被分散存儲到多個Partition,一個Partition只會存在一個Broker上

補充

  • 每一個Topic被切分爲多個Partition
  • 消費者數目少於或等於Partition的數目
  • Broker Group中的每一個Broker保存Topic的一個或多個Partition
  • Consumer Group中的僅有一個Consumer讀取Topic的一個或多個Partition,並且是惟一的Consumer
(4)Replicas(副本)

Q:一旦某一個Broker宕機,則其上所有的Partition數據都不可被消費,所以需要對分區備份。其中一個宕機後其它Replica必須要能繼續服務並且即不能造成數據重複也不能造成數據丟失。

如果沒有一個Leader,所有Replica都可同時讀/寫數據,那就需要保證多個Replica之間互相(N×N條通路)同步數據,數據的一致性和有序性非常難保證,大大增加了Replication實現的複雜性,同時也增加了出現異常的機率。而引入Leader後,只有Leader負責數據讀寫,Follower只向Leader順序Fetch數據(N條通路),系統更加簡單且高效。

每一個分區,根據複製因子N,會有N個副本,比如在broker1上有一個topic,分區爲topic-1, 複製因子爲2,那麼在兩個broker的數據目錄裏,就都有一個topic-1,其中一個是leader,一個replicas。
同一個Partition可能會有多個Replica,而這時需要在這些Replication之間選出一個Leader,Producer和Consumer只與這個Leader交互,其它Replica作爲Follower從Leader中複製數據、

  • 同一個Partition可能會有多個Replication
  • 多個Replication之間數據是一樣的
  • 需要一個Leader負責該Partition上與Producer和Consumer交互

Replication Manager

  • 負責管理當前Broker所有分區和副本的信息
  • 處理KafkaController發起的一些請求
  • 副本狀態的切換
  • 添加、讀取消息等

補充

  • 當集羣中有Broker掛掉的情況,系統可以主動地使Replication提供服務
  • 系統默認設置每一個Topic的Replication係數爲1,可以在創建Topic時單獨設置
  • Replication的基本單位是Topic的Partition
  • 所有的讀和寫都從Replication Leader進行,Replication Followers只是作爲備份
  • Replication Followers必須能夠及時複製Replication Leader的數據
  • 增加容錯性與可擴展性
(5)Consumer group

爲了便於實現MQ中的多播,重複消費等引入的概念。如果ConsumerA以及ConsumerB同在一個Consumer Group,那麼ConsumerA消費的數據ConsumerB就無法消費了。

  • 對於同一個topic,會廣播給不同的Group
  • 一個Group中,只有一個Consumer可以消費該消息

即:所有Consumer Group中的consumer使用一套offset。

(6)Offset

Offset專指Partition以及User Group而言,記錄某個User Group在某個partiton中當前已經消費到達的位置。

什麼是消費者組(Consumer Group):
consumer group是kafka提供的可擴展且具有容錯性的消費者機制。既然是一個組,那麼組內必然可以有多個消費者或消費者實例(consumer instance),它們共享一個公共的ID,即group ID。組內的所有消費者協調在一起來消費訂閱主題(subscribed topics)的所有分區(partition)。當然,每個分區只能由同一個消費組內的一個consumer來消費。理解consumer group記住下面這三個特性就好了:

  1. consumer group下可以有一個或多個consumer instance,consumer instance可以是一個進程,也可以是一個線程
  2. group.id是一個字符串,唯一標識一個consumer group
  3. consumer group下訂閱的topic下的每個分區只能分配給某個group下的一個consumer(當然該分區還可以被分配給其他group)

同一個topic的消息,可以並行被不同的消費者組消費,但是每一個消費者組內只能有一個消費者來消費這個消息

(7)Producer:數據生產者
  • 消息和數據的生產者
  • 向Kafka的一個topic發佈消息的進程或代碼或服務
(8)Consumer:數據消費者
  • 消息和數據的消費者
  • 向Kafka訂閱數據(topic)並且處理其發佈的消息的進程或代碼或服務

二、Kafka架構

(1)基本結構

Kafka功能結構
在這裏插入圖片描述
Kafka數據流勢
在這裏插入圖片描述
Kafka消息結構
在這裏插入圖片描述

  • Offset:當前消息所處於的偏移
  • Length:消息的長度
  • CRC32:校驗字段,用於校驗當前信息的完整性
  • Magic:很多分佈式系統都會設計該字段,固定的數字,用於快速判定當前信息是否爲Kafka消息
  • attributes:可選字段,消息的屬性
  • Timestamp:時間戳
  • Key Length:Key的長度
  • Key:Key
  • Value Length:Value的長度
  • Value:Value

功能特點
(1)分佈式

  • 多分區,多副本,多訂閱者,基於Zookeeper調度

(2)高性能

  • 高吞吐量,低延遲,高併發

(3)持久性與擴展性

  • 數據可持久化,容錯性,支持在線水平擴展,消息自動平衡

(二)應用場景

消息隊列,行爲跟蹤,元信息監控,日誌收集,流處理,事件源,持久性日誌(commit log)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章