精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Kafka 為什么這么快?

開(kāi)發(fā) 架構(gòu)
客戶端 producer 有個(gè)參數(shù) batch.size,默認(rèn)是 16KB。它會(huì)為每個(gè)分區(qū)緩存消息,一旦滿了就打包將消息批量發(fā)出。看上去這是個(gè)能夠提升性能的設(shè)計(jì)。不過(guò)很顯然,因?yàn)檫@個(gè)參數(shù)是分區(qū)級(jí)別的,如果分區(qū)數(shù)越多,這部分緩存所需的內(nèi)存占用也會(huì)更多。

深入地從 IO、線程、數(shù)據(jù)結(jié)構(gòu)、編碼等方面剖析了 Redis “快”的內(nèi)部秘密。

65 哥深受啟發(fā),在學(xué)習(xí) Kafka 的過(guò)程中,發(fā)現(xiàn) Kafka 也是一個(gè)性能十分優(yōu)秀的中間件,遂要求『碼哥』講一講 Kafka 性能優(yōu)化方面的知識(shí),所以『碼哥』決定將這篇性能方面的博文作為 Kafka 系列的開(kāi)篇之作。

先預(yù)告一下 Kafka 系列文章,大家敬請(qǐng)期待哦:

圖片圖片

以講解性能作為 Kafka 之旅的開(kāi)篇之作,讓我們一起來(lái)深入了解 Kafka “快”的內(nèi)部秘密。

你不僅可以學(xué)習(xí)到 Kafka 性能優(yōu)化的各種手段,也可以提煉出各種性能優(yōu)化的方法論,這些方法論也可以應(yīng)用到我們自己的項(xiàng)目之中,助力我們寫出高性能的項(xiàng)目。

關(guān)公戰(zhàn)秦瓊

65: Redis 和 Kafka 完全是不同作用的中間件,有比較性嗎?

是的,所以此文講的不是《分布式緩存的選型》,也不是《分布式中間件對(duì)比》。我們聚焦于這兩個(gè)不同領(lǐng)域的項(xiàng)目對(duì)性能的優(yōu)化,看一看優(yōu)秀項(xiàng)目對(duì)性能優(yōu)化的通用手段,以及在針對(duì)不同場(chǎng)景下的特色的優(yōu)化方式。

很多人學(xué)習(xí)了很多東西,了解了很多框架,但在遇到實(shí)際問(wèn)題時(shí),卻常常會(huì)感覺(jué)到知識(shí)不足。這就是沒(méi)有將學(xué)習(xí)到的知識(shí)體系化,沒(méi)有從具體的實(shí)現(xiàn)中抽象出可以行之有效的方法論。

學(xué)習(xí)開(kāi)源項(xiàng)目很重要的一點(diǎn)就是歸納,將不同項(xiàng)目的優(yōu)秀實(shí)現(xiàn)總結(jié)出方法論,然后演繹到自我的實(shí)踐中去。

Kafka 性能全景

圖片圖片

從高度抽象的角度來(lái)看,性能問(wèn)題逃不出下面三個(gè)方面:

  • 網(wǎng)絡(luò)
  • 磁盤
  • 復(fù)雜度

對(duì)于 Kafka 這種網(wǎng)絡(luò)分布式隊(duì)列來(lái)說(shuō),網(wǎng)絡(luò)和磁盤更是優(yōu)化的重中之重。針對(duì)于上面提出的抽象問(wèn)題,解決方案高度抽象出來(lái)也很簡(jiǎn)單:

  • 并發(fā)
  • 壓縮
  • 批量
  • 緩存
  • 算法

知道了問(wèn)題和思路,我們?cè)賮?lái)看看,在 Kafka 中,有哪些角色,而這些角色就是可以優(yōu)化的點(diǎn):

  • Producer
  • Broker
  • Consumer

是的,所有的問(wèn)題,思路,優(yōu)化點(diǎn)都已經(jīng)列出來(lái)了,我們可以盡可能的細(xì)化,三個(gè)方向都可以細(xì)化,如此,所有的實(shí)現(xiàn)便一目了然,即使不看 Kafka 的實(shí)現(xiàn),我們自己也可以想到一二點(diǎn)可以優(yōu)化的地方。

這就是思考方式。提出問(wèn)題 > 列出問(wèn)題點(diǎn) > 列出優(yōu)化方法 > 列出具體可切入的點(diǎn) > tradeoff和細(xì)化實(shí)現(xiàn)。

現(xiàn)在,你也可以嘗試自己想一想優(yōu)化的點(diǎn)和方法,不用盡善盡美,不用管好不好實(shí)現(xiàn),想一點(diǎn)是一點(diǎn)。

★65 哥:不行啊,我很笨,也很懶,你還是直接和我說(shuō)吧,我白嫖比較行。

順序?qū)?/h2>

★65 哥:人家 Redis 是基于純內(nèi)存的系統(tǒng),你 kafka 還要讀寫磁盤,能比?

為什么說(shuō)寫磁盤慢?

我們不能只知道結(jié)論,而不知其所以然。要回答這個(gè)問(wèn)題,就得回到在校時(shí)我們學(xué)的操作系統(tǒng)課程了。65 哥還留著課本嗎?來(lái),翻到講磁盤的章節(jié),讓我們回顧一下磁盤的運(yùn)行原理。

★65 哥:鬼還留著哦,課程還沒(méi)上到一半書就沒(méi)了。要不是考試俺眼神好,估計(jì)現(xiàn)在還沒(méi)畢業(yè)。

看經(jīng)典大圖:

圖片圖片

完成一次磁盤 IO,需要經(jīng)過(guò)尋道、旋轉(zhuǎn)和數(shù)據(jù)傳輸三個(gè)步驟。

影響磁盤 IO 性能的因素也就發(fā)生在上面三個(gè)步驟上,因此主要花費(fèi)的時(shí)間就是:

  1. 尋道時(shí)間:Tseek 是指將讀寫磁頭移動(dòng)至正確的磁道上所需要的時(shí)間。尋道時(shí)間越短,I/O 操作越快,目前磁盤的平均尋道時(shí)間一般在 3-15ms。
  2. 旋轉(zhuǎn)延遲:Trotation 是指盤片旋轉(zhuǎn)將請(qǐng)求數(shù)據(jù)所在的扇區(qū)移動(dòng)到讀寫磁盤下方所需要的時(shí)間。旋轉(zhuǎn)延遲取決于磁盤轉(zhuǎn)速,通常用磁盤旋轉(zhuǎn)一周所需時(shí)間的 1/2 表示。比如:7200rpm 的磁盤平均旋轉(zhuǎn)延遲大約為 60*1000/7200/2 = 4.17ms,而轉(zhuǎn)速為 15000rpm 的磁盤其平均旋轉(zhuǎn)延遲為 2ms。
  3. 數(shù)據(jù)傳輸時(shí)間:Ttransfer 是指完成傳輸所請(qǐng)求的數(shù)據(jù)所需要的時(shí)間,它取決于數(shù)據(jù)傳輸率,其值等于數(shù)據(jù)大小除以數(shù)據(jù)傳輸率。目前 IDE/ATA 能達(dá)到 133MB/s,SATA II 可達(dá)到 300MB/s 的接口數(shù)據(jù)傳輸率,數(shù)據(jù)傳輸時(shí)間通常遠(yuǎn)小于前兩部分消耗時(shí)間。簡(jiǎn)單計(jì)算時(shí)可忽略。

因此,如果在寫磁盤的時(shí)候省去尋道、旋轉(zhuǎn)可以極大地提高磁盤讀寫的性能。

Kafka 采用順序?qū)懳募姆绞絹?lái)提高磁盤寫入性能。順序?qū)懳募緶p少了磁盤尋道和旋轉(zhuǎn)的次數(shù)。磁頭再也不用在磁道上亂舞了,而是一路向前飛速前行。

Kafka 中每個(gè)分區(qū)是一個(gè)有序的,不可變的消息序列,新的消息不斷追加到 Partition 的末尾,在 Kafka 中 Partition 只是一個(gè)邏輯概念,Kafka 將 Partition 劃分為多個(gè) Segment,每個(gè) Segment 對(duì)應(yīng)一個(gè)物理文件,Kafka 對(duì) segment 文件追加寫,這就是順序?qū)懳募?/p>

★65 哥:為什么 Kafka 可以使用追加寫的方式呢?

這和 Kafka 的性質(zhì)有關(guān),我們來(lái)看看 Kafka 和 Redis,說(shuō)白了,Kafka 就是一個(gè)Queue,而 Redis 就是一個(gè)HashMap。Queue和Map的區(qū)別是什么?

Queue 是 FIFO 的,數(shù)據(jù)是有序的;HashMap數(shù)據(jù)是無(wú)序的,是隨機(jī)讀寫的。Kafka 的不可變性,有序性使得 Kafka 可以使用追加寫的方式寫文件。

其實(shí)很多符合以上特性的數(shù)據(jù)系統(tǒng),都可以采用追加寫的方式來(lái)優(yōu)化磁盤性能。典型的有Redis的 AOF 文件,各種數(shù)據(jù)庫(kù)的WAL(Write ahead log)機(jī)制等等。

★所以清楚明白自身業(yè)務(wù)的特點(diǎn),就可以針對(duì)性地做出優(yōu)化。

零拷貝

★65 哥:哈哈,這個(gè)我面試被問(wèn)到過(guò)。可惜答得一般般,唉。

什么是零拷貝?

我們從 Kafka 的場(chǎng)景來(lái)看,Kafka Consumer 消費(fèi)存儲(chǔ)在 Broker 磁盤的數(shù)據(jù),從讀取 Broker 磁盤到網(wǎng)絡(luò)傳輸給 Consumer,期間涉及哪些系統(tǒng)交互。Kafka Consumer 從 Broker 消費(fèi)數(shù)據(jù),Broker 讀取 Log,就使用了 sendfile。如果使用傳統(tǒng)的 IO 模型,偽代碼邏輯就如下所示:

readFile(buffer)
send(buffer)

如圖,如果采用傳統(tǒng)的 IO 流程,先讀取網(wǎng)絡(luò) IO,再寫入磁盤 IO,實(shí)際需要將數(shù)據(jù) Copy 四次。

圖片圖片

  1. 第一次:讀取磁盤文件到操作系統(tǒng)內(nèi)核緩沖區(qū);
  2. 第二次:將內(nèi)核緩沖區(qū)的數(shù)據(jù),copy 到應(yīng)用程序的 buffer;
  3. 第三步:將應(yīng)用程序 buffer 中的數(shù)據(jù),copy 到 socket 網(wǎng)絡(luò)發(fā)送緩沖區(qū);
  4. 第四次:將 socket buffer 的數(shù)據(jù),copy 到網(wǎng)卡,由網(wǎng)卡進(jìn)行網(wǎng)絡(luò)傳輸。

★65 哥:啊,操作系統(tǒng)這么傻嗎?copy 來(lái) copy 去的。

并不是操作系統(tǒng)傻,操作系統(tǒng)的設(shè)計(jì)就是每個(gè)應(yīng)用程序都有自己的用戶內(nèi)存,用戶內(nèi)存和內(nèi)核內(nèi)存隔離,這是為了程序和系統(tǒng)安全考慮,否則的話每個(gè)應(yīng)用程序內(nèi)存滿天飛,隨意讀寫那還得了。

不過(guò),還有零拷貝技術(shù),英文——Zero-Copy。零拷貝就是盡量去減少上面數(shù)據(jù)的拷貝次數(shù),從而減少拷貝的 CPU 開(kāi)銷,減少用戶態(tài)內(nèi)核態(tài)的上下文切換次數(shù),從而優(yōu)化數(shù)據(jù)傳輸?shù)男阅堋?/p>

常見(jiàn)的零拷貝思路主要有三種:

  • 直接 I/O:數(shù)據(jù)直接跨過(guò)內(nèi)核,在用戶地址空間與 I/O 設(shè)備之間傳遞,內(nèi)核只是進(jìn)行必要的虛擬存儲(chǔ)配置等輔助工作;
  • 避免內(nèi)核和用戶空間之間的數(shù)據(jù)拷貝:當(dāng)應(yīng)用程序不需要對(duì)數(shù)據(jù)進(jìn)行訪問(wèn)時(shí),則可以避免將數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間;
  • 寫時(shí)復(fù)制:數(shù)據(jù)不需要提前拷貝,而是當(dāng)需要修改的時(shí)候再進(jìn)行部分拷貝。

Kafka 使用到了 mmap 和 sendfile 的方式來(lái)實(shí)現(xiàn)零拷貝。分別對(duì)應(yīng) Java 的 MappedByteBuffer 和 FileChannel.transferTo。

使用 Java NIO 實(shí)現(xiàn)零拷貝,如下:

FileChannel.transferTo()

圖片圖片

在此模型下,上下文切換的數(shù)量減少到一個(gè)。具體而言,transferTo()方法指示塊設(shè)備通過(guò) DMA 引擎將數(shù)據(jù)讀取到讀取緩沖區(qū)中。然后,將該緩沖區(qū)復(fù)制到另一個(gè)內(nèi)核緩沖區(qū)以暫存到套接字。最后,套接字緩沖區(qū)通過(guò) DMA 復(fù)制到 NIC 緩沖區(qū)。

圖片圖片

我們將副本數(shù)從四減少到三,并且這些副本中只有一個(gè)涉及 CPU。我們還將上下文切換的數(shù)量從四個(gè)減少到了兩個(gè)。這是一個(gè)很大的改進(jìn),但是還沒(méi)有查詢零副本。當(dāng)運(yùn)行 Linux 內(nèi)核 2.4 及更高版本以及支持收集操作的網(wǎng)絡(luò)接口卡時(shí),后者可以作為進(jìn)一步的優(yōu)化來(lái)實(shí)現(xiàn)。如下所示:

圖片圖片

根據(jù)前面的示例,調(diào)用transferTo()方法會(huì)使設(shè)備通過(guò) DMA 引擎將數(shù)據(jù)讀取到內(nèi)核讀取緩沖區(qū)中。但是,使用gather操作時(shí),讀取緩沖區(qū)和套接字緩沖區(qū)之間沒(méi)有復(fù)制。取而代之的是,給 NIC 一個(gè)指向讀取緩沖區(qū)的指針以及偏移量和長(zhǎng)度,該偏移量和長(zhǎng)度由 DMA 清除。CPU 絕對(duì)不參與復(fù)制緩沖區(qū)。

關(guān)于零拷貝詳情,可以詳讀這篇文章零拷貝 (Zero-copy) 淺析及其應(yīng)用。

PageCache

圖片圖片

producer 生產(chǎn)消息到 Broker 時(shí),Broker 會(huì)使用 pwrite() 系統(tǒng)調(diào)用【對(duì)應(yīng)到 Java NIO 的 FileChannel.write() API】按偏移量寫入數(shù)據(jù),此時(shí)數(shù)據(jù)都會(huì)先寫入page cache。consumer 消費(fèi)消息時(shí),Broker 使用 sendfile() 系統(tǒng)調(diào)用【對(duì)應(yīng) FileChannel.transferTo() API】,零拷貝地將數(shù)據(jù)從 page cache 傳輸?shù)?broker 的 Socket buffer,再通過(guò)網(wǎng)絡(luò)傳輸。

leader 與 follower 之間的同步,與上面 consumer 消費(fèi)數(shù)據(jù)的過(guò)程是同理的。

page cache中的數(shù)據(jù)會(huì)隨著內(nèi)核中 flusher 線程的調(diào)度以及對(duì) sync()/fsync() 的調(diào)用寫回到磁盤,就算進(jìn)程崩潰,也不用擔(dān)心數(shù)據(jù)丟失。另外,如果 consumer 要消費(fèi)的消息不在page cache里,才會(huì)去磁盤讀取,并且會(huì)順便預(yù)讀出一些相鄰的塊放入 page cache,以方便下一次讀取。

因此如果 Kafka producer 的生產(chǎn)速率與 consumer 的消費(fèi)速率相差不大,那么就能幾乎只靠對(duì) broker page cache 的讀寫完成整個(gè)生產(chǎn) - 消費(fèi)過(guò)程,磁盤訪問(wèn)非常少。

網(wǎng)絡(luò)模型

★65 哥:網(wǎng)絡(luò)嘛,作為 Java 程序員,自然是 Netty

是的,Netty 是 JVM 領(lǐng)域一個(gè)優(yōu)秀的網(wǎng)絡(luò)框架,提供了高性能的網(wǎng)絡(luò)服務(wù)。大多數(shù) Java 程序員提到網(wǎng)絡(luò)框架,首先想到的就是 Netty。Dubbo、Avro-RPC 等等優(yōu)秀的框架都使用 Netty 作為底層的網(wǎng)絡(luò)通信框架。

Kafka 自己實(shí)現(xiàn)了網(wǎng)絡(luò)模型做 RPC。底層基于 Java NIO,采用和 Netty 一樣的 Reactor 線程模型。

圖片圖片

Reacotr 模型主要分為三個(gè)角色

  • Reactor:把 IO 事件分配給對(duì)應(yīng)的 handler 處理
  • Acceptor:處理客戶端連接事件
  • Handler:處理非阻塞的任務(wù)

在傳統(tǒng)阻塞 IO 模型中,每個(gè)連接都需要獨(dú)立線程處理,當(dāng)并發(fā)數(shù)大時(shí),創(chuàng)建線程數(shù)多,占用資源;采用阻塞 IO 模型,連接建立后,若當(dāng)前線程沒(méi)有數(shù)據(jù)可讀,線程會(huì)阻塞在讀操作上,造成資源浪費(fèi)

針對(duì)傳統(tǒng)阻塞 IO 模型的兩個(gè)問(wèn)題,Reactor 模型基于池化思想,避免為每個(gè)連接創(chuàng)建線程,連接完成后將業(yè)務(wù)處理交給線程池處理;基于 IO 復(fù)用模型,多個(gè)連接共用同一個(gè)阻塞對(duì)象,不用等待所有的連接。遍歷到有新數(shù)據(jù)可以處理時(shí),操作系統(tǒng)會(huì)通知程序,線程跳出阻塞狀態(tài),進(jìn)行業(yè)務(wù)邏輯處理

Kafka 即基于 Reactor 模型實(shí)現(xiàn)了多路復(fù)用和處理線程池。其設(shè)計(jì)如下:

圖片圖片

其中包含了一個(gè)Acceptor線程,用于處理新的連接,Acceptor 有 N 個(gè) Processor 線程 select 和 read socket 請(qǐng)求,N 個(gè) Handler 線程處理請(qǐng)求并相應(yīng),即處理業(yè)務(wù)邏輯。

I/O 多路復(fù)用可以通過(guò)把多個(gè) I/O 的阻塞復(fù)用到同一個(gè) select 的阻塞上,從而使得系統(tǒng)在單線程的情況下可以同時(shí)處理多個(gè)客戶端請(qǐng)求。它的最大優(yōu)勢(shì)是系統(tǒng)開(kāi)銷小,并且不需要?jiǎng)?chuàng)建新的進(jìn)程或者線程,降低了系統(tǒng)的資源開(kāi)銷。

總結(jié): Kafka Broker 的 KafkaServer 設(shè)計(jì)是一個(gè)優(yōu)秀的網(wǎng)絡(luò)架構(gòu),有想了解 Java 網(wǎng)絡(luò)編程,或需要使用到這方面技術(shù)的同學(xué)不妨去讀一讀源碼。后續(xù)『碼哥』的 Kafka 系列文章也將涉及這塊源碼的解讀。

批量與壓縮

Kafka Producer 向 Broker 發(fā)送消息不是一條消息一條消息的發(fā)送。使用過(guò) Kafka 的同學(xué)應(yīng)該知道,Producer 有兩個(gè)重要的參數(shù):batch.size和linger.ms。這兩個(gè)參數(shù)就和 Producer 的批量發(fā)送有關(guān)。

Kafka Producer 的執(zhí)行流程如下圖所示:

圖片圖片

發(fā)送消息依次經(jīng)過(guò)以下處理器:

  • Serialize:鍵和值都根據(jù)傳遞的序列化器進(jìn)行序列化。優(yōu)秀的序列化方式可以提高網(wǎng)絡(luò)傳輸?shù)男省?/li>
  • Partition:決定將消息寫入主題的哪個(gè)分區(qū),默認(rèn)情況下遵循 murmur2 算法。自定義分區(qū)程序也可以傳遞給生產(chǎn)者,以控制應(yīng)將消息寫入哪個(gè)分區(qū)。
  • Compress:默認(rèn)情況下,在 Kafka 生產(chǎn)者中不啟用壓縮.Compression 不僅可以更快地從生產(chǎn)者傳輸?shù)酱恚€可以在復(fù)制過(guò)程中進(jìn)行更快的傳輸。壓縮有助于提高吞吐量,降低延遲并提高磁盤利用率。
  • Accumulate:Accumulate顧名思義,就是一個(gè)消息累計(jì)器。其內(nèi)部為每個(gè) Partition 維護(hù)一個(gè)Deque雙端隊(duì)列,隊(duì)列保存將要發(fā)送的批次數(shù)據(jù),Accumulate將數(shù)據(jù)累計(jì)到一定數(shù)量,或者在一定過(guò)期時(shí)間內(nèi),便將數(shù)據(jù)以批次的方式發(fā)送出去。記錄被累積在主題每個(gè)分區(qū)的緩沖區(qū)中。根據(jù)生產(chǎn)者批次大小屬性將記錄分組。主題中的每個(gè)分區(qū)都有一個(gè)單獨(dú)的累加器 / 緩沖區(qū)。
  • Group Send:記錄累積器中分區(qū)的批次按將它們發(fā)送到的代理分組。批處理中的記錄基于 batch.size 和 linger.ms 屬性發(fā)送到代理。記錄由生產(chǎn)者根據(jù)兩個(gè)條件發(fā)送。當(dāng)達(dá)到定義的批次大小或達(dá)到定義的延遲時(shí)間時(shí)。

Kafka 支持多種壓縮算法:lz4、snappy、gzip。Kafka 2.1.0 正式支持 ZStandard —— ZStandard 是 Facebook 開(kāi)源的壓縮算法,旨在提供超高的壓縮比 (compression ratio),具體細(xì)節(jié)參見(jiàn) zstd。

Producer、Broker 和 Consumer 使用相同的壓縮算法,在 producer 向 Broker 寫入數(shù)據(jù),Consumer 向 Broker 讀取數(shù)據(jù)時(shí)甚至可以不用解壓縮,最終在 Consumer Poll 到消息時(shí)才解壓,這樣節(jié)省了大量的網(wǎng)絡(luò)和磁盤開(kāi)銷。

分區(qū)并發(fā)

Kafka 的 Topic 可以分成多個(gè) Partition,每個(gè) Paritition 類似于一個(gè)隊(duì)列,保證數(shù)據(jù)有序。同一個(gè) Group 下的不同 Consumer 并發(fā)消費(fèi) Paritition,分區(qū)實(shí)際上是調(diào)優(yōu) Kafka 并行度的最小單元,因此,可以說(shuō),每增加一個(gè) Paritition 就增加了一個(gè)消費(fèi)并發(fā)。

圖片圖片

Kafka 具有優(yōu)秀的分區(qū)分配算法——StickyAssignor,可以保證分區(qū)的分配盡量地均衡,且每一次重分配的結(jié)果盡量與上一次分配結(jié)果保持一致。這樣,整個(gè)集群的分區(qū)盡量地均衡,各個(gè) Broker 和 Consumer 的處理不至于出現(xiàn)太大的傾斜。

★65 哥:那是不是分區(qū)數(shù)越多越好呢?

當(dāng)然不是。

越多的分區(qū)需要打開(kāi)更多的文件句柄

在 Kafka 的 broker 中,每個(gè)分區(qū)都會(huì)對(duì)照著文件系統(tǒng)的一個(gè)目錄。在 kafka 的數(shù)據(jù)日志文件目錄中,每個(gè)日志數(shù)據(jù)段都會(huì)分配兩個(gè)文件,一個(gè)索引文件和一個(gè)數(shù)據(jù)文件。因此,隨著 partition 的增多,需要的文件句柄數(shù)急劇增加,必要時(shí)需要調(diào)整操作系統(tǒng)允許打開(kāi)的文件句柄數(shù)。

客戶端 / 服務(wù)器端需要使用的內(nèi)存就越多

客戶端 producer 有個(gè)參數(shù) batch.size,默認(rèn)是 16KB。它會(huì)為每個(gè)分區(qū)緩存消息,一旦滿了就打包將消息批量發(fā)出。看上去這是個(gè)能夠提升性能的設(shè)計(jì)。不過(guò)很顯然,因?yàn)檫@個(gè)參數(shù)是分區(qū)級(jí)別的,如果分區(qū)數(shù)越多,這部分緩存所需的內(nèi)存占用也會(huì)更多。

降低高可用性

分區(qū)越多,每個(gè) Broker 上分配的分區(qū)也就越多,當(dāng)一個(gè)發(fā)生 Broker 宕機(jī),那么恢復(fù)時(shí)間將很長(zhǎng)。

文件結(jié)構(gòu)

Kafka 消息是以 Topic 為單位進(jìn)行歸類,各個(gè) Topic 之間是彼此獨(dú)立的,互不影響。每個(gè) Topic 又可以分為一個(gè)或多個(gè)分區(qū)。每個(gè)分區(qū)各自存在一個(gè)記錄消息數(shù)據(jù)的日志文件。

Kafka 每個(gè)分區(qū)日志在物理上實(shí)際按大小被分成多個(gè) Segment。

圖片圖片

  • segment file 組成:由 2 大部分組成,分別為 index file 和 data file,此 2 個(gè)文件一一對(duì)應(yīng),成對(duì)出現(xiàn),后綴”.index”和“.log”分別表示為 segment 索引文件、數(shù)據(jù)文件。
  • segment 文件命名規(guī)則:partion 全局的第一個(gè) segment 從 0 開(kāi)始,后續(xù)每個(gè) segment 文件名為上一個(gè) segment 文件最后一條消息的 offset 值。數(shù)值最大為 64 位 long 大小,19 位數(shù)字字符長(zhǎng)度,沒(méi)有數(shù)字用 0 填充。

index 采用稀疏索引,這樣每個(gè) index 文件大小有限,Kafka 采用mmap的方式,直接將 index 文件映射到內(nèi)存,這樣對(duì) index 的操作就不需要操作磁盤 IO。mmap的 Java 實(shí)現(xiàn)對(duì)應(yīng) MappedByteBuffer 。

★65 哥筆記:mmap 是一種內(nèi)存映射文件的方法。即將一個(gè)文件或者其它對(duì)象映射到進(jìn)程的地址空間,實(shí)現(xiàn)文件磁盤地址和進(jìn)程虛擬地址空間中一段虛擬地址的一一對(duì)映關(guān)系。實(shí)現(xiàn)這樣的映射關(guān)系后,進(jìn)程就可以采用指針的方式讀寫操作這一段內(nèi)存,而系統(tǒng)會(huì)自動(dòng)回寫臟頁(yè)面到對(duì)應(yīng)的文件磁盤上,即完成了對(duì)文件的操作而不必再調(diào)用 read,write 等系統(tǒng)調(diào)用函數(shù)。相反,內(nèi)核空間對(duì)這段區(qū)域的修改也直接反映用戶空間,從而可以實(shí)現(xiàn)不同進(jìn)程間的文件共享。

Kafka 充分利用二分法來(lái)查找對(duì)應(yīng) offset 的消息位置:

圖片圖片

  1. 按照二分法找到小于 offset 的 segment 的.log 和.index
  2. 用目標(biāo) offset 減去文件名中的 offset 得到消息在這個(gè) segment 中的偏移量。
  3. 再次用二分法在 index 文件中找到對(duì)應(yīng)的索引。
  4. 到 log 文件中,順序查找,直到找到 offset 對(duì)應(yīng)的消息。
責(zé)任編輯:武曉燕 來(lái)源: 碼哥字節(jié)
相關(guān)推薦

2020-03-30 15:05:46

Kafka消息數(shù)據(jù)

2024-11-26 08:52:34

SQL優(yōu)化Kafka

2020-02-27 21:03:30

調(diào)度器架構(gòu)效率

2020-02-27 15:44:41

Nginx服務(wù)器反向代理

2023-08-29 07:46:08

Redis數(shù)據(jù)ReHash

2020-10-15 09:19:36

Elasticsear查詢速度

2021-05-27 20:56:51

esbuild 工具JavaScript

2024-07-30 09:01:12

2024-09-14 09:41:17

2020-10-13 17:54:18

開(kāi)發(fā)Kafka數(shù)據(jù)

2021-03-22 08:30:33

Kafka源碼架構(gòu)開(kāi)發(fā)技術(shù)

2020-08-13 09:19:10

Kafka存儲(chǔ)MQ

2021-05-31 07:44:08

Kafka分布式系統(tǒng)

2023-03-21 08:02:36

Redis6.0IO多線程

2022-01-04 08:54:32

Redis數(shù)據(jù)庫(kù)數(shù)據(jù)類型

2023-11-02 10:22:29

gRPC后端通信

2024-07-24 08:38:07

2021-03-18 14:34:34

達(dá)達(dá)集團(tuán)京東云電商

2020-04-27 07:13:37

Nginx底層進(jìn)程

2020-10-21 09:17:52

Redis面試內(nèi)存
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

好吊一区二区三区视频| 日韩精品一线二线三线| 看片网站在线观看| 一级一级黄色片| 欧美日韩精品一区二区视频| 在线精品视频免费观看| 一本色道婷婷久久欧美| 精品人妻一区二区三区换脸明星| 久久久五月天| 精品国产乱子伦一区| 国产精品久久中文字幕| 激情在线视频| 久久成人免费日本黄色| 美女av一区二区| 荫蒂被男人添免费视频| 日韩成人动漫| 国产精品午夜在线观看| 91精品天堂| 国产精品视频一区在线观看| 久久亚洲国产| 亚洲国产精品专区久久| 女人另类性混交zo| caoporn97在线视频| jizz欧美性11| 日本黄色免费在线| 中文在线一区二区| 国产精品区一区二区三含羞草| 三级网站在线播放 | 国产精品制服诱惑| 国产一级特黄毛片| 国产精品扒开腿做爽爽爽视频软件| 欧美高清在线一区二区| 成人黄色片视频网站| 国产嫩bbwbbw高潮| 久久久久国产精品| 亚洲欧美日韩中文在线制服| 91亚洲一区二区| 全亚洲第一av番号网站| 亚洲国产成人精品视频| 一区二区三区四区视频在线| 日韩精品一二| 国产成人精品一区二| 国产精品精品国产| 91av在线免费视频| 亚洲视频三区| 亚洲视频小说图片| 欧美日韩高清在线一区| 国产黄a三级三级看三级| 亚洲日本激情| 久久99精品久久久久久琪琪 | 日韩三级网址| 欧美午夜精品免费| 亚洲精品蜜桃久久久久久| 日本在线观看www| 久久品道一品道久久精品| 成人午夜影院在线观看| 一级黄色大毛片| 国产精品久久久久久模特| 欧美日韩ab片| 日韩成人毛片视频| 久久综合av| 亚洲图片在区色| 国产精品无码一区二区三| 麻豆视频久久| 日韩一区二区在线观看| 中文av字幕在线观看| 另类中文字幕国产精品| 欧美日韩综合视频| 免费一级淫片aaa片毛片a级| 中文字幕在线观看网站| 亚洲欧洲综合另类| 只有这里有精品| 九七久久人人| 亚洲青青青在线视频| ijzzijzzij亚洲大全| 97影院秋霞午夜在线观看| 亚洲精品日日夜夜| 日本黄网站色大片免费观看| a级影片在线观看| 伊人一区二区三区| 屁屁影院ccyy国产第一页| 国产激情视频在线| 依依成人精品视频| 女同性恋一区二区| 日本无删减在线| 亚洲成人你懂的| 凹凸国产熟女精品视频| 黄在线观看免费网站ktv| 精品日韩美女的视频高清| 国产一区 在线播放| av免费在线视| 高跟丝袜欧美一区| 久久国产色av免费观看| 成人天堂yy6080亚洲高清 | 无码人妻精品一区二区三区不卡 | 中文字幕一区二区三区人妻电影| 午夜视频在线观看精品中文| 欧美白人最猛性xxxxx69交| 男男受被啪到高潮自述| 88久久精品| 亚洲国产中文字幕久久网 | 亚洲午夜在线播放| 久久se这里有精品| 国新精品乱码一区二区三区18| 四虎精品一区二区三区| 国产日韩欧美麻豆| 色婷婷777777仙踪林| 中文字幕在线视频久| 国产精品永久| 国产精品久久久久久五月尺 | 精品99久久久久久| 亚洲а∨天堂久久精品2021| 亚洲男女av一区二区| 51久久精品夜色国产麻豆| 在线播放一级片| 成人aaaa免费全部观看| 亚洲精蜜桃久在线| а√在线中文在线新版| 欧美日韩五月天| 在线免费观看污视频| 国产精品久久久久蜜臀| 欧美综合国产精品久久丁香| 亚洲第一页视频| 国产精品家庭影院| 缅甸午夜性猛交xxxx| 99精品在线免费观看| 亚洲美女精品成人在线视频| 欧美日韩亚洲国产另类| 蜜臀av国产精品久久久久| 精品毛片久久久久久| 青草在线视频| 欧美日高清视频| 亚洲激情视频小说| 中文一区在线| 99re视频| а天堂中文在线官网| 欧美精选在线播放| 第一次破处视频| 葵司免费一区二区三区四区五区| 国产一区免费在线| 麻豆av在线播放| 欧美一区二区三区成人| 成人无码精品1区2区3区免费看 | 国产精品区在线| 最新国产精品视频| 欧洲日韩成人av| 免费福利在线视频| 色综合久久中文字幕| 久久久久国产精品无码免费看| 国产尤物精品| 99影视tv| 欧美男男video| 精品久久久久久久久久久院品网 | 狠狠久久亚洲欧美专区| 精品影片一区二区入口| 日韩亚洲国产精品| 精品免费国产| 欧美黑人粗大| 国产亚洲精品久久久| 无码人妻精品一区二区50| 久久人人超碰精品| 中文字幕一区二区三区四区在线视频| 国内亚洲精品| 国产美女高潮久久白浆| 成人性爱视频在线观看| 欧美精选一区二区| www青青草原| 成人高清伦理免费影院在线观看| a级免费在线观看| 国产精品nxnn| 日韩av第一页| 最新国产在线观看| 5566中文字幕一区二区电影| 永久久久久久久| 国产不卡免费视频| 久久久亚洲国产精品| 久久国产精品免费精品3p| 欧美一区二区视频97| 岛国在线视频| 欧美一级片在线观看| 久久久久成人网站| 91色视频在线| 黄色小视频免费网站| 欧美一区二区三区久久精品茉莉花| 99高清视频有精品视频| 小草在线视频免费播放| 中文字幕免费精品一区高清| 国产精品玖玖玖| 亚洲高清中文字幕| 黄色aaa视频| 狠狠色丁香婷婷综合久久片| 国产av熟女一区二区三区| 男男gay无套免费视频欧美| 国产精品久在线观看| 午夜影院免费在线| 亚洲欧美成人在线| 97视频免费在线| 天天亚洲美女在线视频| 免费黄色国产视频| jlzzjlzz国产精品久久| 可以看污的网站| 国产欧美日韩一区二区三区在线| 亚洲高清在线观看一区| gogo久久日韩裸体艺术| 国产97在线视频| 尤物视频在线看| 亚洲视频综合网| 精品欧美一区二区精品少妇| 欧美午夜电影在线| 99精品久久久久| 国产性天天综合网| 久久精品无码专区| 蜜臀国产一区二区三区在线播放 | 成人动漫视频在线观看免费| 国产精品扒开腿做爽爽爽视频软件| 欧美黑人视频一区| 日本中文字幕在线看| 日韩av网站电影| 国产福利第一页| 欧美日韩精品免费观看视频| 亚洲第一在线播放| 亚洲一区二区三区视频在线 | 天天干天天操av| 91精品在线麻豆| 特级西西444www大胆免费看| 午夜精品久久久久久久| 国产成人自拍网站| 亚洲国产精品成人久久综合一区| 50一60岁老妇女毛片| 国产精品一色哟哟哟| 一区二区三区视频网| 亚洲影视综合| 99热亚洲精品| 黄色av成人| 亚洲啊啊啊啊啊| 在线精品国产| 一区二区三区av在线| 欧美欧美黄在线二区| 久久精品国产99精品国产亚洲性色| 久久伊人精品| 亚洲精品欧美日韩专区| 久久福利在线| 国产精品永久免费在线| 日产精品一区| 国产精品扒开腿做爽爽爽男男| 人狥杂交一区欧美二区| 668精品在线视频| а√在线天堂官网| 国产手机视频精品| 日韩资源在线| 亚洲人成自拍网站| 国模吧精品人体gogo| 亚洲天堂av综合网| 国产在线观看免费网站| 亚洲欧美日韩综合| 国产三级在线免费观看| 亚洲人成网7777777国产| 你懂得网站在线| 国产性色av一区二区| 成人在线免费观看| 日韩一区av在线| a视频在线播放| 久久久噜噜噜久久久| 678在线观看视频| 欧美重口另类videos人妖| 午夜精品成人av| 国产噜噜噜噜噜久久久久久久久| 欧美xxxx性| 激情亚洲一区二区三区四区| 国产精品第5页| 欧美亚洲高清一区二区三区不卡| 中文字幕人妻一区二区在线视频 | 午夜免费福利视频在线观看| 看片的网站亚洲| 日本一区二区三区在线免费观看| 国产成人啪免费观看软件| 韩国三级视频在线观看| 91麻豆免费视频| 天堂av网手机版| 伊人开心综合网| 日本韩国欧美中文字幕| 欧美三级日韩在线| 后入内射欧美99二区视频| 亚洲精品999| 91精品国产综合久久久久久豆腐| 久久精品最新地址| 啊啊啊久久久| 国产日韩欧美成人| 国产极品模特精品一二| 欧美一区二区三区在线播放 | 那种视频在线观看| 精品一区二区精品| 国产真实乱人偷精品| 久久久久久久久久电影| 国产成人自拍网站| 色综合天天综合网天天狠天天| 国产精品国产福利国产秒拍 | 亚洲人成电影在线播放| 久做在线视频免费观看| 性色av一区二区三区在线观看| 三级成人在线| 高清国产在线一区| 欧美一二区在线观看| 17c丨国产丨精品视频| 手机精品视频在线观看| 18禁一区二区三区| 国产欧美一区二区精品秋霞影院 | 欧美777四色影视在线| 久久视频在线看| 午夜欧美激情| 99热在线国产| 日韩精品一区二区三区免费观影| 草b视频在线观看| 韩国av一区二区三区四区| 爱爱的免费视频| 亚洲一区二区三区中文字幕在线 | 日韩亚洲国产中文字幕欧美| 免费播放片a高清在线观看| 久久久久久国产三级电影| 成人精品动漫| 欧美精品二区三区四区免费看视频 | 日韩免费视频一区二区| 国产精品二线| 日本高清+成人网在线观看| jazzjazz国产精品久久| 中文字幕一区二区三区最新| 三级成人在线视频| v天堂中文在线| 亚洲午夜免费电影| 国产黄色片免费观看| 日韩在线观看网站| 日韩色淫视频| 欧美一区亚洲二区| 国产精品三上| 波多野结衣影院| 偷拍亚洲欧洲综合| japanese中文字幕| 成人影院天天5g天天爽无毒影院| 日韩中文字幕亚洲精品欧美| 精品一区二区三区蜜桃| 成人做爰69片免网站| 欧美亚洲综合另类| 国产在线一二| 国产精品国产三级国产aⅴ浪潮| 天堂99x99es久久精品免费| 国产人妻777人伦精品hd| 国产不卡视频在线观看| 青青草原在线免费观看视频| 日韩欧美一级精品久久| 丝袜美腿av在线| 99精品国产高清在线观看| 亚洲精品久久久| 四川一级毛毛片| 亚洲自拍偷拍综合| 亚洲精品字幕在线观看| 久久6免费高清热精品| 亚洲精品国产九九九| 日韩免费在线观看av| 国产999精品久久久久久| 男人天堂中文字幕| 亚洲第一av网站| 黄毛片在线观看| 日本在线高清视频一区| 亚洲永久免费| 国产又粗又长又硬| 欧美一卡在线观看| av在线最新| 日韩亚洲视频在线| 精品一区二区三区av| 欧美成人免费看| 日韩av在线不卡| 成人1区2区| 日韩一二区视频| 99re免费视频精品全部| 中文字幕人成人乱码亚洲电影| 蜜臀久久99精品久久久无需会员| youjizzjizz亚洲| 日韩有码免费视频| **性色生活片久久毛片| 蜜桃久久一区二区三区| 国产mv免费观看入口亚洲| 天天久久综合| 国产真实乱人偷精品| 欧美日韩午夜在线视频| 9999在线视频| 亚洲欧洲精品在线| 成人高清视频在线观看| 夜夜躁日日躁狠狠久久av| 欧美精品在线免费| 猛男gaygay欧美视频| 成人三级做爰av| 日本道免费精品一区二区三区| 国产成人无吗| 鲁丝一区二区三区免费| 国精产品一区一区三区mba桃花| 亚洲另类欧美日韩| 久久亚洲电影天堂| 猛男gaygay欧美视频| 男人添女人荫蒂国产| 欧美日韩综合在线免费观看|