分享一波Kafka面试题答案
之前已經(jīng)分享了好幾篇關(guān)于 Kafka 的文章,從基本概念和使用到高可用機(jī)制解析到最佳實(shí)踐。今天分享幾個(gè)?Kafka?的面試題,這些面試題是大數(shù)據(jù)工程師在面試中經(jīng)常問到的一些問題,在此整理一下,分享給大家。
如果你是 Java 開發(fā)工程師,也可以看看這份面試題目:假如我是面試官,我會這樣虐你
1 什么是kafka
Kafka是分布式發(fā)布-訂閱消息系統(tǒng),它最初是由LinkedIn公司開發(fā)的,之后成為Apache項(xiàng)目的一部分,Kafka是一個(gè)分布式,可劃分的,冗余備份的持久性的日志服務(wù),它主要用于處理流式數(shù)據(jù)。
2 為什么要使用 kafka,為什么要使用消息隊(duì)列
緩沖和削峰:上游數(shù)據(jù)時(shí)有突發(fā)流量,下游可能扛不住,或者下游沒有足夠多的機(jī)器來保證冗余,kafka在中間可以起到一個(gè)緩沖的作用,把消息暫存在kafka中,下游服務(wù)就可以按照自己的節(jié)奏進(jìn)行慢慢處理。
解耦和擴(kuò)展性:項(xiàng)目開始的時(shí)候,并不能確定具體需求。消息隊(duì)列可以作為一個(gè)接口層,解耦重要的業(yè)務(wù)流程。只需要遵守約定,針對數(shù)據(jù)編程即可獲取擴(kuò)展能力。
冗余:可以采用一對多的方式,一個(gè)生產(chǎn)者發(fā)布消息,可以被多個(gè)訂閱topic的服務(wù)消費(fèi)到,供多個(gè)毫無關(guān)聯(lián)的業(yè)務(wù)使用。
健壯性:消息隊(duì)列可以堆積請求,所以消費(fèi)端業(yè)務(wù)即使短時(shí)間死掉,也不會影響主要業(yè)務(wù)的正常進(jìn)行。
異步通信:很多時(shí)候,用戶不想也不需要立即處理消息。消息隊(duì)列提供了異步處理機(jī)制,允許用戶把一個(gè)消息放入隊(duì)列,但并不立即處理它。想向隊(duì)列中放入多少消息就放多少,然后在需要的時(shí)候再去處理它們。
3 kafka中的broker 是干什么的
broker 是消息的代理,Producers往Brokers里面的指定Topic中寫消息,Consumers從Brokers里面拉取指定Topic的消息,然后進(jìn)行業(yè)務(wù)處理,broker在中間起到一個(gè)代理保存消息的中轉(zhuǎn)站。
4 kafka中的 zookeeper 起到什么作用,可以不用zookeeper么
zookeeper 是一個(gè)分布式的協(xié)調(diào)組件,早期版本的kafka用zk做meta信息存儲,consumer的消費(fèi)狀態(tài),group的管理以及 offset的值。考慮到zk本身的一些因素以及整個(gè)架構(gòu)較大概率存在單點(diǎn)問題,新版本中逐漸弱化了zookeeper的作用。新的consumer使用了kafka內(nèi)部的group coordination協(xié)議,也減少了對zookeeper的依賴,
但是broker依然依賴于ZK,zookeeper 在kafka中還用來選舉controller 和 檢測broker是否存活等等。
5 kafka follower如何與leader同步數(shù)據(jù)
Kafka的復(fù)制機(jī)制既不是完全的同步復(fù)制,也不是單純的異步復(fù)制。完全同步復(fù)制要求All Alive Follower都復(fù)制完,這條消息才會被認(rèn)為commit,這種復(fù)制方式極大的影響了吞吐率。而異步復(fù)制方式下,Follower異步的從Leader復(fù)制數(shù)據(jù),數(shù)據(jù)只要被Leader寫入log就被認(rèn)為已經(jīng)commit,這種情況下,如果leader掛掉,會丟失數(shù)據(jù),kafka使用ISR的方式很好的均衡了確保數(shù)據(jù)不丟失以及吞吐率。Follower可以批量的從Leader復(fù)制數(shù)據(jù),而且Leader充分利用磁盤順序讀以及send file(zero copy)機(jī)制,這樣極大的提高復(fù)制性能,內(nèi)部批量寫磁盤,大幅減少了Follower與Leader的消息量差。
6??什么情況下一個(gè) broker 會從 isr中踢出去
leader會維護(hù)一個(gè)與其基本保持同步的Replica列表,該列表稱為ISR(in-sync Replica),每個(gè)Partition都會有一個(gè)ISR,而且是由leader動(dòng)態(tài)維護(hù) ,如果一個(gè)follower比一個(gè)leader落后太多,或者超過一定時(shí)間未發(fā)起數(shù)據(jù)復(fù)制請求,則leader將其重ISR中移除 ,詳細(xì)參考?kafka的高可用機(jī)制
7 kafka 為什么那么快
-
Cache?Filesystem Cache PageCache緩存
-
順序?qū)?由于現(xiàn)代的操作系統(tǒng)提供了預(yù)讀和寫技術(shù),磁盤的順序?qū)懘蠖鄶?shù)情況下比隨機(jī)寫內(nèi)存還要快。
-
Zero-copy?零拷?技術(shù)減少拷貝次數(shù)
-
Batching of Messages?批量量處理。合并小的請求,然后以流的方式進(jìn)行交互,直頂網(wǎng)絡(luò)上限。
-
Pull 拉模式?使用拉模式進(jìn)行消息的獲取消費(fèi),與消費(fèi)端處理能力相符。
8??kafka producer如何優(yōu)化打入速度
-
增加線程
-
提高 batch.size
-
增加更多 producer 實(shí)例
-
增加 partition 數(shù)
-
設(shè)置 acks=-1 時(shí),如果延遲增大:可以增大 num.replica.fetchers(follower 同步數(shù)據(jù)的線程數(shù))來調(diào)解;
-
跨數(shù)據(jù)中心的傳輸:增加 socket 緩沖區(qū)設(shè)置以及 OS tcp 緩沖區(qū)設(shè)置。
優(yōu)化方面的參考?kafka最佳實(shí)踐
9 ?kafka producer 打數(shù)據(jù),ack ?為 0, 1, -1 的時(shí)候代表啥, 設(shè)置 -1 的時(shí)候,什么情況下,leader 會認(rèn)為一條消息 commit了
1(默認(rèn))??數(shù)據(jù)發(fā)送到Kafka后,經(jīng)過leader成功接收消息的的確認(rèn),就算是發(fā)送成功了。在這種情況下,如果leader宕機(jī)了,則會丟失數(shù)據(jù)。
0?生產(chǎn)者將數(shù)據(jù)發(fā)送出去就不管了,不去等待任何返回。這種情況下數(shù)據(jù)傳輸效率最高,但是數(shù)據(jù)可靠性確是最低的。
-1?producer需要等待ISR中的所有follower都確認(rèn)接收到數(shù)據(jù)后才算一次發(fā)送完成,可靠性最高。
當(dāng)ISR中所有Replica都向Leader發(fā)送ACK時(shí),leader才commit,這時(shí)候producer才能認(rèn)為一個(gè)請求中的消息都commit了。
10 ?kafka ?unclean 配置代表啥,會對 spark streaming 消費(fèi)有什么影響
unclean.leader.election.enable 為true的話,意味著非ISR集合的broker 也可以參與選舉,這樣有可能就會丟數(shù)據(jù),spark streaming在消費(fèi)過程中拿到的 end offset 會突然變小,導(dǎo)致 spark streaming job掛掉。如果unclean.leader.election.enable參數(shù)設(shè)置為true,就有可能發(fā)生數(shù)據(jù)丟失和數(shù)據(jù)不一致的情況,Kafka的可靠性就會降低;而如果unclean.leader.election.enable參數(shù)設(shè)置為false,Kafka的可用性就會降低。
11 如果leader crash時(shí),ISR為空怎么辦
kafka在Broker端提供了一個(gè)配置參數(shù):unclean.leader.election,這個(gè)參數(shù)有兩個(gè)值:
true(默認(rèn)):允許不同步副本成為leader,由于不同步副本的消息較為滯后,此時(shí)成為leader,可能會出現(xiàn)消息不一致的情況。
false:不允許不同步副本成為leader,此時(shí)如果發(fā)生ISR列表為空,會一直等待舊leader恢復(fù),降低了可用性。
12? kafka的message格式是什么樣的
一個(gè)Kafka的Message由一個(gè)固定長度的header和一個(gè)變長的消息體body組成
header部分由一個(gè)字節(jié)的magic(文件格式)和四個(gè)字節(jié)的CRC32(用于判斷body消息體是否正常)構(gòu)成。
當(dāng)magic的值為1的時(shí)候,會在magic和crc32之間多一個(gè)字節(jié)的數(shù)據(jù):attributes(保存一些相關(guān)屬性,
比如是否壓縮、壓縮格式等等);如果magic的值為0,那么不存在attributes屬性
body是由N個(gè)字節(jié)構(gòu)成的一個(gè)消息體,包含了具體的key/value消息
13? kafka中consumer group 是什么概念
同樣是邏輯上的概念,是Kafka實(shí)現(xiàn)單播和廣播兩種消息模型的手段。同一個(gè)topic的數(shù)據(jù),會廣播給不同的group;同一個(gè)group中的worker,只有一個(gè)worker能拿到這個(gè)數(shù)據(jù)。換句話說,對于同一個(gè)topic,每個(gè)group都可以拿到同樣的所有數(shù)據(jù),但是數(shù)據(jù)進(jìn)入group后只能被其中的一個(gè)worker消費(fèi)。group內(nèi)的worker可以使用多線程或多進(jìn)程來實(shí)現(xiàn),也可以將進(jìn)程分散在多臺機(jī)器上,worker的數(shù)量通常不超過partition的數(shù)量,且二者最好保持整數(shù)倍關(guān)系,因?yàn)镵afka在設(shè)計(jì)時(shí)假定了一個(gè)partition只能被一個(gè)worker消費(fèi)(同一group內(nèi))。
總結(jié)
以上是生活随笔為你收集整理的分享一波Kafka面试题答案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试|图解kafka的高可用机制
- 下一篇: 统治软件开发中的著名定律