天天看點

kafka視訊觀看小結

Apache kafka:一個高吞吐量的分布式釋出訂閱消息系統

小結

  • 消息隊列有2種:點對點和釋出訂閱模式,現在點對點的模式已經不多了,畢竟一個消息可能有多個消費者,是以釋出訂閱的模式是有需求的,kafka就是釋出訂閱的模式,但是如果一個消息隻有一個消費者,也可以說是一種僞點對點模式,為什麼是僞呢?因為即使沒有消費者訂閱,消息也不會消失,即使有一個消費者,消費者完成了消費,該消息也不會消失。
  • 消息持久化,保證了安全,但是IO操作會損失一些性能,如何使性能的損失最小化呢,請看kafka的檔案系統存儲,以及使用零拷貝,核心參數配置等的設計與優化。
    • kafak發現線性的通路磁盤,很多時候比随機的記憶體通路快得多,傳統的使用記憶體做為磁盤的緩存,Kafka直接将資料寫入到日志檔案中(零拷貝),讀操作不會阻塞寫操作和其他操作,資料大小不對性能産生影響;沒有容量限制(相對于記憶體來說)的硬碟空間建立消息系統;
  • kafka的broker是無狀态的,狀态由消費者在zookeeper端維護。
  • kafka支援線上和離線的應用場景
  • Kafka的Producer、Broker和Consumer之間采用的是一套自行設計基于TCP層的協定,根據業務需求定制,而非實作一套類似Protocol Buffer的通用協定。
  • producer通常指定broker,topic,以及确認選項等
  • consumer指定broker,topic,partition等

分區:

  1. 消息分類存儲,每一類稱之為Topic,topic又被劃分為若幹分區partition(建立topic的時候可以指定分區個數),每個分區由一組有序的消息序列組成,新生産的消息則追加至末尾。
  2. 每條消息有一個序列号id,稱之為offset,唯一标記partition内的一條消息;
  3. 消費者需要維護的唯一進制資料資訊是其消費的offset值,理論上offset是線性增長的,但consumer可以指定offset的值,是以這些設計機制使consumer very cheap,開發者可以随意增删consumer,不會影響kafka叢集或者其他消費者,broker也是無狀态的;
  4. 分區partition存在的意義:将一個topic的消息進行切分,分開存儲在不同的broker上,進而使topic能夠容納更多的資料量,不受單台伺服器存儲能力的限制;另外一點是:作為并行處理的基本單元:(我的了解:1、一個partition對應一個leader broker以及若幹follower,生産者消費者僅和leader通信進行讀寫操作,隻要叢集内的leader均勻分布,則可保證每台伺服器的負載相對均衡;2、消費者又屬于某個consumer group,一條消息隻能被一個group内的一個consumer消費,是以一般情況下,一個消費者消費topic的一個分區,可見分區越多,便可以有更多的消費者并發消費,是以partition是kafka并行化的基本機關)

消費者API

  • 傳統的消息系統有兩種模型:隊列queuing和釋出訂閱publish-subscribe。隊列模型中,一條消息隻能被一個消費者消費;釋出訂閱模型中,一條消息會廣播給所有的消費者。kafka通過consumer group能同時滿足這兩種需求。
  • 消息的順序性保證:傳統的隊列保證消息在server上順序存儲,但當他将消息按照存儲順序分發給并行消費的consumer時,順序就會被打亂,無法保障有序性。當然,可以隻讓一個消費者來消費,這樣消息依然是順序的,但又違背了并行處理的初衷。
  • kafka通過partition很好的保證了順序性以及消費者的負載均衡:(這是partition存在的另一個意義吧)consumer group中的一個consumer消費一個partition,是以保證了一個分區内的消息總是被順序消費,消費者的負載也相對均衡。但是要注意:如果group内的consumer數量大于topic的partition個數,則一些消費者處于空閑狀态,而且不能保證partition之間消息的順序性,特殊場景下,可以使一個topic隻有一個分區,隻讓一個consumer進行消費,這樣便是全局有序的。