1.kafka是什麼?
kafka是一個消息中間件,是一種分佈式消息發佈--訂閱系統。它的作用可以通過一個例子來粗略理解:
例:有兩個角色,生產者---用於生產雞蛋、消費者---消費雞蛋,生產者直接把生產的雞蛋提供給消費者,考慮幾個情景:
i)如果生產者一單位時間內生產一個雞蛋,而消費者一單位時間內消費一個雞蛋,則該過程可以順利進行;
ii)如果生產者生產一個雞蛋,而消費者在喫雞蛋的過程中噎住了(信息堵塞),但是生產者仍繼續生產,就會導致新生產的雞蛋丟失了(無人消費)。
iii)如果生產者一單位時間生產十個雞蛋,但是消費者一單位時間只能消費5個雞蛋,生產大於消費,仍會導致雞蛋丟失。
情景i)和ii)是使用一般的通信方法會帶來的問題。爲了解決這種問題,我們可以找一箇中間組件:如果我們有一個籃子,該籃子用於存放生產者所生產的雞蛋,而消費者從籃子裏獲取雞蛋進行消費。採用這種方式的話,我們就只需要考慮籃子夠不夠大?只要籃子夠大,生產者生產的雞蛋就不會丟失了。
如果把消息當成上述例子中的雞蛋,把消息發送方當成生產者,把消息接收方當成消費者,則kafka的作用就類似於籃子,給消息提供一箇中間存放的平臺,來保證消息不會應爲接收方出現問題而丟失。
2.kafka中的角色
Broker:安裝了kafka的節點
Topic:話題,kafka是根據話題對消息進行分類存儲的,每條消息都歸屬與一個話題
partition:分區,每個主題都有多個分區,一條消息會存入一個分區
Replicate:副本,每個分區有多個副本(備份),用來防止數據丟失
Leader:每個分區的管理者,kafka的讀寫都是通過leader完成的
Follower:當Leader掛了之後,會從Follower中選舉新的Leader
Producer:生產者,向主題中寫入數據
Consumer:消費者,從主題中讀取數據
Consumer Group:消費組
Controller:管理者(zookeeper集羣),完成leader選舉之類的。
3.kafka的讀寫
i)生產者在向kafka寫入數據的時候,需要指定寫入的主題(topic),然後按順序進行磁盤寫入
ii)消費者往kafka讀取數據時,也需要指定讀取的主題,讀取方式是,先讀取完一個數據分區之後,纔會讀取下一個數據分區,因此,我們獲取得到的數據順序並不一定寫入的順序。
iii)一條數據只能被同一個Consumer Group消費一次。因爲kafka會給每一個group對每個分區分配一個偏移量(我覺得可以理解爲順序表的讀取方式)來記錄這個group獲取到消息隊列中的哪個位置。
iv)數據讀取時,數據的定位方法 topic--> group --> partition --> offset(偏移量)
4.kafka的一些管理機制
i)所有的leader均勻分佈在所有的broker上
ii)副本數不超過broker數量
iii)如果某節點掛了,會爲該節點擔任leader的分區重新選舉leader
iv)經過一定時間段,系統會重新分配leader,來保證leader均勻分佈在所有broker上 (rebalance)
v)消費時,默認從最新數據開始消費,可通過參數選擇是否從頭開始消費