一文看懂-Kafka消息隊列


一、Kafka簡介

1.1 什么是kafka

kafka是一個分布式、高吞吐量、高擴展性的消息隊列系統。kafka最初是由Linkedin公司開發的,后來在2010年貢獻給了Apache基金會,成為了一個開源項目。主要應用在日志收集系統和消息系統,相信大家之前也聽說過其他的消息隊列中間件,比如RabbitMQ、AcitveMQ,其實kafka就是這么一個東西,也可以叫做KafkaMQ。總之,Kafka比其他消息隊列要好一點,優點也比較多,穩定性和效率都比較高,大家都說好,那就是真的好。

1.2 Kafka中的相關概念

在理解Kafka的相關概念之前,我們先來看一張圖,這張圖基本上包括了Kafka所有的概念,對於我們理解Kafka十分有幫助。

上圖中包含了2個Producer(生產者),一個Topic(主題),3個Partition(分區),3個Replica(副本),3個Broker(Kafka實例或節點),一個Consumer Group(消費者組),其中包含3個Consumer(消費者)。下面我們逐一介紹這些概念。

1.2.1 Producer(生產者)

生產者,顧名思義,就是生產東西的,也就是發送消息的,生產者每發送一個條消息必須有一個Topic(主題),也可以說是消息的類別,生產者源源不斷的向kafka服務器發送消息。

1.2.2 Topic(主題)

每一個發送到Kafka的消息都有一個主題,也可叫做一個類別,類似我們傳統數據庫中的表名一樣,比如說發送一個主題為order的消息,那么這個order下邊就會有多條關於訂單的消息,只不過kafka稱之為主題,都是一樣的道理。

1.2.3 Partition(分區)

生產者發送的消息數據Topic會被存儲在分區中,這個分區的概念和ElasticSearch中分片的概念是一致的,都是想把數據分成多個塊,好達到我們的負載均衡,合理的把消息分布在不同的分區上,分區是被分在不同的Broker上也就是服務器上,這樣我們大量的消息就實現了負載均衡。每個Topic可以指定多個分區,但是至少指定一個分區。每個分區存儲的數據都是有序的,不同分區間的數據不保證有序性。因為如果有了多個分區,消費數據的時候肯定是各個分區獨立開始的,有的消費得慢,有的消費得快肯定就不能保證順序了。那么當需要保證消息的順序消費時,我們可以設置為一個分區,只要一個分區的時候就只能消費這個一個分區,那自然就保證有序了。

1.2.4 Replica(副本)

副本就是分區中數據的備份,是Kafka為了防止數據丟失或者服務器宕機采取的保護數據完整性的措施,一般的數據存儲軟件都應該會有這個功能。假如我們有3個分區,由於不同分區中存放的是部分數據,所以為了全部數據的完整性,我們就必須備份所有分區。這時候我們的一份副本就包括3個分區,每個分區中有一個副本,兩份副本就包含6個分區,一個分區兩份副本。Kafka做了副本之后同樣的會把副本分區放到不同的服務器上,保證負載均衡。講到這我們就可以看見,這根本就是傳統數據庫中的主從復制的功能,沒錯,Kafka會找一個分區作為主分區(leader)來控制消息的讀寫,其他的(副本)都是從分區(follower),這樣的話讀寫可以通過leader來控制,然后同步到副本上去,保證的數據的完整性。如果有某些服務器宕機,我們可以通過副本恢復數據,也可以暫時用副本中的數據來使用。

 PS:這個東西實際跟ElasticSearch中的副本是完全一致的,不愧是一個爹出的東西,思想啥的都是一樣的。

1.2.5 Broker(實例或節點)

這個就好說了,意思就是Kafka的實例,啟動一個Kafka就是一個Broker,多個Brokder構成一個Kafka集群,這就是分布式的體現,服務器多了自然吞吐率效率啥的都上來了。

1.2.6 Consumer Group(消費者組)和 Consumer(消費者)

Consume消費者來讀取Kafka中的消息,可以消費任何Topic的數據,多個Consume組成一個消費者組,一般的一個消費者必須有一個組(Group)名,如果沒有的話會被分一個默認的組名。

1.3 Kafka的架構與設計

一般的來說,一個Kafka集群包含一個或多個的Producer,一個或多個的Broker,一個或多個的Consumer Group,和一個Zookeeper集群。Kafka通過Zookeeper管理集群配置,管理集群在運行過程中負責均衡、故障轉移和恢復什么的。Producer使用Push(推送)的方式將消息發布到Broker,Consumer使用Pull(拉取)的方式從Broker獲取消息,兩者都是主動操作的。

1.3.1 Topic和Partition

Kafka最初設計初衷就是高吞吐率、速度快。所以在對Topic和Partition的設計中,把Topic分成一個或者多個分區,每個Partition在物理磁盤上對應一個文件夾,該文件夾下存儲這個Partition的所有消息和索引文件。當我們創建一個Topic是,同時可以指定分區數據,數目越多,吞吐量越大,但是消耗的資源也越多,當我們向Kafka發送消息時,會均衡的將消息分散存儲在不同的分區中。在存儲的過程中,每條消息都是被順序寫到磁盤上的。(順序寫磁盤的時候比隨機寫內存的想效率還高,這也是Kafka快的一個原因之一)。

下面是Kafka的寫入原理圖,可以看出下列消息都是順序的,消費者消費的時候也是按着順序來消費的。

對於傳統的MQ而言,一般經過消費后的消息都會被刪除,而Kafka卻不會被刪除,始終保留着所有的消息,只記錄一個消費者消費消息的offset(偏移量)作為標記,可以允許消費者可以自己設置這個offset,從而可以重復消費一些消息。但不刪除肯定不行,日積月累,消息勢必會越來越多,占用空間也越來越大。Kafka提供了兩種策略來刪除消息:一是基於時間,二是基於Partition文件的大小,可以通過配置來決定用那種方式。不過現在磁盤那么廉價,空間也很大,隔個一年半載刪除一次也不為過。

1.3.2 Producer

生產者發送消息時,會根據Partition的策略來決定存到那個Partition中,一般的默認的策略是Kafka提供的均衡分布的策略,即實現了我們所要的負載均衡。一般的,當我們的消息對順序沒有要求的話那就多設置幾個分區,這樣就能很好地負載均衡增加吞吐量了。分區的個數可以手動配置,也可以在創建Topic的時候就事先指定。發送消息的時候,需要指定消息的key值,Producer會根據這個key值和Partition的數量來決定這個消息發到哪個分區,可能里邊就是一個hash算法。

1.3.3 Consumer Group 和 Consumer

我們知道傳統的消息隊列有兩種傳播消息的方式,一種是單播,類似隊列的方式,一個消息只被消費一次,消費過了,其他消費者就不能消費了;另一種是多播,類似發布-訂閱的模式,一個消息可以被多個消費者同時消費。Kafka通過消費者組的方式來實現這兩種方式,在一個Consumer Group中,每一個Topic中的消息只能被這個組中的一個Consumer消費,所以對於設置了多分區的Topic來說,分區的個數和消費者的個數應該是一樣的,一個消費者消費一個分區,這樣每個消費者就成了單播形式,類似隊列的消費形式。所以說,一個消費者組里邊的消費者不能多於Topic的分區數,一旦多於,多出來的消費者就不能消費到消息。另外,不同的消費者組可以同時消費一個消息,這樣就實現了多播,類似發布-訂閱的模式。我們可以設置每個組中一個消費者的方式來實現發布-訂閱的模式。當我們有多個程序都要對消息進行處理時,我們就可以把他們設置到不同的消費者組中,來實現不同的功能。

好了,以上我們已經對Kafka有了一個初步的認識,接下來就可以來使用了。

二、Kafka的安裝與使用

使用Kafka需要先安裝jdk,1.7以上的版本,配置好環境變量,這一步就不啰嗦了!!

2.1 下載Kafka

下載地址:http://kafka.apache.org/downloads,找到下邊的Binary Downloads就行了,版本隨意選擇,不過最好選擇比較舊一點了,以防新的版本有新的改動啥的,導致我們踩坑,我選了下邊這個版本:

下載之后直接解壓就行了,壓縮包格式是在linux上用的,不過一般的我們學習一個東西都可以先從windows上開始, 操作起來比較簡單,由於這種高級東西運行起來都是命令行,所以對於linux和windows就沒啥區別的了,到linux也是命令直接復制粘貼就行了。

2.2 啟動Kakfa

2.2.1 啟動Zookeeper

因為Kafka依賴Zookeeper,所以要先啟動它,如下圖,定位到Kafka的目錄,我的是 F:\Dev\kafka_2.11-2.1.0。

在地址欄中輸出cmd,然后敲回車,瞬間打開一個命令行,然后輸入:.\bin\windows\zookeeper-server-start.bat   .\config\zookeeper.properties,注意. 代表當前目錄,使用這個bat啟動Zookeeper並且使用后邊的配置。

發現上邊那句話,並且沒報錯什么的,表示Zookeeper啟動成功。

2.2.2 啟動Kafka

同樣,在地址欄中輸出cmd,瞬間啟動一個命令行,然后輸入:.\bin\windows\kafka-server-start.bat .\config\server.properties

發現上邊那句話,並且沒報錯什么的,表示Kafka啟動成功。

2.2.3 創建Topic

同樣,進入到F:\Dev\kafka_2.11-2.1.0\bin\windows,在地址欄中輸出cmd,瞬間啟動一個命令行,然后輸入:kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test,創建一個主題test。

發現上邊那句話,並且沒報錯什么的,表示主題Topic創建成功。

2.2.4 創建Producer

同樣,進入到F:\Dev\kafka_2.11-2.1.0\bin\windows,在地址欄中輸出cmd,瞬間啟動一個命令行,然后輸入:kafka-console-producer.bat --broker-list localhost:9092 --topic test,創建一個Producer,准備生產主題為test的消息

出現一個光標,表示等待生產消息,一會我們可以輸入消息。

2.2.5 創建Consumer

同樣,進入到F:\Dev\kafka_2.11-2.1.0\bin\windows,在地址欄中輸出cmd,瞬間啟動一個命令行,然后輸入:kafka-console-consumer.bat --bootstrap-server localhost:9092 --topic test --from-beginning,創建一個Consumer,准備消費主題為test的消息

也會出現一個光標,等待顯示消息。

2.2.6 測試生產和消費

在Producer控制台輸入消息,會在Consumer控制台看見消息:

以上就是Kafka的搭建和使用,也不是那么的復雜。我們在開發中肯定使用的是各類語言封裝過的驅動,java、.net的都差不多,先理解了原理,用起來就方便多了。

三、Kafka客戶端驅動的使用

下面我們使用.net的Kafka驅動Confluent.Kafka,來看看是如果使用Kafka的,其他語言的小伙伴可以自行搜索相關的驅動。

3.1 創建應用

如下圖,創建一個解決方案,添加兩個控制台項目,一個作為生產者,一個作為消費者。

3.2 添加Producer和Consumer類

添加Producer類和Consumer類,配置中的server寫死為默認的Kafka服務器的地址,如下圖所示:

3.3 添加Program.cs中的啟動代碼

添加Producer的代碼:

添加Consumer的代碼:

3.4 啟動Kafka服務

按照步驟2.2.1和2.2.2 啟動Zookeeper和Kafka,消費者和生產者就不用啟動了,我們用控制台代替。

3.4 啟動實例

分別啟動Producer實例和Consumer實例,在Producer控制台下輸入消息,可以發現Consumer控制台下顯示消息,和前邊我們所做的是一致的。

好了,以上就是Kafka的初步使用,有了這些基礎,我們就可以搭建一個消息隊列開始處理消息了。

參考文章:https://www.cnblogs.com/xxinwen/p/10683416.htmlhttps://www.cnblogs.com/qingyunzong/p/9004593.html

代碼托管到github,地址:https://github.com/EmmaCCC/KafkaStudy.git

四、總結

到此為止,我們已經基本掌握了Kafka的使用,至於詳細的配置啥的等到我們用的時候再去研究,假如沒機會用到,那就不用去學了,不過用到用不到學了總是有用的,因為到時候簡歷上又可以寫上一項技能了:熟練使用Kafka搭建高並發分布式消息隊列系統,承載千萬級別的消息並發,之后的怎么噴就看你自己了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM