目錄
學習目標:
一、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...