和平區(qū)網(wǎng)站建設(shè)房地產(chǎn)估價(jià)師考試
零拷貝
Kafka 使用到了 mmap 和 sendfile 的方式來實(shí)現(xiàn)零拷貝。分別對(duì)應(yīng) Java 的 MappedByteBuffer 和 FileChannel.transferTo
順序?qū)懘疟P
- Kafka 采用順序?qū)懳募姆绞絹硖岣叽疟P寫入性能。順序?qū)懳募?#xff0c;基本減少了磁盤尋道和旋轉(zhuǎn)的次數(shù)
- 完成一次磁盤 IO,需要經(jīng)過尋道、旋轉(zhuǎn)和數(shù)據(jù)傳輸三個(gè)步驟,如果在寫磁盤的時(shí)候省去尋道、旋轉(zhuǎn)可以極大地提高磁盤讀寫的性能。
- Kafka 中每個(gè)分區(qū)是一個(gè)有序的,不可變的消息序列,新的消息不斷追加到 Partition 的末尾,在 Kafka 中 Partition 只是一個(gè)邏輯概念,Kafka 將 Partition 劃分為多個(gè) Segment,每個(gè) Segment 對(duì)應(yīng)一個(gè)物理文件,Kafka 對(duì) segment 文件追加寫,這就是順序?qū)懳募?/li>
頁(yè)緩存技術(shù)
應(yīng)當(dāng)使用本地磁盤作為存儲(chǔ)介質(zhì)。Page Cache 的存在就可以提升消息的讀取速度,
批量傳輸與壓縮消息
生產(chǎn)端有兩個(gè)重要的參數(shù):batch.size和linger.ms。這兩個(gè)參數(shù)就和 Producer 的批量發(fā)送消息有關(guān)。
網(wǎng)絡(luò)模型
- Kafka 自己實(shí)現(xiàn)了網(wǎng)絡(luò)模型做 RPC。底層基于 Java NIO,采用和 Netty 一樣的 Reactor 線程模型。
- Kafka 即基于 Reactor 模型實(shí)現(xiàn)了多路復(fù)用和處理線程池。
- Reactor 模型基于池化思想,避免為每個(gè)連接創(chuàng)建線程,連接完成后將業(yè)務(wù)處理交給線程池處理;基于 IO 復(fù)用模型,多個(gè)連接共用同一個(gè)阻塞對(duì)象,不用等待所有的連接。遍歷到有新數(shù)據(jù)可以處理時(shí),操作系統(tǒng)會(huì)通知程序,線程跳出阻塞狀態(tài),進(jìn)行業(yè)務(wù)邏輯處理
分區(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 并行度的最小單元,因此,可以說,每增加一個(gè) Paritition 就增加了一個(gè)消費(fèi)并發(fā)。
高效的文件數(shù)據(jù)結(jié)構(gòu)
- 每個(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 采用稀疏索引,這樣每個(gè) index 文件大小有限,Kafka 采用mmap的方式,直接將 index 文件映射到內(nèi)存,這樣對(duì) index 的操作就不需要操作磁盤 IO
- 分段和索引的策略:利用偏移量和時(shí)間索引文件實(shí)現(xiàn)快速消息查找