在公司做數(shù)據(jù)推送時,開始接觸kafka。由于那一套kafka數(shù)據(jù)推送的框架并不是筆者本人搭建的,因此只是停留在淺顯的使用上。
學技術就是這樣,不會、沒見過、看不懂,官方英文文檔就像婆娘的裹腳布又臭又長等等,這些困難都別怕。技術就像一個工具,先淺顯的用,用的大致熟了,再去了解這個工具,等深入了解了,再去總結歸納這個工具,最后有能力者,改進這個工具。
本次關于kafka學習的筆記,將分為四個部分進行:
- kafka綜述:簡要歸納kafka是什么
- 本地運行:從github上把kafka項目拉下來,本地命令行運行
- Kafka Manager: github上開源的kafka管理工具,為kafka消息的發(fā)送接收提供可視化操作界面
- write demo:寫自己的
producer和consumer,并簡單地應用kafka
kafka是什么呢?
kafka是一個分布式、可分區(qū)的消息系統(tǒng)。之前看過一篇博客,比喻的很好。發(fā)消息的系統(tǒng)是生產(chǎn)者(producer),而接收消息的系統(tǒng)是消費者(consumer),如果把消息比喻為雞蛋,那么生產(chǎn)者就是母雞,而消費者可以理解為吃雞蛋的人。母雞下一個蛋,人就吃一個蛋,很和諧。如果人吃雞蛋的時候噎住了(系統(tǒng)宕機了),那母雞后面下的蛋就會丟失(數(shù)據(jù)丟失了),而如果母雞下蛋速度超過人吃雞蛋的速度,那人就會吃不消,消息就會堵塞,導致系統(tǒng)超時,雞蛋又會丟失。這個時候就需要一個籃子,把雞蛋周轉一下。kafka就是這樣一個籃子。
好吧,具體先根據(jù)我自己在做的業(yè)務來分析吧?!皵?shù)據(jù)推送”是企業(yè)級應用比較常見一個功能,將數(shù)據(jù)從一個系統(tǒng)中推送到另一個系統(tǒng)中,可以用spring 的Integration來實現(xiàn),而應用kafka是一個更好的解決方案。
我們把要推送數(shù)據(jù)的主鍵(id)、操作類型(update、delete等)、關鍵字(key:表示是哪個實體對應的數(shù)據(jù))封裝為一個model,把這個model當做消息發(fā)送給kafka,而消費者從kafka主動pull這個model,消費者拿到model后,解析它,并根據(jù)解析的model直接、主動從生產(chǎn)者那兒讀取所要推送的數(shù)據(jù)。
這樣做的好處顯而易見,生產(chǎn)者那邊推送會非常快,因為只需要推送一個model即可,用戶就可以去做其他事情了。此外,要推送的數(shù)據(jù)也不會丟失,因為消息(model)被安全的保存在kafka中,如果消費者沒有成功保存數(shù)據(jù),那么再去讀這個消息即可。這得益于kafka的優(yōu)良設計。
kafka名詞解釋
-
producer生產(chǎn)者,主動發(fā)消息的系統(tǒng)(下蛋的母雞) -
consumer消費者,主動向kafka讀消息的系統(tǒng)(吃蛋的人) -
topic主題,可以理解為向雞蛋上貼一個標簽,吃蛋的人不是每個雞蛋都吃,它只吃某個topic的雞蛋。
-broker可以理解為籃子 -
partition分區(qū),kafka對于一個topic會有多個分區(qū)去保存消息。 -
offset偏移量,是一個整數(shù),就像指針,這個偏移量是消費者去控制的,偏移量指著幾,就去讀分區(qū)上的對應數(shù)字的消息。一個分區(qū)、一個消費者對應一個offset。

分區(qū)可以處理更多的消息,不受單臺服務器的限制;分區(qū)可以作為并行處理的單元
kafka 分布式(Distribution)
一個topic的分區(qū)被分布到集群中的多個服務器上。每個服務器處理它分到的分區(qū)。 根據(jù)配置每個分區(qū)還可以復制到其它服務器作為備份容錯。 每個分區(qū)有一個leader,零或多個follower。Leader處理此分區(qū)的所有的讀寫請求,而follower被動的復制數(shù)據(jù)。如果leader宕機,其它的一個follower會被推舉為新的leader。 一臺服務器可能同時是一個分區(qū)的leader,另一個分區(qū)的follower。 這樣可以平衡負載,避免所有的請求都只讓一臺或者某幾臺服務器處理。
生產(chǎn)者往某個Topic上發(fā)布消息。生產(chǎn)者也負責選擇發(fā)布到Topic上的哪一個分區(qū)。最簡單的方式從分區(qū)列表中輪流選擇。也可以根據(jù)某種算法依照權重選擇分區(qū)。開發(fā)者負責如何選擇分區(qū)的算法。
通常來講,消息模型可以分為兩種, 隊列和發(fā)布-訂閱式。 隊列的處理方式是 一組消費者從服務器讀取消息,一條消息只有其中的一個消費者來處理。在發(fā)布-訂閱模型中,消息被廣播給所有的消費者,接收到消息的消費者都可以處理此消息。Kafka為這兩種模型提供了單一的消費者抽象模型: 消費者組 (consumer group)。 消費者用一個消費者組名標記自己。 一個發(fā)布在Topic上消息被分發(fā)給此消費者組中的一個消費者。 假如所有的消費者都在一個組中,那么這就變成了queue模型。 假如所有的消費者都在不同的組中,那么就完全變成了發(fā)布-訂閱模型。 更通用的, 我們可以創(chuàng)建一些消費者組作為邏輯上的訂閱者。每個組包含數(shù)目不等的消費者, 一個組內多個消費者可以用來擴展性能和容錯。正如下圖所示:

通過并行topic的parition —— kafka提供了順序保證和負載均衡。每個partition僅由同一個消費者組中的一個消費者消費到。并確保消費者是該partition的唯一消費者,并按順序消費數(shù)據(jù)。每個topic有多個分區(qū),則需要對多個消費者做負載均衡,但請注意,相同的消費者組中不能有比分區(qū)更多的消費者,否則多出的消費者一直處于空等待,不會收到消息。
也就是說,在一個消費者組中,消費者與分區(qū)是一對多的關系。
關于kafka更多的信息,請參見這里。