Kafka的基本概念是什么

這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)Kafka的基本概念是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

畢節(jié)網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)建站,畢節(jié)網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為畢節(jié)1000多家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的畢節(jié)做網(wǎng)站的公司定做!

0、引言

Kafka是LinkedIn開源出來的一款消息服務(wù)器,用Scala語言實現(xiàn);這貨的性能是百萬級的QPS(估計是掛載了多塊磁盤),我隨便寫個測試程序就是十萬級。

1、Kafka基本概念

Kafka的基本概念是什么

在Kafka中消息是按照Topic進行分類的;每條發(fā)布到Kafka集群的消息都有一個類別,這個類別被稱為Topic。(物理上不同Topic的消息分開存儲,邏輯上一個Topic的消息雖然保存于一個或多個broker上但用戶只需指定消息的Topic即可生產(chǎn)或消費數(shù)據(jù)而不必關(guān)心數(shù)據(jù)存于何處)。

每個Topic包含一個或多個Parition;Parition是物理存儲上的概念,創(chuàng)建Topic時可指定Parition數(shù)量。每個Parition對應(yīng)一個存儲文件夾,文件夾下存儲該Parition所持有的消息數(shù)據(jù)和索引文件。Topic進行分區(qū)劃分的主要目的是出于性能方面的考慮,Kafka盡量的使所有分區(qū)均勻的分布到集群所有的節(jié)點上而不是集中在某些節(jié)點上,另外主從關(guān)系也盡量均衡,這樣每個節(jié)點都會擔任一定比例的分區(qū)的Leader。每個Parition是一個有序的隊列,每條消息在Parition中擁有一個offset。

消息的發(fā)布者可將消息發(fā)布到指定的Topic中,同時Producer也能決定將此消息發(fā)送到哪個Parition(也可以采取隨機、哈希、輪訓(xùn)等策略)。

 Kafka的基本概念是什么

消息的消費者主動從Kafka中拉取消息進行消費(pull模式),在Kafka中一個Parition中的消息可以被無限多個消費者進行消費,每個消費者之間是完全獨立,每個Consumer消費后的消息Kafka并不進行刪除操作,Kafka中的消息刪除是定期進行的,可以指定保留多長時間消息不被刪除。通過指定offset就可以消費任意位置的消息,當然前提是指定的offset是存在的。從這點上看Kafka更像是一個只能追加、不能修改、支持隨機讀取的小文件管理系統(tǒng)。

上面提到每個Consumer是完全獨立,如果多個Consume想輪流消費同一個Topic的同一個Parition就做不到;后來Kafka發(fā)明了一個Consumer-group的概念,每個Consumer客戶端被創(chuàng)建時,會向Zookeeper注冊自己的信息;一個group中的多個Consumer可以交錯的消費一個Topic的所有Paritions;簡而言之,保證此Topic的所有Paritions都能被此group所消費,且消費時為了性能考慮,讓Parition相對均衡的分散到每個Consumer上,Consume-group之間是完全獨立。主人的相反是挺好的,但是悲劇的是客戶端基本都不支持,貌似只有Java的客戶端支持比較好。

Kafka的基本概念是什么

2、消息順序性與可靠性設(shè)計

發(fā)布到Kafka的消息在一個Parition中是順序存儲的,發(fā)布者可以通過隨機、哈希、輪訓(xùn)等方式發(fā)布到多個分區(qū)中,消費者通過指定offset進行消費;所以Kafka當中消息的順序性更多的取決于使用方如何使用。

Kafka系統(tǒng)中消息支持容災(zāi)備份存儲,每個Parition有主分區(qū)、備用分區(qū)的概念,一個Topic中的多個Parition的主分區(qū)可能落在不同的物理機器上面,Kafka也是盡量讓其分布在不同的機器上以提高系統(tǒng)性能。消息的讀寫都是通過主分區(qū)直接完成,客戶端要直連主分區(qū)所在的物理機進行讀寫操作。備用分區(qū)就像一個"Consumer"消費主分區(qū)的消息并保存在本地日志中進行備份;主分區(qū)負責跟蹤所有的備用分區(qū)的狀態(tài),如果備用分區(qū)"落后"太多或者失效,主分區(qū)將會把它從同步列表中刪除;主備分區(qū)的管理是通過zookeeper進行的。

發(fā)布時的可靠性取決于兩點:發(fā)送端的確認機制、以及Kafka系統(tǒng)落地的策略。發(fā)送端支持無確認、主分區(qū)確認(主分區(qū)收到消息后發(fā)送確認回執(zhí))、以及主備分區(qū)確認(備用分區(qū)消息同步后主分區(qū)才發(fā)送確認回執(zhí))三種機制;Kafka系統(tǒng)落地的策略有兩種刷盤方式:通過配置消息數(shù)、以及配置刷盤時間間隔。

消費時的可靠性取決于消費者的讀取邏輯,Kafka是不保存消息的任何狀態(tài)的。At most once、At least once 、Exactly once 三種模式需要自己按照業(yè)務(wù)實現(xiàn),最容易實現(xiàn)就是At least once,兩外兩種在分布式系統(tǒng)中都不可能做到完全的絕對實現(xiàn),只能無限靠近,降低錯誤率。

3、消息存儲方式

Parition是以文件的形式存儲在文件系統(tǒng)中,比如創(chuàng)建了一個名為tipocTest的Topic,其有4個Parition,在Kafka的數(shù)據(jù)目錄下面會有四個文件夾,按照Topic-partnum命名。

 Kafka的基本概念是什么

每個文件夾的內(nèi)容

 Kafka的基本概念是什么

Parition中的每條Message由offset來表示它在這個Parition中的偏移量,這個offset不是該Message在Parition數(shù)據(jù)文件中的實際存儲位置,而是邏輯上一個值,它唯一確定了Parition中的一條Message。因此,可以認為offset是Parition中Message的id。Parition中的每條Message包含了三個屬性: Offset 、DataSize 、Data;Parition的數(shù)據(jù)文件則包含了若干條上述格式的Message,按offset由小到大排列在一起;Kafka收到新的消息后追加到文件末尾即可,所以消息的發(fā)布效率是很高的。

下面我們來思考另一個問題,如果一個Parition只有一個數(shù)據(jù)文件會怎么樣? 新消息是添加在文件末尾,不論文件數(shù)據(jù)文件有多大,這個操作永遠都是O(1)。但是在讀取的時候根據(jù)offset查找Message是順序查找的,因此,如果數(shù)據(jù)文件很大的話,查找的效率就低。那么Kafka是如何解決查找效率的的問題呢?1) 分段、2) 索引。

4、數(shù)據(jù)文件的分段與索引

Kafka解決查詢效率的手段之一是將數(shù)據(jù)文件分段,可以配置每個數(shù)據(jù)文件的最大值,每段放在一個單獨的數(shù)據(jù)文件里面,數(shù)據(jù)文件以該段中最小的offset命名。這樣在查找指定offset的Message的時候,用二分查找就可以定位到該Message在哪個段中。

數(shù)據(jù)文件分段使得可以在一個較小的數(shù)據(jù)文件中查找對應(yīng)offset的Message了,但是這依然需要順序掃描才能找到對應(yīng)offset的Message。為了進一步提高查找的效率,Kafka為每個分段后的數(shù)據(jù)文件建立了索引文件,文件名與數(shù)據(jù)文件的名字是一樣的,只是文件擴展名為.index。索引文件中包含若干個索引條目,每個條目表示數(shù)據(jù)文件中一條Message的索引——Offset與position(Message在數(shù)據(jù)文件中的絕對位置)的對應(yīng)關(guān)系;index文件中并沒有為數(shù)據(jù)文件中的每條Message建立索引,而是采用了稀疏存儲的方式,每隔一定字節(jié)的數(shù)據(jù)建立一條索引。這樣避免了索引文件占用過多的空間,從而可以將索引文件保留在內(nèi)存中。但缺點是沒有建立索引的Message也不能一次定位到其在數(shù)據(jù)文件的位置,從而需要做一次順序掃描,但是這次順序掃描的范圍就很小了。

每個分段還有一個.timeindex索引文件,這個文件的格式與.index文件格式一樣,所記錄的東西是消息發(fā)布時間與offset的稀疏索引,用于消息定期刪除使用。

下圖是一個分段索引的例子

Kafka的基本概念是什么

這套機制是建立在offset是有序的;索引文件被映射到內(nèi)存中,所以查找的速度還是很快的。一句話,Kafka的Message存儲采用了分區(qū)(Parition)、分段(segment)和稀疏索引這幾個手段來達到高效發(fā)布和隨機讀取。

5、消費端設(shè)計

出于性能、容災(zāi)方面的考慮,實際需求是有多Consumer消費一個Topic的情況;由于多個Consumer之間是相互獨立的,可以采用競爭Parition上崗的方式進行消費,同一個時刻只有一個Consumer在消費一個Parition,多個Consumer之間定期同步offset狀態(tài);如果是需要多通道消費,可以競爭不同的Parition對應(yīng)資源上崗消費。

由于Kafka是按照offset進行讀取的,一般的client都封裝成:給定一個起始offset后續(xù)不停的get就可以順序讀取了,沒有消費確認的概念,Kafka也不會維護每個消息、每個Consumer的狀態(tài)。其實實現(xiàn)一套消費確認機制也不難,這需要我們實現(xiàn)一個proxy層,在proxy層保留一個循環(huán)緩沖區(qū),業(yè)務(wù)端消費確認后方可從緩沖區(qū)里面移除,如果一段時間沒有確認,下次來取的時候重復(fù)下發(fā)下去,類似于tcp滑動窗口的概念。

上述就是小編為大家分享的Kafka的基本概念是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

文章題目:Kafka的基本概念是什么
網(wǎng)頁網(wǎng)址:http://bm7419.com/article10/igdhdo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、網(wǎng)站導(dǎo)航網(wǎng)站設(shè)計、App開發(fā)、品牌網(wǎng)站建設(shè)、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)