Kafka的特性
- 能夠保證消息的可靠性投遞:
- 持久化:producer生產(chǎn)的消息會(huì)在broker中進(jìn)行持久化到硬盤的操作播演,consumer從broker中拉取消息
- 多副本+容災(zāi):producer生產(chǎn)的消息發(fā)送到leader broker之后冀瓦,會(huì)有follower進(jìn)行復(fù)制操作;當(dāng)leader發(fā)生故障時(shí)可以進(jìn)行故障轉(zhuǎn)移写烤,保證消息的正常消費(fèi)
- 高并發(fā):
- 可以同時(shí)支持多個(gè)consumer并行消費(fèi)
- 將topic進(jìn)行分區(qū)翼闽,在每個(gè)consumerGroup中的consumer可以消費(fèi)1個(gè)或者多個(gè)分區(qū),consumer之間是并行操作的
- 高吞吐量:
- 消息批量操作:將多條消息整合為一個(gè)消息集進(jìn)行寫入洲炊,可以節(jié)省IO
- 消息壓縮:可以通過配置compression.tye設(shè)置消息的壓縮類型感局,比如gzip —— producer在生產(chǎn)消息時(shí)會(huì)進(jìn)行壓縮后再寫入broker中,并且在消息中附帶壓縮方式暂衡;consumer在消費(fèi)消息時(shí)根據(jù)對(duì)應(yīng)的壓縮方式進(jìn)行解壓后處理询微;
- 順序?qū)懕P:kafka寫入文件的方式為append-only,即只順序地在文件后追加內(nèi)容狂巢。這樣的好處是不需要進(jìn)行磁盤尋道和磁臂旋轉(zhuǎn)撑毛,可以直接進(jìn)行數(shù)據(jù)寫入;順序?qū)懭氲膱?zhí)行效率可以達(dá)到400M/s唧领,而隨機(jī)寫入在幾兆的級(jí)別藻雌。
- 采用零拷貝減少了內(nèi)核空間與用戶空間之間的數(shù)據(jù)拷貝操作。
零拷貝
為什么需要拷貝
因?yàn)槭菢I(yè)務(wù)代碼將read文件的數(shù)據(jù)和write網(wǎng)卡的數(shù)據(jù)關(guān)聯(lián)起來斩个,數(shù)據(jù)需要放到用戶空間來胯杭,所以需要從內(nèi)核態(tài)-用戶態(tài)-內(nèi)核態(tài)的拷貝
Kafka消費(fèi)消息
優(yōu)化思路
不需要將數(shù)據(jù)拷貝到用戶空間中來,直接在內(nèi)核空間中完成數(shù)據(jù)轉(zhuǎn)發(fā)
producer發(fā)送消息
- broker通過MMAP系統(tǒng)調(diào)用將消息寫入文件受啥;
- MMAP映射的空間對(duì)于內(nèi)核空間和用戶空間都可見所以不用拷貝做个;
3.寫入后等待操作系統(tǒng)異步地將內(nèi)存中的臟頁回寫到磁盤上 ( 可以通過配置producer.type=sync,即每次寫入內(nèi)存都執(zhí)行msync系統(tǒng)調(diào)用滚局,將MMAP的數(shù)據(jù)刷盤)
consumer拉取消息
- broker從文件中讀取并且通過網(wǎng)絡(luò)發(fā)送——sendfile系統(tǒng)調(diào)用
- broker從文件中讀取的buffer數(shù)據(jù)居暖,直接作為參數(shù)給到socket.send (file.read())函數(shù),直接從內(nèi)核空間完成數(shù)據(jù)從文件到socket buffer的轉(zhuǎn)發(fā)