Kafka消息隊列初識

一威彰、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十分有幫助辽狈。

image

上圖中包含了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的寫入原理圖,可以看出下列消息都是順序的航瞭,消費者消費的時候也是按著順序來消費的诫硕。

image

對于傳統(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)致我們踩坑,我選了下邊這個版本:

image

下載之后直接解壓就行了锋勺,壓縮包格式是在linux上用的蚀瘸,不過一般的我們學(xué)習(xí)一個東西都可以先從windows上開始, 操作起來比較簡單庶橱,由于這種高級東西運行起來都是命令行贮勃,所以對于linux和windows就沒啥區(qū)別的了,到linux也是命令直接復(fù)制粘貼就行了苏章。

image

2.2 啟動Kakfa

  2.2.1 啟動Zookeeper

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

image

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

image

發(fā)現(xiàn)上邊那句話酬诀,并且沒報錯什么的,表示Zookeeper啟動成功骆撇。

2.2.2 啟動Kafka

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

image

發(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。

image

發(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的消息魄懂。

image

出現(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的消息铣鹏。

image

也會出現(xiàn)一個光標,等待顯示消息哀蘑。

  2.2.6 測試生產(chǎn)和消費

在Producer控制臺輸入消息诚卸,會在Consumer控制臺看見消息:

image

以上就是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)者怔揩,一個作為消費者捉邢。

image

3.2 添加Producer和Consumer類

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

image
image

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

添加Producer的代碼:

image

添加Consumer的代碼:

image

3.4 啟動Kafka服務(wù)

按照步驟2.2.1和2.2.2 啟動Zookeeper和Kafka歌逢,消費者和生產(chǎn)者就不用啟動了,我們用控制臺代替翘狱。

3.4 啟動實例

分別啟動Producer實例和Consumer實例秘案,在Producer控制臺下輸入消息,可以發(fā)現(xiàn)Consumer控制臺下顯示消息潦匈,和前邊我們所做的是一致的阱高。

image

好了,以上就是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ā)抄谐,之后的怎么噴就看你自己了。

原文地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扰法,一起剝皮案震驚了整個濱河市蛹含,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌塞颁,老刑警劉巖挣惰,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卧斟,死亡現(xiàn)場離奇詭異,居然都是意外死亡憎茂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門锤岸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竖幔,“玉大人,你說我怎么就攤上這事是偷∪猓” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵蛋铆,是天一觀的道長馋评。 經(jīng)常有香客問我,道長刺啦,這世上最難降的妖魔是什么留特? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮玛瘸,結(jié)果婚禮上蜕青,老公的妹妹穿的比我還像新娘。我一直安慰自己糊渊,他們只是感情好右核,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渺绒,像睡著了一般贺喝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宗兼,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天躏鱼,我揣著相機與錄音,去河邊找鬼针炉。 笑死挠他,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的篡帕。 我是一名探鬼主播殖侵,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼镰烧!你這毒婦竟也來了拢军?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤怔鳖,失蹤者是張志新(化名)和其女友劉穎茉唉,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡度陆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年艾凯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片懂傀。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡趾诗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蹬蚁,到底是詐尸還是另有隱情恃泪,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布犀斋,位于F島的核電站贝乎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏叽粹。R本人自食惡果不足惜览效,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望球榆。 院中可真熱鬧朽肥,春花似錦、人聲如沸持钉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽每强。三九已至始腾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間空执,已是汗流浹背浪箭。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留辨绊,地道東北人奶栖。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像门坷,于是被迫代替她去往敵國和親宣鄙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容