Kafka 簡明教程

2021-10-12 11:02:08 字數 2634 閱讀 8992

目錄

學習目標:

一、kafka發展歷程

1、kafka一代 - 訊息佇列

2、kafka二代 - partition

3、kafka三代 - broker集群

二、kafka的訊息結構?

三、zookeeper和kafka的關係?

四、資料可靠性和重複消費

五、 pull or push

六、如何提高消費者處理效能

參考文獻&學習資源

1、kafka的特點?

2、kafka的訊息結構?

3、kafka與zookeeper的關係?

4、kafka與如何實現資料可靠性?

5、kafka如何避免訊息被重複訊息?

6、kafka如何解決訊息大量堆積的問題?

終極問題:一條訊息從生產到被消費,完整流程是怎樣的?中間會遇到哪些問題?這些問題是如何解決的?

如果能詳盡透徹地回答這個問題,那對kafka的理解也就非常深入了。

訊息中介軟體提供了乙個存放訊息的地方——生產者把訊息放進來,消費者在從中取出訊息進行處理。對於訊息中介軟體來說,乙個先進先出的佇列,是非常合適的資料結構:

那麼要怎樣保證訊息可以被順序消費呢?消費者過來獲取訊息時,每次都把index=0的資料返回過去,然後再刪除index=0的那條資料?很明顯不行,因為訂閱了這條訊息的消費者數量,可能是0,也可能是1,還可能大於1。如果每次消費完就刪除了,那麼其他訂閱了這條訊息的消費者就獲取不到這條訊息了。事實上,kafka會對資料進行持久化儲存(至於存放多長時間,這是可以配置的),消費者端會記錄乙個offset,表明該消費者當前消費到哪條資料,所以下次消費者想繼續消費,只需從offset+1的位置繼續消費就好了。消費者甚至可以通過調整offset的值,重新消費以前的資料。

這個kafka一代用一條訊息佇列實現了訊息中介軟體,這樣的簡單實現存在不少問題:

由此就引申出了kafka二代

要解決kafka一代的那兩個問題,很簡單——分布儲存。二代kafka引入了partition的概念,也就是採用多條佇列, 每條佇列裡面的訊息都是相同的topic:

partition的設計解決了上面提到的兩個問題:

乙個佇列只有一種topic,但是一種topic的訊息卻可以根據自定義的key值,分散到多條佇列中。也就是說,上圖的p1和p2,可以都是同一種topic的佇列。不過這是屬於比較高階的應用了,以後有機會再和大家討論。

kafka二代足夠完美了嗎?當然不是,我們雖然通過partition提公升了效能,但是我們忽略了乙個很重要的問題——高可用。萬一機器掛掉了怎麼辦?單點系統總是不可靠的。我們必須考慮備用節點和資料備份的問題。

很明顯,為了解決高可用問題,我們需要集群

kafka對集群的支援也是非常友好的。在kafka中,集群裡的每個例項叫做broker,就像這樣:

每個partition不再只有乙個,而是有乙個leader(紅色)和多個replica(藍色),生產者根據訊息的topic和key值,確定了訊息要發往哪個partition之後(假設是p1),會找到partition對應的leader(也就是broker2裡的p1),然後將訊息發給leader,leader負責訊息的寫入,並與其餘的replica進行同步。一旦某乙個partition的leader掛掉了,那麼只需提拔乙個replica出來,讓它成為leader就ok了,系統依舊可以正常執行。通過broker集群的設計,我們不僅解決了系統高可用的問題,還進一步提公升了系統的吞吐量,因為replica同樣可以為消費者提供資料查詢的功能。

參考文章:kafka簡明教程

我們只知道kafka內部是乙個訊息佇列,但是佇列裡的元素長什麼樣,包含了哪些訊息呢?

參考:kafka - messageformat

如果玩過kafka的quick start教程,就會發現,我們在使用kafka時,需要先啟動乙個zk,那麼這個zk的作用到底是什麼呢?

參考:what-is-the-actual-role-of-zookeeper-in-kafka

生產者把訊息發給kafka,傳送過程中掛掉、或者kafka儲存訊息時傳送異常怎麼辦?同理,消費者獲取消費時發生異常怎麼辦?甚至,如果消費者已經消費了資料,但是修改offset時失敗了,導致重複消費怎麼辦?等等這些異常場景,都是kafka需要考慮的。

參考:kafka - message delivery semantics

消費者側在獲取訊息時,是通過主動去pull訊息呢?還是由kafka給消費者push訊息?

這兩種方式各自有什麼優劣?

參考:kafka - push vs pull

還是之前的訂單建立的例子,訂單建立後,你要給使用者傳送簡訊,現在你發現由於你只有乙個消費者在傳送簡訊,忙不過來,怎麼辦?這就有了kafka裡頭的消費者組(consumer group)的設計。

參考:understanding-kafka-consumer-groups-and-consumer

官網:一些不錯的部落格:

一些不錯的書籍:

Visual Unit 簡明教程

visual unit,簡稱vu,是新一代單元測試工具,功能強大,使用簡單,完全視覺化,不需編寫測試 vu的測試結果使程式行為一目了然,有助於整理程式設計思路,提高程式設計效率和正確性,並能快速排錯 vu還增強偵錯程式功能 如自由後退 用例切換 提高除錯的效率 vu能達到空前的測試完整性,輕鬆完成語...

MYSQL簡明教程

dos進入mysql命令 c mysql h 127.0.0.1 u root p enter password mysql 進入完成 建立資料庫 create database databasename 使用指定資料庫進行操作 方法1 use database databasename 方法2 m...

Struts Hibernate簡明教程

jboss 資助的開源專案,當前比較流行的持久層框架,是一種先進的 jdbc 封裝框架。優點 提高了資料訪問層的開發效率,使我們不必直接呼叫 jdbc 來訪問關係型資料庫。hibernate 建立在物件導向的基礎之上,開發人員只需針對物件進行操作,不必再關心資料庫的連線關閉,sql的執行,以及 re...