【Kafka筆記】1.Kafka概述

1. 定義

Kafka是一個分佈式的基於發佈/訂閱模式消息隊列(Message Queue),主要應用於大數據實時處理領域。

2. 消息隊列

2.1 傳統消息隊列的應用場景

傳統使用場景就是異步處理:
在這裏插入圖片描述
使用消息隊列的好處:
1)解耦
允許你獨立的擴展或修改兩邊的處理過程,只要確保它們遵守同樣的接口約束。
2)可恢復性
系統的一部分組件失效時,不會影響到整個系統。消息隊列降低了進程間的耦合度,所
以即使一個處理消息的進程掛掉,加入隊列中的消息仍然可以在系統恢復後被處理。
3)緩衝
有助於控制和優化數據流經過系統的速度,解決生產消息和消費消息的處理速度不一致
的情況。
4)靈活性 & 峯值處理能力
在訪問量劇增的情況下,應用仍然需要繼續發揮作用,但是這樣的突發流量並不常見。
如果爲以能處理這類峯值訪問爲標準來投入資源隨時待命無疑是巨大的浪費。使用消息隊列能夠使關鍵組件頂住突發的訪問壓力,而不會因爲突發的超負荷的請求而完全崩潰。(也稱之爲去峯)
5)異步通信
很多時候,用戶不想也不需要立即處理消息。消息隊列提供了異步處理機制,允許用戶
把一個消息放入隊列,但並不立即處理它。想向隊列中放入多少消息就放多少,然後在需要的時候再去處理它們。

2.2 消息隊列的兩種模式
  1. 點對點模式(一對一,消息主動拉取數據,消息收到後清楚)
    消費生產者生產消息發送到Queue中,然後消費者從Queue中拉取並消費消息。消息被消費後,queue中不在存儲該消息,所以消息消費者不能消費已經被消費的消息。Queue支持存在多個消費者,但是對一個消息來說,只能有一個消費者得到這個消息。
    在這裏插入圖片描述
  2. 發佈/訂閱模式(一對多,消費者消費數據之後不會清理消息)
    消息生產者(發佈)將消息發佈到topic中,同時有多個消息消費者訂閱該topic。和點對點方式不同的是,發佈的topic的消息將被所有訂閱者消費。
    發佈訂閱模式有兩種數據消費方式:1. 推方式,生產者主動推送給多個消費者消費消息,2.拉方式,消費者從topic中拉取消息進行消費。而kafka採用的是拉方式。
    採用拉方式有一個缺點就是消費者需要和生產者保持長輪詢,所以在沒有消息生產的時候會產生資源浪費。而推的方式會產生消費者消費更不上生產的速度或者生產者跟不上消費者的速度等問題。

Kafka基礎架構

基礎概念:
  1. Producer
    主題(消息)生產者,發佈消息的對象稱之爲主題生產者(Kafka topic producer)
  2. Consumer
    主題(消息)消費者,訂閱消息並處理髮布的消息的對象稱之爲主題消費者
  3. Consumer Group
    消費者組,由多個consumer組成。消費者組內每個消費者負責消費不同分區的數據,一個分區只能有一個組內消費者消費;消費者組之間互不影響。所有的消費者都屬於某個消費者組,即消費者組是邏輯上的一個訂閱者。,在消費者組中還有一個組內分區的策略算法,根據不同的策略,會有不同的分區規則。
  4. Broker
    已發佈的消息保存在一組服務器中,稱之爲Kafka集羣。集羣中的每一個服務器都是一個代理(Broker)。消費者可以訂閱一個或者多個主題(topic),並從Broker拉取數據,從而消費這些已經發布的數據。
  5. Topic
    Kafka將這些消息分門別類,每一類消息稱之爲主題(Topic)
  6. Partition
    爲了實現擴展性,一個非常大的topic可以分佈到多個broker(即服務器)上,一個topic可以分爲多個partition,每個partition都是有序的隊列。分區的作用還有:1。topic的負載均衡;2。提高讀寫的並行度。
  7. Replica
    副本,做容災處理。爲保證集羣中的某個節點發生故障時,該節點上的 partition 數據不丟失,且kafka任然可以正常工作,kafka提供副本機制,一個topic的每個分區都有若干個副本,一個leader和若干個follower
  8. leader
    每個分區多個副本的"主",生產者發送數據的對象,以及消費者消費數據的對象都是leader
  9. follower
    每個分區多個副本的"從",實時從leader中同步數據,保持和leader數據的同步。leader發生故障時,通過推舉算法某個follower就會成爲新的leader

在這裏插入圖片描述

主題和日誌(Topic和Log)

Topic是發佈消息的類別名,一個topic可以有0個,一個或者多個消費者訂閱該主題的消息。
對於每個Topic,kafka集羣都會維護一個分區log,就像下圖:
在這裏插入圖片描述
每個分區都是一個順序的,不可變的消息隊列,並且可以持續的添加。分區中的消息都被分爲一個序列號,稱之爲偏移量(offset),在每個分區中此偏移量都是唯一的。

Kafka集羣保持所有的消息,直到他們過期(無論消息是否被消費)。實際上消費者所持有的僅有的元數據就是這個offset(偏移量),也就是說offset由消費者來控制:正常情況下當消費者消費消息的時候,偏移量也線性的增加。但是實際偏移量由消費者控制,消費者可以將偏移量設置成更早的位置,重複讀取消息。一個消費者不會影響其他消費者對此log的處理。
在這裏插入圖片描述
分區。Kafka中採用分區的設計有幾個目的。一是可以處理更多的消息,不受單臺服務器的限制。Topic擁有多個分區意味着它可以不受限的處理更多的數據。第二,分區可以作爲並行處理的單元。

分佈式(Distribution)

Log的分佈式被分佈到集羣中的多個服務器上。每個服務器處理它分到的分區。根據配置每個分區還可以複製到其他服務器作爲備份容錯。每個分區都有一個leader,零或者多個follower。leader處理次分區的所有的讀寫請求,而follower被動的複製數據。如果leader溶劑,其他的一個follower會被推舉爲新的leader。一臺服務器可能同時是一個分區的leader,另一分區的follower。這樣就可以平衡負載,避免所有的請求都只讓一臺或者某幾臺服務器處理。

Geo-Replication(異地數據同步技術)

Kafka MirrorMaker爲羣集提供geo-replication支持。藉助MirrorMaker,消息可以跨多個數據中心或雲區域進行復制。 您可以在active/passive場景中用於備份和恢復; 或者在active/passive方案中將數據置於更接近用戶的位置,或數據本地化。

生產者(Producers)

生產者往某個Topic上發佈消息。生產者也負責選擇發佈到Topic上的哪一個分區。最簡單的方式從分區列表中輪流選擇。也可以根據某種算法依照權重選擇分區。開發者負責如何選擇分區的算法。

消費者(Consumers)

通常來講,消息模型可以分爲兩種, 隊列發佈-訂閱式。 隊列的處理方式是 一組消費者從服務器讀取消息,一條消息只有其中的一個消費者來處理。在發佈-訂閱模型中,消息被廣播給所有的消費者,接收到消息的消費者都可以處理此消息。Kafka爲這兩種模型提供了單一的消費者抽象模型: 消費者組 (consumer group)。 消費者用一個消費者組名標記自己。 一個發佈在Topic上消息被分發給此消費者組中的一個消費者。 假如所有的消費者都在一個組中,那麼這就變成了queue模型。 假如所有的消費者都在不同的組中,那麼就完全變成了發佈-訂閱模型。 更通用的, 我們可以創建一些消費者組作爲邏輯上的訂閱者。每個組包含數目不等的消費者, 一個組內多個消費者可以用來擴展性能和容錯。正如下圖所示:

在這裏插入圖片描述
2個kafka集羣託管4個分區(P0-P3),2個消費者組,消費組A有2個消費者實例,消費組B有4個。

正像傳統的消息系統一樣,Kafka保證消息的順序不變。 傳統的隊列模型保持消息,並且保證它們的先後順序不變。但是, 儘管服務器保證了消息的順序,消息還是異步的發送給各個消費者,消費者收到消息的先後順序不能保證了。這也意味着並行消費將不能保證消息的先後順序。傳統的消息系統,消息的順序處理很讓人頭痛。如果只讓一個消費者處理消息,又違背了並行處理的初衷。 在這一點上Kafka做的更好,儘管並沒有完全解決上述問題。 Kafka採用了一種分而治之的策略:分區。 因爲Topic分區中消息只能由消費者組中的唯一一個消費者處理,所以消息肯定是按照先後順序進行處理的。但是它也僅僅是保證Topic的一個分區順序處理,不能保證跨分區的消息先後處理順序。 所以,如果你想要順序的處理Topic的所有消息,那就只提供一個分區。

Kafka的保證(Guarantees)
  1. 生產者發送到一個特定的Topic的分區上,消息將會按照它們發送的順序依次加入,也就是說,如果一個消息M1和M2使用相同的producer發送,M1先發送,那麼M1將比M2的offset低,並且優先的出現在日誌中。
  2. 消費者收到的消息也是此順序。
  3. 如果一個Topic配置了複製因子(replication factor)爲N, 那麼可以允許N-1服務器宕機而不丟失任何已經提交(committed)的消息。
kafka作爲一個消息系統
  1. kafka的流與傳統企業消息系統相比的概念如何?
    傳統的消息有兩種模式:隊列發佈訂閱。在隊列模式中,消費者池從服務器讀取消息(每個消息只被其中一個讀取);發佈訂閱模式:消息廣播給所有的消費者。這兩種模式都有優缺點,隊列的優點是允許多個消費者瓜分處理數據,這樣可以擴展處理。但是,隊列不像多個訂閱者,一旦消息者進程讀取後故障了,那麼消息就丟了。而發佈和訂閱允許你廣播數據到多個消費者,由於每個訂閱者都訂閱了消息,所以沒辦法縮放處理。

    kafka中消費者組有兩個概念:隊列:消費者組(consumer group)允許同名的消費者組成員瓜分處理。發佈訂閱:允許你廣播消息給多個消費者組(不同名)。

    kafka的每個topic都具有這兩種模式。

  2. kafka有比傳統消息系統更強的順序保證
    傳統的消息系統按順序保存數據,如果多個消費者從隊列消費,則服務器按存儲的順序發送消息,但是,儘管服務器按順序發送,消息異步傳遞到消費者,因此消息可能亂序到達消費者。這意味着消息存在並行消費的情況,順序就無法保證。消息系統常常通過僅設1個消費者來解決這個問題,但是這意味着沒用到並行處理。

    kafka做的更好。通過並行topic的parition —— kafka提供了順序保證和負載均衡。每個partition僅由同一個消費者組中的一個消費者消費到。並確保消費者是該partition的唯一消費者,並按順序消費數據。每個topic有多個分區,則需要對多個消費者做負載均衡,但請注意,相同的消費者組中不能有比分區更多的消費者,否則多出的消費者一直處於空等待,不會收到消息。

參考資料:
本系列筆記資料都是來自以下兩個來源,代碼是自己本地測試好的,可直接複製測試。
orchome
尚學堂視頻網

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