一威彰、Kafka簡介
1.1 什么是kafka
kafka是一個分布式、高吞吐量穴肘、高擴展性的消息隊列系統(tǒng)歇盼。kafka最初是由Linkedin公司開發(fā)的,后來在2010年貢獻給了Apache基金會评抚,成為了一個開源項目谜酒。主要應(yīng)用在日志收集系統(tǒng)和消息系統(tǒng),相信大家之前也聽說過其他的消息隊列中間件撵溃,比如RabbitMQ芋齿、AcitveMQ,其實kafka就是這么一個東西侍匙,也可以叫做KafkaMQ氮惯。總之想暗,Kafka比其他消息隊列要好一點妇汗,優(yōu)點也比較多,穩(wěn)定性和效率都比較高说莫,大家都說好杨箭,那就是真的好。
1.2 Kafka中的相關(guān)概念
在理解Kafka的相關(guān)概念之前储狭,我們先來看一張圖互婿,這張圖基本上包括了Kafka所有的概念,對于我們理解Kafka十分有幫助辽狈。
上圖中包含了2個Producer(生產(chǎn)者)慈参,一個Topic(主題),3個Partition(分區(qū))稻艰,3個Replica(副本)懂牧,3個Broker(Kafka實例或節(jié)點),一個Consumer Group(消費者組)尊勿,其中包含3個Consumer(消費者)僧凤。下面我們逐一介紹這些概念。
1.2.1 Producer(生產(chǎn)者)
生產(chǎn)者元扔,顧名思義躯保,就是生產(chǎn)東西的,也就是發(fā)送消息的澎语,生產(chǎn)者每發(fā)送一個條消息必須有一個Topic(主題)途事,也可以說是消息的類別验懊,生產(chǎn)者源源不斷的向kafka服務(wù)器發(fā)送消息。
1.2.2 Topic(主題)
每一個發(fā)送到Kafka的消息都有一個主題尸变,也可叫做一個類別义图,類似我們傳統(tǒng)數(shù)據(jù)庫中的表名一樣,比如說發(fā)送一個主題為order的消息召烂,那么這個order下邊就會有多條關(guān)于訂單的消息碱工,只不過kafka稱之為主題,都是一樣的道理奏夫。
1.2.3 Partition(分區(qū))
生產(chǎn)者發(fā)送的消息數(shù)據(jù)Topic會被存儲在分區(qū)中怕篷,這個分區(qū)的概念和ElasticSearch中分片的概念是一致的,都是想把數(shù)據(jù)分成多個塊酗昼,好達到我們的負載均衡廊谓,合理的把消息分布在不同的分區(qū)上,分區(qū)是被分在不同的Broker上也就是服務(wù)器上麻削,這樣我們大量的消息就實現(xiàn)了負載均衡蒸痹。每個Topic可以指定多個分區(qū),但是至少指定一個分區(qū)碟婆。每個分區(qū)存儲的數(shù)據(jù)都是有序的电抚,不同分區(qū)間的數(shù)據(jù)不保證有序性。因為如果有了多個分區(qū)竖共,消費數(shù)據(jù)的時候肯定是各個分區(qū)獨立開始的,有的消費得慢俺祠,有的消費得快肯定就不能保證順序了公给。那么當需要保證消息的順序消費時,我們可以設(shè)置為一個分區(qū)蜘渣,只要一個分區(qū)的時候就只能消費這個一個分區(qū)淌铐,那自然就保證有序了。
1.2.4 Replica(副本)
副本就是分區(qū)中數(shù)據(jù)的備份蔫缸,是Kafka為了防止數(shù)據(jù)丟失或者服務(wù)器宕機采取的保護數(shù)據(jù)完整性的措施腿准,一般的數(shù)據(jù)存儲軟件都應(yīng)該會有這個功能。假如我們有3個分區(qū)拾碌,由于不同分區(qū)中存放的是部分數(shù)據(jù)吐葱,所以為了全部數(shù)據(jù)的完整性,我們就必須備份所有分區(qū)校翔。這時候我們的一份副本就包括3個分區(qū)弟跑,每個分區(qū)中有一個副本,兩份副本就包含6個分區(qū)防症,一個分區(qū)兩份副本孟辑。Kafka做了副本之后同樣的會把副本分區(qū)放到不同的服務(wù)器上哎甲,保證負載均衡。講到這我們就可以看見饲嗽,這根本就是傳統(tǒng)數(shù)據(jù)庫中的主從復(fù)制的功能炭玫,沒錯,Kafka會找一個分區(qū)作為主分區(qū)(leader)來控制消息的讀寫貌虾,其他的(副本)都是從分區(qū)(follower)吞加,這樣的話讀寫可以通過leader來控制,然后同步到副本上去酝惧,保證的數(shù)據(jù)的完整性榴鼎。如果有某些服務(wù)器宕機,我們可以通過副本恢復(fù)數(shù)據(jù)晚唇,也可以暫時用副本中的數(shù)據(jù)來使用巫财。
PS:這個東西實際跟ElasticSearch中的副本是完全一致的,不愧是一個爹出的東西哩陕,思想啥的都是一樣的平项。
1.2.5 Broker(實例或節(jié)點)
這個就好說了,意思就是Kafka的實例悍及,啟動一個Kafka就是一個Broker闽瓢,多個Brokder構(gòu)成一個Kafka集群,這就是分布式的體現(xiàn)心赶,服務(wù)器多了自然吞吐率效率啥的都上來了扣讼。
1.2.6 Consumer Group(消費者組)和 Consumer(消費者)
Consume消費者來讀取Kafka中的消息,可以消費任何Topic的數(shù)據(jù)缨叫,多個Consume組成一個消費者組椭符,一般的一個消費者必須有一個組(Group)名,如果沒有的話會被分一個默認的組名耻姥。
1.3 Kafka的架構(gòu)與設(shè)計
一般的來說销钝,一個Kafka集群包含一個或多個的Producer,一個或多個的Broker琐簇,一個或多個的Consumer Group蒸健,和一個Zookeeper集群。Kafka通過Zookeeper管理集群配置婉商,管理集群在運行過程中負責(zé)均衡似忧、故障轉(zhuǎn)移和恢復(fù)什么的。Producer使用Push(推送)的方式將消息發(fā)布到Broker据某,Consumer使用Pull(拉认鹇Α)的方式從Broker獲取消息,兩者都是主動操作的癣籽。
1.3.1 Topic和Partition
Kafka最初設(shè)計初衷就是高吞吐率挽唉、速度快滤祖。所以在對Topic和Partition的設(shè)計中,把Topic分成一個或者多個分區(qū)瓶籽,每個Partition在物理磁盤上對應(yīng)一個文件夾匠童,該文件夾下存儲這個Partition的所有消息和索引文件。當我們創(chuàng)建一個Topic是塑顺,同時可以指定分區(qū)數(shù)據(jù)汤求,數(shù)目越多,吞吐量越大严拒,但是消耗的資源也越多扬绪,當我們向Kafka發(fā)送消息時,會均衡的將消息分散存儲在不同的分區(qū)中裤唠。在存儲的過程中挤牛,每條消息都是被順序?qū)懙酱疟P上的。(順序?qū)懘疟P的時候比隨機寫內(nèi)存的想效率還高种蘸,這也是Kafka快的一個原因之一)墓赴。
下面是Kafka的寫入原理圖,可以看出下列消息都是順序的航瞭,消費者消費的時候也是按著順序來消費的诫硕。
對于傳統(tǒng)的MQ而言,一般經(jīng)過消費后的消息都會被刪除刊侯,而Kafka卻不會被刪除章办,始終保留著所有的消息,只記錄一個消費者消費消息的offset(偏移量)作為標記滨彻,可以允許消費者可以自己設(shè)置這個offset纲菌,從而可以重復(fù)消費一些消息。但不刪除肯定不行疮绷,日積月累,消息勢必會越來越多嚣潜,占用空間也越來越大冬骚。Kafka提供了兩種策略來刪除消息:一是基于時間,二是基于Partition文件的大小懂算,可以通過配置來決定用那種方式只冻。不過現(xiàn)在磁盤那么廉價,空間也很大计技,隔個一年半載刪除一次也不為過喜德。
1.3.2 Producer
生產(chǎn)者發(fā)送消息時,會根據(jù)Partition的策略來決定存到那個Partition中垮媒,一般的默認的策略是Kafka提供的均衡分布的策略舍悯,即實現(xiàn)了我們所要的負載均衡航棱。一般的,當我們的消息對順序沒有要求的話那就多設(shè)置幾個分區(qū)萌衬,這樣就能很好地負載均衡增加吞吐量了饮醇。分區(qū)的個數(shù)可以手動配置,也可以在創(chuàng)建Topic的時候就事先指定秕豫。發(fā)送消息的時候朴艰,需要指定消息的key值,Producer會根據(jù)這個key值和Partition的數(shù)量來決定這個消息發(fā)到哪個分區(qū)混移,可能里邊就是一個hash算法祠墅。
1.3.3 Consumer Group 和 Consumer
我們知道傳統(tǒng)的消息隊列有兩種傳播消息的方式,一種是單播歌径,類似隊列的方式毁嗦,一個消息只被消費一次,消費過了沮脖,其他消費者就不能消費了金矛;另一種是多播,類似發(fā)布-訂閱的模式勺届,一個消息可以被多個消費者同時消費驶俊。Kafka通過消費者組的方式來實現(xiàn)這兩種方式,在一個Consumer Group中免姿,每一個Topic中的消息只能被這個組中的一個Consumer消費饼酿,所以對于設(shè)置了多分區(qū)的Topic來說,分區(qū)的個數(shù)和消費者的個數(shù)應(yīng)該是一樣的胚膊,一個消費者消費一個分區(qū)故俐,這樣每個消費者就成了單播形式,類似隊列的消費形式紊婉。所以說药版,一個消費者組里邊的消費者不能多于Topic的分區(qū)數(shù),一旦多于喻犁,多出來的消費者就不能消費到消息槽片。另外,不同的消費者組可以同時消費一個消息肢础,這樣就實現(xiàn)了多播还栓,類似發(fā)布-訂閱的模式。我們可以設(shè)置每個組中一個消費者的方式來實現(xiàn)發(fā)布-訂閱的模式传轰。當我們有多個程序都要對消息進行處理時剩盒,我們就可以把他們設(shè)置到不同的消費者組中,來實現(xiàn)不同的功能慨蛙。
好了辽聊,以上我們已經(jīng)對Kafka有了一個初步的認識纪挎,接下來就可以來使用了。
二身隐、Kafka的安裝與使用
使用Kafka需要先安裝jdk廷区,1.7以上的版本,配置好環(huán)境變量贾铝,這一步就不啰嗦了O肚帷!
2.1 下載Kafka
下載地址:http://kafka.apache.org/downloads垢揩,找到下邊的Binary Downloads就行了玖绿,版本隨意選擇,不過最好選擇比較舊一點了叁巨,以防新的版本有新的改動啥的斑匪,導(dǎo)致我們踩坑,我選了下邊這個版本:
下載之后直接解壓就行了锋勺,壓縮包格式是在linux上用的蚀瘸,不過一般的我們學(xué)習(xí)一個東西都可以先從windows上開始, 操作起來比較簡單庶橱,由于這種高級東西運行起來都是命令行贮勃,所以對于linux和windows就沒啥區(qū)別的了,到linux也是命令直接復(fù)制粘貼就行了苏章。
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并且使用后邊的配置。
發(fā)現(xiàn)上邊那句話酬诀,并且沒報錯什么的,表示Zookeeper啟動成功骆撇。
2.2.2 啟動Kafka
同樣瞒御,在地址欄中輸出cmd,瞬間啟動一個命令行神郊,然后輸入:.\bin\windows\kafka-server-start.bat .\config\server.properties
發(fā)現(xiàn)上邊那句話肴裙,并且沒報錯什么的趾唱,表示Kafka啟動成功。
2.2.3 創(chuàng)建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悠咱,創(chuàng)建一個主題test。
發(fā)現(xiàn)上邊那句話征炼,并且沒報錯什么的析既,表示主題Topic創(chuàng)建成功。
2.2.4 創(chuàng)建Producer
同樣谆奥,進入到F:\Dev\kafka_2.11-2.1.0\bin\windows眼坏,在地址欄中輸出cmd,瞬間啟動一個命令行酸些,然后輸入:kafka-console-producer.bat –broker-list localhost:9092 –topic test宰译,創(chuàng)建一個Producer,準備生產(chǎn)主題為test的消息魄懂。
出現(xiàn)一個光標沿侈,表示等待生產(chǎn)消息,一會我們可以輸入消息逢渔。
2.2.5 創(chuàng)建Consumer
同樣肋坚,進入到F:\Dev\kafka_2.11-2.1.0\bin\windows,在地址欄中輸出cmd肃廓,瞬間啟動一個命令行智厌,然后輸入:kafka-console-consumer.bat –bootstrap-server localhost:9092 –topic test –from-beginning,創(chuàng)建一個Consumer盲赊,準備消費主題為test的消息铣鹏。
也會出現(xiàn)一個光標,等待顯示消息哀蘑。
2.2.6 測試生產(chǎn)和消費
在Producer控制臺輸入消息诚卸,會在Consumer控制臺看見消息:
以上就是Kafka的搭建和使用,也不是那么的復(fù)雜绘迁。我們在開發(fā)中肯定使用的是各類語言封裝過的驅(qū)動合溺,java、.net的都差不多缀台,先理解了原理棠赛,用起來就方便多了。
三、Kafka客戶端驅(qū)動的使用
下面我們使用.net的Kafka驅(qū)動Confluent.Kafka睛约,來看看是如果使用Kafka的鼎俘,其他語言的小伙伴可以自行搜索相關(guān)的驅(qū)動。
3.1 創(chuàng)建應(yīng)用
如下圖辩涝,創(chuàng)建一個解決方案贸伐,添加兩個控制臺項目,一個作為生產(chǎn)者怔揩,一個作為消費者捉邢。
3.2 添加Producer和Consumer類
添加Producer類和Consumer類,配置中的server寫死為默認的Kafka服務(wù)器的地址沧踏,如下圖所示:
3.3 添加Program.cs中的啟動代碼
添加Producer的代碼:
添加Consumer的代碼:
3.4 啟動Kafka服務(wù)
按照步驟2.2.1和2.2.2 啟動Zookeeper和Kafka歌逢,消費者和生產(chǎn)者就不用啟動了,我們用控制臺代替翘狱。
3.4 啟動實例
分別啟動Producer實例和Consumer實例秘案,在Producer控制臺下輸入消息,可以發(fā)現(xiàn)Consumer控制臺下顯示消息潦匈,和前邊我們所做的是一致的阱高。
好了,以上就是Kafka的初步使用茬缩,有了這些基礎(chǔ)赤惊,我們就可以搭建一個消息隊列開始處理消息了。
參考文章:https://www.cnblogs.com/xxinwen/p/10683416.html凰锡,https://www.cnblogs.com/qingyunzong/p/9004593.html
代碼托管到github未舟,地址:https://github.com/EmmaCCC/KafkaStudy.git
四、總結(jié)
到此為止掂为,我們已經(jīng)基本掌握了Kafka的使用裕膀,至于詳細的配置啥的等到我們用的時候再去研究,假如沒機會用到勇哗,那就不用去學(xué)了昼扛,不過用到用不到學(xué)了總是有用的,因為到時候簡歷上又可以寫上一項技能了:熟練使用Kafka搭建高并發(fā)分布式消息隊列系統(tǒng)欲诺,承載千萬級別的消息并發(fā)抄谐,之后的怎么噴就看你自己了。