第三章:Kafka 組織的成員介紹和生產者傳送訊息機制(概念篇)
作者:pany
時間:2019-3-3 21:36
參考:Kafka 權威指南(Kafka :The Definitive Guide)
注:如果網上找不到這本書的資源,可以聯絡我,免費分享。微信:py1149050048
原書上翻譯感覺有點拗口,我根據我的理解儘可能將內容描述的通俗易懂
@all 轉載請註明出處
章節概要
本文主要講解Kafka的誕生背景和解決了什麼問題,主要章節如下:
1、Kafka 組織的成員介紹
2、生產傳送訊息機制
一、Kafka就是你們要的釋出與訂閱的訊息系統
講到這一章,我們的Kafka終於登場了,我再介紹Kafka之前,直接按自己的理解畫了一張圖,如下:

Kafka結構圖
我們先基於這張圖來說下Kafka這個組織的成員:
1、Producter:生產者,也就訊息的傳送者,產生者,負責向我們的分割槽裡傳送訊息。
2、Consumer: 消費者,訊息的訂閱者,可以訂閱一個或多個主題,並且依據訊息生產的順序讀取他們
3、Broker:一個獨立的Kafka伺服器我們稱為Broker,Broker介面來自生產者的訊息,為訊息設定偏移量(offset),並提交訊息到磁碟。Broker為消費者提供服務,對讀取分割槽的請求做出響應,返回已經提交到磁碟上的訊息。
4、Consumer Group: 消費者群組,消費者是消費者群組的一部分,一個或多個消費者可以共同讀取一個主題,但是每個分割槽只能被一個消費者使用
5、Partition:分割槽,一個分割槽就是一個提交日誌,訊息以追加的方式寫入分割槽,這樣可以保證在同一個分割槽裡面,訊息是有序的,但是整個主題裡沒辦法保證訊息是有序的。
6、批次:批次就是一組訊息,Kafka之所以有高吞吐量的特性,就是因為將訊息分批次傳送,一個批次的訊息同屬於一個主題和分割槽。有關於批次和高吞吐量後面會詳細介紹。
7、Offset:偏移量,訊息的唯一標識,是連續的序列號
8、ISR:同步副本組,這個後面會詳細介紹
9、Segment:Partition物理上由多個segment組成
二、Kafka生產者如何傳送訊息
我介紹學習Kafka的思路依然是順著我上面畫的那張圖的,生產者將訊息釋出到Broker,我們順著這條線先來了解下生產者如何傳送訊息的。說到訊息的傳送,就免不了需要討論下下面幾個問題:
1、訊息的傳送對網路的影響?
2、當有大量訊息產生時,訊息傳送和獲取是否有延遲?
3、訊息的讀寫操作之間耦合性?
為什麼我們學習訊息的傳送會討論上面幾個問題呢?現實中一旦服務之間有通訊,我們就會關心通訊對網路流量、頻寬這些是否有影響。而且我們也必須關注服務之間通訊的時效性,是否有延遲。並且我們還得考慮到應用的擴充套件性,如果說服務之間通訊的格式給固定,意味著一旦有一方作出升級時,可能會引起服務間通訊不再正常,所以我們很關心訊息的格式是否會對服務之間的讀寫操作產生強烈的耦合。而Kafka正好在這些方面都有很好的處理,我就依據這三個問題逐一去解讀。
Kafka為了減少訊息對網路的影響,將相同主題的訊息整成一個批次,也就是一組訊息,這樣就可以減少網路的開銷。試想一下,如果同一時間產生了超大量的訊息,而每一條訊息都需要單獨穿行於網路,傳送到對端,我們得有產生多少連線,得造成大量的網路開銷。但是如果我們將相同主題的訊息放入一個批次,是不是可以減少網路的連線,是不是可以減少對網路的影響。
但是訊息以批次的形式傳送之後,問題又來了,如果批次越大,單位時間內處理的訊息就越多,單個訊息的傳輸時間也會越長,這樣訊息就有可能產生延遲。有些場景下資料的時效性顯得很重要,比如說裝置的監控資料,我們裝置實時的CPU使用率、記憶體使用率等,這與這些監控指標我們會更關心資料的時效性,如果不能保證訊息實時接收到,那麼資料將毫無意義。Kafka為了訊息的時效性,於是將批次的訊息壓縮,提升資料傳輸效率。並且Kafka可以從兩個維度去設定批次傳送的標準。
第一個維度是訊息的大小,我們可以設定當一個批次達到多大,我們就可以傳送了(這個設定的引數我們後面的章節會介紹,這裡只是讓大家瞭解到這麼個思想,具體的實現後面介紹),比如我們設定一個批次訊息達到100KB就開始傳送到Broker,但是如果生產者產生的訊息很少很慢,幾分鐘甚至於半小時都無法達到這個量怎麼辦呢?是不是我們的訊息就不傳送了?所以Kafka又依據第二個維度設定了標準。
第二個維度是批次的時間,我們可以設定傳送訊息的頻率,如果在指定時間內仍然無法滿足大小,Kafka就會認為達到了時間維度的標準,也會發送訊息,很好的解決了訊息可能延遲的問題,保證了訊息的時效性。當然,如果在指定時間內,訊息提前達到了大小的標準,也會觸發訊息的傳送,也就是說訊息的傳送是按兩個維度的最低標準原則傳送的。
對於訊息讀寫操作之間的強耦合,Kafka在訊息傳送前將訊息系列化,讀取的時候再將訊息反序列化。序列化後的訊息,分為模式(Schema)和 訊息體(Data),而且Kafka推薦使用Apache Avro序列化器,它最初是Hadoop開發的序列化框架,提供一種緊湊的序列化格式,模式和訊息體是分開的,當模式發生變化時,不需要重新生成程式碼,它還支援強型別和模式進化,版本既向前相容,也向後相容。(這裡描述有點概念化,後面我們會詳細介紹)