一 芯砸、 kafka是什么聪姿?
kafka是一個(gè)基于發(fā)布-訂閱模式的MQ碴萧,可以用來解耦、削封末购、異步等功能破喻。
二、kafka的架構(gòu)是怎樣的盟榴?
broker:kafka服務(wù)器
message是k-v結(jié)構(gòu)曹质,根據(jù)topic分為不同的類型
consumer訂閱并接收topic,producer發(fā)布topic
通過zookeeper管理broker與consumer的動(dòng)態(tài)加入與離開擎场。
一個(gè)topic分成多個(gè)partition (提高并發(fā)性)羽德,每個(gè)partition是一個(gè)有序隊(duì)列,根據(jù)負(fù)載均衡將消息發(fā)布到不同的partition中迅办。
partition都有自己的replication宅静,這些relication在不同的機(jī)器上。這些relication需要選取leader負(fù)責(zé)讀寫站欺,并由zooKeeper負(fù)責(zé)fail over姨夹。
每個(gè)partition對(duì)應(yīng)一個(gè)邏輯log,有多個(gè)segment組成矾策,每個(gè)segment中存儲(chǔ)多條message
Consumer1有兩個(gè)offset分別對(duì)應(yīng)Partition0磷账、Partition1;Consumer2有一個(gè)offset對(duì)應(yīng)Partition2贾虽。這個(gè)offset是由客戶端SDK負(fù)責(zé)保存的逃糟,Kafka的Broker完全無視這個(gè)東西的存在;一般情況下SDK會(huì)把它保存到zookeeper里面蓬豁。(所以需要給Consumer提供zookeeper的地址)绰咽。
三、kafka為什么這么快地粪?
- 磁盤順序IO
- 消費(fèi)者讀取消息Zero-Copy:只需要兩次拷貝
- 批量處理:合并小的請(qǐng)求剃诅,減少IO次數(shù)
- 順序?qū)懭胂⑹褂脙?nèi)存映射文件(Memory Mapped Files),不是直接寫到硬盤里驶忌。 Kafka提供了一個(gè)參數(shù)——producer.type來控制是不是主動(dòng)flush矛辕,如果Kafka寫入到mmap之后就立即flush然后再返回Producer叫 同步 (sync);寫入mmap之后立即返回Producer不調(diào)用flush叫 異步 (async)
總結(jié):Kafka速度的秘訣在于付魔,它把所有的消息都變成一個(gè)的文件聊品。通過mmap提高I/O速度,寫入數(shù)據(jù)的時(shí)候它是末尾添加所以速度最優(yōu)几苍;讀取數(shù)據(jù)的時(shí)候配合sendfile直接暴力輸出
上面提到的一些技術(shù)在Java中都有相應(yīng)的API
Java NIO翻屈,它給我提供了一個(gè)MappedByteBuffer類可以用來實(shí)現(xiàn)內(nèi)存映射
Java的NIO提供了FileChannel,它的transferTo妻坝、transferFrom方法就是Zero Copy伸眶。
四惊窖、kafka怎樣保證高可用?
ISR(In-Sync Replicas):增加副本
ISR是對(duì)partition而言的厘贼,其中一個(gè)replica為leader界酒,其他都為followers.
leader處理partition的所有讀寫請(qǐng)求,其他的都是備份嘴秸。與此同時(shí)毁欣,follower會(huì)被動(dòng)定期地去復(fù)制leader上的數(shù)據(jù)。如果一個(gè)flower比一個(gè)leader落后太多岳掐,或者超過一定時(shí)間未發(fā)起數(shù)據(jù)復(fù)制請(qǐng)求凭疮,則leader將其重ISR中移除。
ISR的管理要依賴zk串述,如果Leader失效执解,選舉也要zk完成。
五纲酗、producer向broker發(fā)送消息衰腌,怎樣保證可靠性?
通過確認(rèn)參數(shù)request.required.acks設(shè)置可靠性的等級(jí)
1:只要接到Leader的確認(rèn)耕姊,就算是發(fā)送成功了桶唐。如果Leader
0:只要發(fā)出去就不管了栅葡,這樣的吞吐量最大茉兰,但可靠性最差。
-1:需要等待所有的followers接到消息后欣簇,才算發(fā)送成功规脸,可靠性最高,吞吐量最小熊咽。
默認(rèn)是1
六莫鸭、 當(dāng)consumer上線或者下線的時(shí)候,會(huì)發(fā)生什么横殴?
需要重新確定partition和consumer的關(guān)系被因,這就是rebalance,會(huì)帶來超時(shí)衫仑、抖動(dòng)等問題梨与。
七、怎樣保證消息的有序性文狱?