kafka中的acks引數

2022-09-21 12:36:11 字數 1281 閱讀 9831

首先這個acks引數,是在kafkaproducer,也就是生產者客戶端裡設定的也就是說,你往kafka寫資料的時候,就可以來設定這個acks引數。

這個引數實際上有三種常見的值可以設定,分別是:0、1 和 all。

第一種選擇是把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接收訊息就算成功了。

acks=all 就可以代表資料一定不會丟失了嗎?

當然不是,如果你的partition只有乙個副本,也就是乙個leader,任何follower都沒有,你認為acks=all有用嗎?

當然沒用了,因為isr裡就乙個leader,他接收完訊息後宕機,也會導致資料丟失。

所以說,這個acks=all,必須跟isr列表裡至少有2個以上的副本配合使用,起碼是有乙個leader和乙個follower才可以。

這樣才能保證說寫一條資料過去,一定是2個以上的副本都收到了才算是成功,此時任何乙個副本宕機,不會導致資料丟失。

kafka的Acks和Retries 冪等性

kafka的acks和retries,保證資料的可靠性傳輸,針對生產者 acks acks 1 leader把資料寫入磁碟後,不等follower完全確認,就做出響應 如果leader宕機,會造成資料丟失 acks 0 生產者不等待任何確認,直接響應 acks all leader會等待至少乙個fo...

ACKS(確認收到)的引數配置,冪等性

acks引數配置 0 producer不等待broker的ack 是topic的每個partition傳送 這一操作提供了最低的延遲,broker一接收到還沒有寫入到磁碟就已經返回 反正就是不等待ack 當broker故障時可能會丟失資料。1 producer等待broker的ack,partiti...

Kafka架構探險(三) Kafka引數詳解

kafka提供很多的引數 broker引數 topic引數 producer引數 consumer引數等,方便我們對kafka的效能做調整,本博文就來歸納總結下常見的引數 引數的說明是基於kafka 2.12 2.3.0版本 詳細可以參考官網 broker端的引數在kafka目錄下的config s...