日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > > 架構(gòu)師社區(qū)
[導(dǎo)讀]談到大數(shù)據(jù)傳輸都會(huì)想到 Kafka,Kafka 號稱大數(shù)據(jù)的殺手锏,在業(yè)界有很多成熟的應(yīng)用場景并且被主流公司認(rèn)可。這款為大數(shù)據(jù)而生的消息中間件,以其百萬級TPS的吞吐量名聲大噪,迅速成為大數(shù)據(jù)領(lǐng)域的寵兒,在數(shù)據(jù)采集、傳輸、存儲(chǔ)的過程中發(fā)揮著舉足輕重的作用。

支持百萬級TPS,Kafka是怎么做到的?答案藏在這10張圖里

談到大數(shù)據(jù)傳輸都會(huì)想到 Kafka,Kafka 號稱大數(shù)據(jù)的殺手锏,在業(yè)界有很多成熟的應(yīng)用場景并且被主流公司認(rèn)可。這款為大數(shù)據(jù)而生的消息中間件,以其百萬級TPS的吞吐量名聲大噪,迅速成為大數(shù)據(jù)領(lǐng)域的寵兒,在數(shù)據(jù)采集、傳輸、存儲(chǔ)的過程中發(fā)揮著舉足輕重的作用。

在業(yè)界已經(jīng)有很多成熟的消息中間件如:RabbitMQ, RocketMQ, ActiveMQ, ZeroMQ,為什么 Kafka 在眾多的敵手中依然能有一席之地,當(dāng)然靠的是其強(qiáng)悍的吞吐量。下面帶領(lǐng)大家來揭秘。

Kafka 如何做到支持百萬級 TPS ?

先用一張思維導(dǎo)圖直接告訴你答案:

支持百萬級TPS,Kafka是怎么做到的?答案藏在這10張圖里
Kafka 支持百萬TPS的秘密

順序讀寫磁盤

生產(chǎn)者寫入數(shù)據(jù)和消費(fèi)者讀取數(shù)據(jù)都是順序讀寫的,先來一張圖直觀感受一下順序讀寫和隨機(jī)讀寫的速度:

支持百萬級TPS,Kafka是怎么做到的?答案藏在這10張圖里
順序讀寫 VS 隨機(jī)讀寫

從圖中可以看出傳統(tǒng)硬盤或者SSD的順序讀寫甚至超過了內(nèi)存的隨機(jī)讀寫,當(dāng)然與內(nèi)存的順序讀寫對比差距還是很大。

所以Kafka選擇順序讀寫磁盤也不足為奇了。

下面以傳統(tǒng)機(jī)械磁盤為例詳細(xì)介紹一下什么是順序讀寫和隨機(jī)讀寫。

盤片盤面:一塊硬盤一般有多塊盤片,盤片分為上下兩面,其中有效面稱為盤面,一般上下都有效,也就是說:盤面數(shù) = 盤片數(shù) * 2。

磁頭:磁頭切換磁道讀寫數(shù)據(jù)時(shí)是通過機(jī)械設(shè)備實(shí)現(xiàn)的,一般速度較慢;而磁頭切換盤面讀寫數(shù)據(jù)是通過電子設(shè)備實(shí)現(xiàn)的,一般速度較快,因此磁頭一般是先讀寫完柱面后才開始尋道的(不用切換磁道),這樣磁盤讀寫效率更快。

支持百萬級TPS,Kafka是怎么做到的?答案藏在這10張圖里
傳統(tǒng)機(jī)械磁盤

磁道:磁道就是以中間軸為圓心的圓環(huán),一個(gè)盤面有多個(gè)磁道,磁道之間有間隙,磁道也就是磁盤存儲(chǔ)數(shù)據(jù)的介質(zhì)。磁道上布有一層磁介質(zhì),通過磁頭可以使磁介質(zhì)的極性轉(zhuǎn)換為數(shù)據(jù)信號,即磁盤的讀,磁盤寫剛好與之相反。

柱面:磁盤中不同盤面中半徑相同的磁道組成的,也就是說柱面總數(shù) = 某個(gè)盤面的磁道數(shù)。

扇區(qū):單個(gè)磁道就是多個(gè)弧形扇區(qū)組成的,盤面上的每個(gè)磁道擁有的扇區(qū)數(shù)量是相等。扇區(qū)是最小存儲(chǔ)單元,一般扇區(qū)大小為512bytes。

支持百萬級TPS,Kafka是怎么做到的?答案藏在這10張圖里
單盤片示意圖

如果系統(tǒng)每次只讀取一個(gè)扇區(qū),那恐怕效率太低了,所以出現(xiàn)了block(塊)的概念。文件讀取的最小單位是block,根據(jù)不同操作系統(tǒng)一個(gè)block一般由多個(gè)扇區(qū)組成。

有了磁盤的背景知識我們就可以很容易理解順序讀寫和隨機(jī)讀寫了。

插播維基百科定義:
順序讀寫:是一種按記錄的邏輯順序進(jìn)行讀、寫操作的存取方法 ,即按照信息在存儲(chǔ)器中的實(shí)際位置所決定的順序使用信息。?

隨機(jī)讀寫:指的是當(dāng)存儲(chǔ)器中的消息被讀取或?qū)懭霑r(shí),所需要的時(shí)間與這段信息所在的位置無關(guān)。


當(dāng)讀取第一個(gè)block時(shí),要經(jīng)歷尋道、旋轉(zhuǎn)延遲、傳輸三個(gè)步驟才能讀取完這個(gè)block的數(shù)據(jù)。而對于下一個(gè)block,如果它在磁盤的其他任意位置,訪問它會(huì)同樣經(jīng)歷尋道、旋轉(zhuǎn)、延時(shí)、傳輸才能讀取完這個(gè)block的數(shù)據(jù),我們把這種方式叫做隨機(jī)讀寫。但是如果這個(gè)block的起始扇區(qū)剛好在剛才訪問的block的后面,磁頭就能立刻遇到,不需等待直接傳輸,這種就叫順序讀寫。

好,我們再回到 Kafka,詳細(xì)介紹Kafka如何實(shí)現(xiàn)順序讀寫入數(shù)據(jù)。

Kafka 寫入數(shù)據(jù)是順序的,下面每一個(gè)Partition 都可以當(dāng)做一個(gè)文件,每次接收到新數(shù)據(jù)后Kafka會(huì)把數(shù)據(jù)插入到文件末尾,虛框部分代表文件尾。

支持百萬級TPS,Kafka是怎么做到的?答案藏在這10張圖里
順序?qū)?

這種方法有一個(gè)問題就是刪除數(shù)據(jù)不方便,所以 Kafka 一般會(huì)把所有的數(shù)據(jù)都保留下來,每個(gè)消費(fèi)者(Consumer)對每個(gè)Topic都有一個(gè) offset 用來記錄讀取進(jìn)度或者叫坐標(biāo)。

支持百萬級TPS,Kafka是怎么做到的?答案藏在這10張圖里
順序讀

Memory Mapped Files(MMAP)

在文章開頭我們看到硬盤的順序讀寫基本能與內(nèi)存隨機(jī)讀寫速度媲美,但是與內(nèi)存順序讀寫相比還是太慢了,那 Kafka 如果有追求想進(jìn)一步提升效率怎么辦?可以使用現(xiàn)代操作系統(tǒng)分頁存儲(chǔ)來充分利用內(nèi)存提高I/O效率,這也是下面要介紹的 MMAP 技術(shù)。

MMAP也就是內(nèi)存映射文件,在64位操作系統(tǒng)中一般可以表示 20G 的數(shù)據(jù)文件,它的工作原理是直接利用操作系統(tǒng)的 Page 來實(shí)現(xiàn)文件到物理內(nèi)存的直接映射,完成映射之后對物理內(nèi)存的操作會(huì)被同步到硬盤上。

支持百萬級TPS,Kafka是怎么做到的?答案藏在這10張圖里
MMAP原理

通過MMAP技術(shù)進(jìn)程可以像讀寫硬盤一樣讀寫內(nèi)存(邏輯內(nèi)存),不必關(guān)心內(nèi)存的大小,因?yàn)橛刑摂M內(nèi)存兜底。這種方式可以獲取很大的I/O提升,省去了用戶空間到內(nèi)核空間復(fù)制的開銷。

也有一個(gè)很明顯的缺陷,寫到MMAP中的數(shù)據(jù)并沒有被真正的寫到硬盤,操作系統(tǒng)會(huì)在程序主動(dòng)調(diào)用 flush 的時(shí)候才把數(shù)據(jù)真正的寫到硬盤。

Kafka提供了一個(gè)參數(shù):producer.type 來控制是不是主動(dòng) flush,如果Kafka寫入到MMAP之后就立即flush然后再返回Producer叫同步(sync);寫入MMAP之后立即返回Producer不調(diào)用flush叫異步(async)。

Zero Copy(零拷貝)

Kafka 另外一個(gè)黑技術(shù)就是使用了零拷貝,要想深刻理解零拷貝必須得知道什么是DMA。

什么是DMA?

眾所周知 CPU 的速度與磁盤 IO 的速度比起來相差幾個(gè)數(shù)量級,可以用烏龜和火箭做比喻。

一般來說 IO 操作都是由 CPU 發(fā)出指令,然后等待 IO 設(shè)備完成操作后返回,那CPU會(huì)有大量的時(shí)間都在等待IO操作。

但是CPU 的等待在很多時(shí)候并沒有太多的實(shí)際意義,我們對于 I/O 設(shè)備的大量操作其實(shí)都只是把內(nèi)存里面的數(shù)據(jù)傳輸?shù)?I/O 設(shè)備而已。比如進(jìn)行大文件復(fù)制,如果所有數(shù)據(jù)都要經(jīng)過 CPU,實(shí)在是有點(diǎn)兒太浪費(fèi)時(shí)間了。

基于此就有了DMA技術(shù),翻譯過來也就是直接內(nèi)存訪問(Direct Memory Access),有了這個(gè)可以減少 CPU 的等待時(shí)間。

Kafka 零拷貝原理

如果不使用零拷貝技術(shù),消費(fèi)者(consumer)從Kafka消費(fèi)數(shù)據(jù),Kafka從磁盤讀數(shù)據(jù)然后發(fā)送到網(wǎng)絡(luò)上去,數(shù)據(jù)一共發(fā)生了四次傳輸?shù)倪^程。其中兩次是 DMA 的傳輸,另外兩次,則是通過 CPU 控制的傳輸。

支持百萬級TPS,Kafka是怎么做到的?答案藏在這10張圖里
四次傳輸過程

第一次傳輸:從硬盤上將數(shù)據(jù)讀到操作系統(tǒng)內(nèi)核的緩沖區(qū)里,這個(gè)傳輸是通過 DMA 搬運(yùn)的。

第二次傳輸:從內(nèi)核緩沖區(qū)里面的數(shù)據(jù)復(fù)制到分配的內(nèi)存里面,這個(gè)傳輸是通過 CPU 搬運(yùn)的。

第三次傳輸:從分配的內(nèi)存里面再寫到操作系統(tǒng)的 Socket 的緩沖區(qū)里面去,這個(gè)傳輸是由 CPU 搬運(yùn)的。

第四次傳輸:從 Socket 的緩沖區(qū)里面寫到網(wǎng)卡的緩沖區(qū)里面去,這個(gè)傳輸是通過 DMA 搬運(yùn)的。

實(shí)際上在kafka中只進(jìn)行了兩次數(shù)據(jù)傳輸,如下圖:

支持百萬級TPS,Kafka是怎么做到的?答案藏在這10張圖里
兩次傳輸,零拷貝技術(shù)

第一次傳輸:通過 DMA從硬盤直接讀到操作系統(tǒng)內(nèi)核的讀緩沖區(qū)里面。

第二次傳輸:根據(jù) Socket 的描述符信息直接從讀緩沖區(qū)里面寫入到網(wǎng)卡的緩沖區(qū)里面。

我們可以看到同一份數(shù)據(jù)的傳輸次數(shù)從四次變成了兩次,并且沒有通過 CPU 來進(jìn)行數(shù)據(jù)搬運(yùn),所有的數(shù)據(jù)都是通過 DMA 來進(jìn)行傳輸?shù)?。沒有在內(nèi)存層面去復(fù)制(Copy)數(shù)據(jù),這個(gè)方法稱之為零拷貝(Zero-Copy)。

無論傳輸數(shù)據(jù)量的大小,傳輸同樣的數(shù)據(jù)使用了零拷貝能夠縮短 65% 的時(shí)間,大幅度提升了機(jī)器傳輸數(shù)據(jù)的吞吐量,這也是Kafka能夠支持百萬TPS的一個(gè)重要原因。

Batch Data(數(shù)據(jù)批量處理)

當(dāng)消費(fèi)者(consumer)需要消費(fèi)數(shù)據(jù)時(shí),首先想到的是消費(fèi)者需要一條,kafka發(fā)送一條,消費(fèi)者再要一條kafka再發(fā)送一條。但實(shí)際上 Kafka 不是這樣做的,Kafka 耍小聰明了。

Kafka 把所有的消息都存放在一個(gè)一個(gè)的文件中,當(dāng)消費(fèi)者需要數(shù)據(jù)的時(shí)候 Kafka 直接把文件發(fā)送給消費(fèi)者。比如說100萬條消息放在一個(gè)文件中可能是10M的數(shù)據(jù)量,如果消費(fèi)者和Kafka之間網(wǎng)絡(luò)良好,10MB大概1秒就能發(fā)送完,既100萬TPS,Kafka每秒處理了10萬條消息。

看到這里你可以有疑問了,消費(fèi)者只需要一條消息啊,kafka把整個(gè)文件都發(fā)送過來了,文件里面剩余的消息怎么辦?不要忘了消費(fèi)者可以通過offset記錄消費(fèi)進(jìn)度。

發(fā)送文件還有一個(gè)好處就是可以對文件進(jìn)行批量壓縮,減少網(wǎng)絡(luò)IO損耗。

總結(jié)

最后再總結(jié)一下 Kafka 支持百萬級 TPS 的秘密:

(1)順序?qū)懭霐?shù)據(jù),在 Partition 末尾追加,所以速度最優(yōu)。

(2)使用 MMAP 技術(shù)將磁盤文件與內(nèi)存映射,Kafka 可以像操作磁盤一樣操作內(nèi)存。

(3)通過 DMA 技術(shù)實(shí)現(xiàn)零拷貝,減少數(shù)據(jù)傳輸次數(shù)。

(4)讀取數(shù)據(jù)時(shí)配合sendfile直接暴力輸出,批量壓縮把所有消息變成一個(gè)批量文件,合理減少網(wǎng)絡(luò)IO損耗。

- END -


特別推薦一個(gè)分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長按關(guān)注一下:

支持百萬級TPS,Kafka是怎么做到的?答案藏在這10張圖里

支持百萬級TPS,Kafka是怎么做到的?答案藏在這10張圖里

支持百萬級TPS,Kafka是怎么做到的?答案藏在這10張圖里

長按訂閱更多精彩▼

支持百萬級TPS,Kafka是怎么做到的?答案藏在這10張圖里

如有收獲,點(diǎn)個(gè)在看,誠摯感謝

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉