什么是Kafka
Kafka是一個(gè)分布式流處理系統(tǒng),流處理系統(tǒng)使它可以像消息隊(duì)列一樣publish或者subscribe消息,分布式提供了容錯(cuò)性,并發(fā)處理消息的機(jī)制。
Kafka的基本概念
kafka運(yùn)行在集群上,集群包含一個(gè)或多個(gè)服務(wù)器。kafka把消息存在topic中,每一條消息包含鍵值(key),值(value)和時(shí)間戳(timestamp)。
kafka有以下一些基本概念:
Producer - 消息生產(chǎn)者,就是向kafka broker發(fā)消息的客戶端。
Consumer - 消息消費(fèi)者,是消息的使用方,負(fù)責(zé)消費(fèi)Kafka服務(wù)器上的消息。
Topic - 主題,由用戶定義并配置在Kafka服務(wù)器,用于建立Producer和Consumer之間的訂閱關(guān)系。生產(chǎn)者發(fā)送消息到指定的Topic下,消息者從這個(gè)Topic下消費(fèi)消息。
Partition - 消息分區(qū),一個(gè)topic可以分為多個(gè) partition,每個(gè)partition是一個(gè)有序的隊(duì)列。partition中的每條消息都會(huì)被分配一個(gè)有序的id(offset)。
Broker - 一臺(tái)kafka服務(wù)器就是一個(gè)broker。一個(gè)集群由多個(gè)broker組成。一個(gè)broker可以容納多個(gè)topic。
Consumer Group - 消費(fèi)者分組,用于歸組同類消費(fèi)者。每個(gè)consumer屬于一個(gè)特定的consumer group,多個(gè)消費(fèi)者可以共同消息一個(gè)Topic下的消息,每個(gè)消費(fèi)者消費(fèi)其中的部分消息,這些消費(fèi)者就組成了一個(gè)分組,擁有同一個(gè)分組名稱,通常也被稱為消費(fèi)者集群。
Offset - 消息在partition中的偏移量。每一條消息在partition都有唯一的偏移量,消息者可以指定偏移量來指定要消費(fèi)的消息。
Kafka分布式架構(gòu)
如上圖所示,kafka將topic中的消息存在不同的partition中。如果存在鍵值(key),消息按照鍵值(key)做分類存在不同的partiition中,如果不存在鍵值(key),消息按照輪詢(Round Robin)機(jī)制存在不同的partition中。默認(rèn)情況下,鍵值(key)決定了一條消息會(huì)被存在哪個(gè)partition中。
partition中的消息序列是有序的消息序列。kafka在partition使用偏移量(offset)來指定消息的位置。一個(gè)topic的一個(gè)partition只能被一個(gè)consumer group中的一個(gè)consumer消費(fèi),多個(gè)consumer消費(fèi)同一個(gè)partition中的數(shù)據(jù)是不允許的,但是一個(gè)consumer可以消費(fèi)多個(gè)partition中的數(shù)據(jù)。
kafka將partition的數(shù)據(jù)復(fù)制到不同的broker,提供了partition數(shù)據(jù)的備份。每一個(gè)partition都有一個(gè)broker作為leader,若干個(gè)broker作為follower。所有的數(shù)據(jù)讀寫都通過leader所在的服務(wù)器進(jìn)行,并且leader在不同broker之間復(fù)制數(shù)據(jù)。
上圖中,對(duì)于Partition 0,broker 1是它的leader,broker 2和broker 3是follower。對(duì)于Partition 1,broker 2是它的leader,broker 1和broker 3是follower。
在上圖中,當(dāng)有Client(也就是Producer)要寫入數(shù)據(jù)到Partition 0時(shí),會(huì)寫入到leader Broker 1,Broker 1再將數(shù)據(jù)復(fù)制到follower Broker 2和Broker 3。
在上圖中,Client向Partition 1中寫入數(shù)據(jù)時(shí),會(huì)寫入到Broker 2,因?yàn)锽roker 2是Partition 1的Leader,然后Broker 2再將數(shù)據(jù)復(fù)制到follower Broker 1和Broker 3中。
上圖中的topic一共有3個(gè)partition,對(duì)每個(gè)partition的讀寫都由不同的broker處理,因此總的吞吐量得到了提升。
實(shí)驗(yàn)一:kafka-python實(shí)現(xiàn)生產(chǎn)者消費(fèi)者
kafka-python是一個(gè)python的Kafka客戶端,可以用來向kafka的topic發(fā)送消息、消費(fèi)消息。
這個(gè)實(shí)驗(yàn)會(huì)實(shí)現(xiàn)一個(gè)producer和一個(gè)consumer,producer向kafka發(fā)送消息,consumer從topic中消費(fèi)消息。結(jié)構(gòu)如下圖
producer代碼
consumer代碼
接下來創(chuàng)建test topic
打開兩個(gè)窗口中,我們?cè)趙indow1中運(yùn)行producer,如下
在window2中運(yùn)行consumer,如下
可以看到window2中的consumer成功的讀到了producer寫入的數(shù)據(jù)
實(shí)驗(yàn)二:消費(fèi)組實(shí)現(xiàn)容錯(cuò)性機(jī)制
這個(gè)實(shí)驗(yàn)將展示消費(fèi)組的容錯(cuò)性的特點(diǎn)。這個(gè)實(shí)驗(yàn)中將創(chuàng)建一個(gè)有2個(gè)partition的topic,和2個(gè)consumer,這2個(gè)consumer共同消費(fèi)同一個(gè)topic中的數(shù)據(jù)。結(jié)構(gòu)如下所示
producer部分代碼和實(shí)驗(yàn)一相同,這里不再重復(fù)。consumer需要指定所屬的consumer group,代碼如下
接下來我們創(chuàng)建topic,名字test,設(shè)置partition數(shù)量為2
打開三個(gè)窗口,一個(gè)窗口運(yùn)行producer,還有兩個(gè)窗口運(yùn)行consumer。
運(yùn)行consumer的兩個(gè)窗口的輸出如下:
可以看到兩個(gè)consumer同時(shí)運(yùn)行的情況下,它們分別消費(fèi)不同partition中的數(shù)據(jù)。window1中的consumer消費(fèi)partition 0中的數(shù)據(jù),window2中的consumer消費(fèi)parition 1中的數(shù)據(jù)。
我們嘗試關(guān)閉window1中的consumer,可以看到如下結(jié)果
剛開始window2中的consumer只消費(fèi)partition1中的數(shù)據(jù),當(dāng)window1中的consumer退出后,window2中的consumer中也開始消費(fèi)partition 0中的數(shù)據(jù)了。
實(shí)驗(yàn)三:offset管理
kafka允許consumer將當(dāng)前消費(fèi)的消息的offset提交到kafka中,這樣如果consumer因異常退出后,下次啟動(dòng)仍然可以從上次記錄的offset開始向后繼續(xù)消費(fèi)消息。
這個(gè)實(shí)驗(yàn)的結(jié)構(gòu)和實(shí)驗(yàn)一的結(jié)構(gòu)是一樣的,使用一個(gè)producer,一個(gè)consumer,test topic的partition數(shù)量設(shè)為1。
producer的代碼和實(shí)驗(yàn)一中的一樣,這里不再重復(fù)。consumer的代碼稍作修改,這里consumer中打印出下一個(gè)要被消費(fèi)的消息的offset。consumer代碼如下
在一個(gè)窗口中啟動(dòng)producer,在另一個(gè)窗口并且啟動(dòng)consumer。consumer的輸出如下
可以嘗試退出consumer,再啟動(dòng)consumer。每一次重新啟動(dòng),consumer都是從offset=98的消息開始消費(fèi)的。
修改consumer的代碼如下,在consumer消費(fèi)每一條消息后將offset提交回kafka
啟動(dòng)consumer
可以看到consumer從offset=98的消息開始消費(fèi),到offset=829時(shí),我們Ctrl+C退出consumer。
我們?cè)俅螁?dòng)consumer
可以看到重新啟動(dòng)后,consumer從上一次記錄的offset開始繼續(xù)消費(fèi)消息。之后每一次consumer重新啟動(dòng),consumer都會(huì)從上一次停止的地方繼續(xù)開始消費(fèi)。
本文主要介紹了一下kafka的基本概念,并結(jié)合一些實(shí)驗(yàn)幫助理解kafka中的一些難點(diǎn),如多個(gè)consumer的容錯(cuò)性機(jī)制,offset管理。
-
python
+關(guān)注
關(guān)注
56文章
4807瀏覽量
85037 -
kafka
+關(guān)注
關(guān)注
0文章
52瀏覽量
5243
原文標(biāo)題:Python操作分布式流處理系統(tǒng)Kafka
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論