kafka常見面試題

2021-10-14 15:43:53 字數 3105 閱讀 5449

1、為什麼要使用 kafka,為什麼要使用訊息佇列

緩衝和削峰 解耦和擴充套件性 冗餘 健壯性 非同步通訊

2、kafka的acks引數對訊息持久化的影響

往kafka寫資料的時候,就可以來設定這個acks引數。然後這個引數實際上有三種常見的值可以設定,分別是:0、1 和 all(等價於-1)。

api對應producerconfig.acks_config

第一種選擇是把acks引數設定為0,意思就是我的kafkaproducer在客戶端,只要把訊息傳送出去,不管那條資料有沒有在哪怕partition leader上落到磁碟,我就不管他了,直接就認為這個訊息傳送成功了。

如果你採用這種設定的話,那麼你必須注意的一點是,可能你傳送出去的訊息還在半路。結果呢,partition leader所在broker就直接掛了,然後結果你的客戶端還認為訊息傳送成功了,此時就會導致這條訊息就丟失了。

第二種選擇是設定 acks = 1,意思就是說只要partition leader接收到訊息而且寫入本地磁碟了,就認為成功了,不管他其他的follower有沒有同步過去這條訊息了。

這種設定其實是kafka預設的設定,大家請注意,劃重點!這是預設的設定

也就是說,預設情況下,你要是不管acks這個引數,只要partition leader寫成功就算成功。

但是這裡有乙個問題,萬一partition leader剛剛接收到訊息,follower還沒來得及同步過去,結果leader所在的broker宕機了,此時也會導致這條訊息丟失,因為人家客戶端已經認為傳送成功了。

最後一種情況,就是設定acks=all,這個意思就是說,partition leader接收到訊息之後,還必須要求isr列表裡跟leader保持同步的那些follower都要把訊息同步過去,才能認為這條訊息是寫入成功了。

如果說partition leader剛接收到了訊息,但是結果follower沒有收到訊息,此時leader宕機了,那麼客戶端會感知到這個訊息沒傳送成功,他會重試再次傳送訊息過去。

此時可能partition 2的follower變成leader了,此時isr列表裡只有最新的這個follower轉變成的leader了,那麼只要這個新的leader接收訊息就算成功了。

3、kafka冪等性

解決傳送訊息重複的問題

4、kafka的分割槽與消費者關係

分割槽(partition)

kafka中的topic可以細分為不同的partition,乙個topic可以將訊息存放在不同的partion中。

leader和follower

每個partition可以設定乙個leader和多個follower。kafka的訊息沒有設定讀寫分離,每個訊息傳送時,都是傳送至對應的partition的leader-partition,follower-partition主要是為了備份資料而存在,當leader-partition出現故障時,資料已經完全同步的follower-partition也會切換成leader-partition。

ar和isr

ar:分割槽中所有的副本統稱為ar。

isr:所有與leader節點保持同步的副本(包括leader節點)組成的節點,生產者首先將訊息傳送給leader副本,然後follower從leader中同步訊息。

isr是ar的子集。

資料的儲存

在partion中,乙個topic中的資料存放在不同的partion中,乙個分割槽的內容會儲存成乙個log檔案,為了防止log過大,引入了日誌分段,根據一定規則將log切分為多個logsegment,相當於乙個巨型檔案被切分成了很多不同的檔案。log和logsegment關係如下:

![在這裡插入描述](

olor_ffffff,t_70)

消費者(consumer) 分組(group)

消費者從partion中消費資料,consumer有group的概念,每個group可以消費完整的乙份topic中的資料。

消費者分割槽分配 rangeassignor 分配策略(kafka預設的分割槽策略)

kafka中,consumer消費資料時,consumer消費partition中的資料和consumer與partition的相對數量有關。

1、partition大於consumer

當partition大於consumer時,乙個consumer可能同時消費多個partition中的資料

2、partition小於consumer

當partition小於consumer時,每個consumer會去消費乙個partition中的資料。多出來的consumer則是處於空閒狀態

3、partition等於consumer

當partition的數量等於consumer時,每個consumer消費乙個partition中的資料。

除了這種分割槽分配策略之外,還有roundrobinassignor以及stickyassignor分割槽分配策略,當然,也可以自定義分割槽分配策略。

5、簡述下你在哪些場景下會選擇 kafka?

6、kafka架構的組成部分

7、kafka 分割槽的目的?

分割槽對於 kafka 集群的好處是:實現負載均衡。分割槽對於消費者來說,可以提高併發度,提高效率。

8、你知道 kafka 是如何做到訊息的有序性?

kafka 中的每個 partition 中的訊息在寫入時都是有序的,而且單獨乙個 partition 只能由乙個消費者去消費,可以在裡面保證訊息的順序性。但是分割槽之間的訊息是不保證有序的。為了保證kafka有序存入mysql,可以將分割槽設為1

9、kafka的可靠性是怎麼實現的?

參考:10、消費者在消費訊息時,消費執行緒和業務執行緒是同乙個執行緒嗎?

11、消費者在消費訊息時成功了,但是在寫入業務時失敗,怎麼避免這種問題發生?

12、kafka重平衡機制?

13、kafka如何保證消費不丟失且訊息僅僅被消費一次?

kafka常見面試題

ar 所有的分割槽副本 isr 所有與leader保持同步的副本集合 osr 被leader剔除isr的集合 當副本在一定時間未與leader進行同步就會被提出isr。leo 每個副本中最大的 offset hw 消費者能見到的最大的 offset,isr中最小的leo kafka的分割槽每次寫入訊...

常見面試題

1.get和post的區別 1 本質區別 get是向伺服器請求資料,post是向伺服器傳送資料。2 伺服器獲取值的方式 get方式提交的資料,伺服器端使用request.querystring獲取變數的值。post方式提交的資料,伺服器端使用request.form獲取資料。3 安全性 get安全效...

常見面試題

1 一行 實現1 100之和 lst i for i in range 1,101 print sum lst 2 如何在乙個函式內部修改全域性變數?在函式內部新增 global 變數名 這樣就可以在本地作用域定義全域性作用域了 name 大明 def eat name1 global name n...