吊打面試官系列:從架構(gòu)開始闡述,Kafka為什么這么快?

      網(wǎng)友投稿 739 2022-05-28

      一文帶你了解kafka為什么那么快?

      在沒有使用消息系統(tǒng)之前,許多傳統(tǒng)的系統(tǒng)業(yè)務(wù)對于消息的處理一般會采用串行方式或者并行方法;

      例如,你去網(wǎng)站注冊一個賬號,下面是串行跟并行的處理方式。

      串行方式:

      用戶注冊例子:用戶主責(zé),將注冊信息記錄到數(shù)據(jù)庫后,發(fā)送注冊消息郵件,再發(fā)送注冊短信驗證,每個過程小號50毫秒,一共就需要150毫秒

      并行方式:

      與串行不同的就是,在數(shù)據(jù)庫記錄完注冊信息之后,發(fā)送消息跟發(fā)送郵件的動作同步完成,縮短了用戶的等待時間:

      消息系統(tǒng):

      消息系統(tǒng)負(fù)責(zé)將數(shù)據(jù)從一個應(yīng)用程序傳送到另一個應(yīng)用程序,因此應(yīng)用程序可以專注于數(shù)據(jù),但是不必?fù)?dān)心 如何共享它。分布式消息系統(tǒng)基于可靠的消息隊列的概念。消息在客戶端應(yīng)用程序和消息傳遞系統(tǒng)之間的異步排隊。

      點對點:

      主要采用的隊列的方式進(jìn)行消息傳遞,如A->B ,A生產(chǎn)B消費,當(dāng)B消費的隊列中的數(shù)據(jù),那么隊列的數(shù)據(jù)就會被消費,也就是刪除掉。

      發(fā)布-訂閱:

      主要有三大組件:

      主題:一個消息的分類,假如有一類的消息全部都是訂單,一類全部都是關(guān)于用戶的,一類全部都是關(guān)于訂單的。那么就根據(jù)這些創(chuàng)建不同的主題存放不同的東西。

      發(fā)布者:將消息通過主動推送的方式推送給消息系統(tǒng)

      訂閱者:可以采用拉,推的方式從消息系統(tǒng)中獲取數(shù)據(jù)

      apache kafka是一個分布式發(fā)布-訂閱消息系統(tǒng)和一個強(qiáng)大的消息隊列,使用scala語言編寫是一個分布式,分區(qū)的,多副本的,多訂閱者的日志系統(tǒng),可以用于搜索日志,監(jiān)控日志,訪問日志等。

      kafka架構(gòu)圖:

      吊打面試官系列:從架構(gòu)開始闡述,Kafka為什么這么快?

      Prodecers:生產(chǎn)者,主要用于生產(chǎn)數(shù)據(jù)。之后保存到kafka集群。

      Consumers:集群的消費者,從集群中對生產(chǎn)者生產(chǎn)的數(shù)據(jù)進(jìn)行消費。

      Connectors:允許構(gòu)建和運行可重用的生產(chǎn)者或者消費者,能夠把kafka主題連接到現(xiàn)有的應(yīng)用程序或數(shù)據(jù)系統(tǒng)。例如:一個連 接到關(guān)系數(shù)據(jù)庫的連接器可能會獲取每個表的變化。

      Stream processors:允許應(yīng)用程序充當(dāng)流處理器(stream processor),從一個或者多個主題獲取輸入流,并生產(chǎn)一個輸出流到一個或 者多個主題,能夠有效的變化輸入流為輸出流。

      相關(guān)術(shù)語說明:

      Broker:kafka集群中包含一個或者多個服務(wù)實例,這種服務(wù)實例被稱為Broker

      Topic:每條發(fā)布到kafka集群的消息都有一個類別,這個類別就叫做Topic

      Partition:Partition是一個物理上的概念,每個Topic包含一個或者多個Partition (分區(qū))

      Producer:負(fù)責(zé)發(fā)布消息到kafka的Broker中。

      Consumer:消息消費者,向kafka的broker中讀取消息的客戶端

      Consumer Group:每一個Consumer屬于一個特定的Consumer Group(可以為每個Consumer指定 groupName)

      架構(gòu)關(guān)系圖:

      流程介紹:Zookeeper是一個分布式的,開放源碼的,用戶分布式的協(xié)調(diào)服務(wù),生產(chǎn)者push數(shù)據(jù)到集群,消費者通過pull進(jìn)行拉取,但不管是生產(chǎn)者還是消費者的動作都需要zookeeper的管理。他的作用就是,生產(chǎn)者push數(shù)據(jù)到kafka集群,就必須要找到kafka集群的節(jié)點在哪里,這些都是通過zookeeper去尋找的。消費者消費哪一條數(shù)據(jù),也需要zookeeper的支持,從zookeeper獲得offset,offset記錄上一次消費的數(shù)據(jù)消費到哪里,這樣就可以接著下一條數(shù)據(jù)進(jìn)行消費。

      o?set是一個long類型數(shù)字,它唯一標(biāo)識了一條消息,消費者通過(o?set,partition,topic)跟蹤記錄。

      任何發(fā)布到此partition的消息都會被直接追加到log文件的尾部,每條消息在文件中的位置稱為o?set(偏移量)。 記錄到上一次消費的位置,之后跟蹤到下一次接著上一次消費的位置進(jìn)行繼續(xù)消費。保證了每次都從下一條開始消費,不會重復(fù)消費也不會丟失消費。

      kafka為什么那么快主要從下面4個方面進(jìn)行理解:

      1.kafka的儲存設(shè)計方面

      在Kafka文件存儲中,同一個topic下有多個不同partition,每個partition為一個目錄,partiton命名規(guī)則為topic名稱+有序序號,第一個partiton序號從0開始,序號最大值為partitions數(shù)量減1。每個partition(目錄)被平均分配到多個大小相等segment(段)數(shù)據(jù)文件中。但每個段segment file消息數(shù)量不一定相等,通過多個小文件段,就容易定期清除或刪除已經(jīng)消費完文件,減少磁盤占用。每一個sgement又包含了index文件和log文件,可以快速定位數(shù)據(jù),通過index元數(shù)據(jù)全部映射到memory,可以避免segment file的IO磁盤操作。

      2.利用Page cache+mmap

      page cache用于緩存文件的頁數(shù)據(jù),頁是邏輯上的概念,因此page cache是與文件系統(tǒng)同級的;他的作用就是加速數(shù)據(jù)的IO,寫數(shù)據(jù)的時候首先寫入緩存,將寫入的頁進(jìn)行標(biāo)記為dirty,之后向外部存儲flush;讀數(shù)據(jù)的時候就先讀取緩存,沒有讀取到再去外部存儲讀取。page cache中的每個文件都是一棵基數(shù)樹,樹的每個節(jié)點都是一個頁。根據(jù)文件內(nèi)的偏移量就可以快速定位到所在的頁。

      為什么kafka要使用page cache 進(jìn)行儲存管理

      1.JVM中一切都是對象,數(shù)據(jù)的對象儲存會浪費空間

      2.使用JVM管理,會降低吞吐量

      3,如果系統(tǒng)程序崩潰管理的數(shù)據(jù)就會丟失,造成嚴(yán)重后果

      mmap即是Memory Mapped Files 內(nèi)存文件映射,可以把物理上的磁盤文件跟page cache進(jìn)行映射,讓進(jìn)程可以讀寫內(nèi)存,有助于數(shù)據(jù)讀寫與磁盤的交互

      3.kafka的批量壓縮設(shè)計

      在大企業(yè)中,數(shù)據(jù)的流動時極快的,對于消息隊列很多的情況加,系統(tǒng)要面臨的問題就是不僅僅是磁盤的IO,更多的是網(wǎng)絡(luò)的IO。所以消息的壓縮對于kafka的性能來說就顯得尤其重要。

      Kafka 中,壓縮可能發(fā)生在兩個地方:生產(chǎn)者端和 Broker 端,kafka采用批量壓縮的方式,而不是采用單個消息隊列壓縮。 如果對每一個消息都進(jìn)行壓縮,壓縮的效率就會大大降低。kafka支持很多種壓縮方式,允許使用遞歸的消息集合。

      4.kafka的消息讀寫過程

      1.Producer根據(jù)zookeeper連接到或者的broker,從zookeeper節(jié)點找到該partition的leader

      2.producer把需要發(fā)送的消息發(fā)給該leader,leader把消息寫入到log,follows從leader拉取消息,寫入到本地的log之后向leader發(fā)送ACK,leader收到后向producer發(fā)送ACK

      生產(chǎn)者把經(jīng)過批量壓縮的數(shù)據(jù)發(fā)送給broker之后,beocker就通過函數(shù)映射壓縮文件的地址到內(nèi)存,之后就可以根據(jù)這個函數(shù)進(jìn)行寫入的操作,寫入的時候會直接進(jìn)入到PageCache,之火由os的線程異步刷新到磁盤,達(dá)到一次性能優(yōu)化。

      kafka在讀取數(shù)據(jù)的時候,會判斷數(shù)據(jù)是否存在于page cache,如果存在的話就會直接從page cache中消費,所以消費實時數(shù)據(jù)的速度就會快很多。

      5.ZeroCopy

      在linux中有兩個上下文,分別是內(nèi)核態(tài)跟用戶態(tài),我們將一個File讀取并發(fā)送出去需要經(jīng)歷4次Copy:

      1.調(diào)用read,將文件拷貝到了kernel內(nèi)核態(tài)

      2.CPU控制 kernel態(tài)的數(shù)據(jù)copy到用戶態(tài)

      3.調(diào)用write時,user態(tài)下的內(nèi)容會copy到內(nèi)核態(tài)的socket的buffer中

      4.最后將內(nèi)核態(tài)socket buffer的數(shù)據(jù)copy到網(wǎng)卡設(shè)備中傳送

      缺點就是增加了上下文切換、浪費了2次無效拷貝

      ZeroCopy技術(shù):

      請求kernel直接把disk的data傳輸給socket,而不是通過應(yīng)用程序傳輸。Zero copy大大提高了應(yīng)用程序的性能,減少不必要的內(nèi)核緩沖區(qū)跟用戶緩沖區(qū)間的拷貝,從而減少CPU的開銷和減少了kernel和user模式的上下文切換,達(dá)到性能的提升

      對應(yīng)零貝技術(shù)有mmap及sendfile:

      1.mmap:小文件傳輸快

      2.sendfile:大文件傳輸比mmap快

      應(yīng)用:Kafka、Netty、RocketMQ等消息隊列都采用了零拷貝技術(shù)

      到這里kafka為什么這么快這個問題,相信你就可以跟面試官對答如流了!

      Kafka ZooKeeper

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:對象存儲的那些事(一): 為什么有對象存儲
      下一篇:WordPress 3.5.1發(fā)布 修復(fù)37個問題
      相關(guān)文章
      亚洲成a人片在线观看中文app| 亚洲国产成人久久综合一| 精品亚洲A∨无码一区二区三区| 亚洲精品卡2卡3卡4卡5卡区| 亚洲一级特黄大片无码毛片| 亚洲av片一区二区三区| 亚洲av片在线观看| 亚洲日韩精品无码专区| 亚洲中文字幕精品久久| 国产99在线|亚洲| 亚洲精品免费网站| 亚洲丰满熟女一区二区哦| 亚洲AV性色在线观看| 久久精品国产亚洲av天美18 | 亚洲视频免费在线观看| 亚洲国产人成在线观看69网站| 久久亚洲一区二区| 亚洲国产综合专区电影在线| 亚洲精品国产成人99久久| 久久亚洲精品无码AV红樱桃| 亚洲国产精品综合久久网各| 91亚洲性爱在线视频| wwwxxx亚洲| 亚洲乱码一二三四区乱码| 亚洲中文字幕一二三四区| 亚洲欧美日韩一区二区三区| 性色av极品无码专区亚洲| 国产在亚洲线视频观看| 亚洲人妻av伦理| 久久综合亚洲色HEZYO国产| 亚洲女同成av人片在线观看| 久久久久亚洲AV成人无码网站| 亚洲欧洲日韩国产综合在线二区| 亚洲视频一区在线观看| 亚洲国产高清在线精品一区 | 亚洲日韩欧洲无码av夜夜摸| 亚洲国产精品无码AAA片| 婷婷久久久亚洲欧洲日产国码AV| 亚洲最新中文字幕| 亚洲精品女同中文字幕| 亚洲国产精品一区二区第一页免|