成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Kafka參數(shù)調(diào)優(yōu)實戰(zhàn),看這篇文章就夠了!【石杉的架構(gòu)筆記】

cloud / 1130人閱讀

摘要:那這條消息的延遲就是秒鐘。避免一個遲遲湊不滿,導(dǎo)致消息一直積壓在內(nèi)存里發(fā)送不出去的情況。

個人公眾號:石杉的架構(gòu)筆記(ID:shishan100)

目錄

1、背景引入:很多同學(xué)看不懂Kafka參數(shù)

2、一段Kafka生產(chǎn)端的示例代碼

3、內(nèi)存緩沖的大小

4、多少數(shù)據(jù)打包為一個Batch合適?

5、要是一個Batch遲遲無法湊滿咋辦?

6、最大請求大小

7、重試機(jī)制

8、持久化機(jī)制

1、背景引入:很多同學(xué)看不懂kafka參數(shù)

今天給大家聊一個很有意思的話題,大家知道很多公司都會基于Kafka作為MQ來開發(fā)一些復(fù)雜的大型系統(tǒng)。

而在使用Kafka的客戶端編寫代碼與服務(wù)器交互的時候,是需要對客戶端設(shè)置很多的參數(shù)的。

所以我就見過很多年輕的同學(xué),可能剛剛加入團(tuán)隊,對Kafka這個技術(shù)其實并不是很了解。

此時就會導(dǎo)致他們看團(tuán)隊里的一些資深同事寫的一些代碼,會看不懂是怎么回事,不了解背后的含義,這里面尤其是一些Kafka參數(shù)的設(shè)置

所以這篇文章,我們還是采用老規(guī)矩畫圖的形式,來聊聊Kafka生產(chǎn)端一些常見參數(shù)的設(shè)置,讓大家下次看到一些Kafka客戶端設(shè)置的參數(shù)時,不會再感到發(fā)怵。


2、一段Kafka生產(chǎn)端的示例代碼
Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092"); 
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("buffer.memory", 67108864); 
props.put("batch.size", 131072); 
props.put("linger.ms", 100); 
props.put("max.request.size", 10485760); 
props.put("acks", "1"); 
props.put("retries", 10); 
props.put("retry.backoff.ms", 500);
KafkaProducer producer = new KafkaProducer(props);


3、內(nèi)存緩沖的大小

首先我們看看“buffer.memory”這個參數(shù)是什么意思?

Kafka的客戶端發(fā)送數(shù)據(jù)到服務(wù)器,一般都是要經(jīng)過緩沖的,也就是說,你通過KafkaProducer發(fā)送出去的消息都是先進(jìn)入到客戶端本地的內(nèi)存緩沖里,然后把很多消息收集成一個一個的Batch,再發(fā)送到Broker上去的。

所以這個“buffer.memory”的本質(zhì)就是用來約束KafkaProducer能夠使用的內(nèi)存緩沖的大小的,他的默認(rèn)值是32MB。

那么既然了解了這個含義,大家想一下,在生產(chǎn)項目里,這個參數(shù)應(yīng)該怎么來設(shè)置呢?

你可以先想一下,如果這個內(nèi)存緩沖設(shè)置的過小的話,可能會導(dǎo)致一個什么問題?

首先要明確一點,那就是在內(nèi)存緩沖里大量的消息會緩沖在里面,形成一個一個的Batch,每個Batch里包含多條消息。

然后KafkaProducer有一個Sender線程會把多個Batch打包成一個Request發(fā)送到Kafka服務(wù)器上去。


那么如果要是內(nèi)存設(shè)置的太小,可能導(dǎo)致一個問題:消息快速的寫入內(nèi)存緩沖里面,但是Sender線程來不及把Request發(fā)送到Kafka服務(wù)器。

這樣是不是會造成內(nèi)存緩沖很快就被寫滿?一旦被寫滿,就會阻塞用戶線程,不讓繼續(xù)往Kafka寫消息了。

所以對于“buffer.memory”這個參數(shù)應(yīng)該結(jié)合自己的實際情況來進(jìn)行壓測,你需要測算一下在生產(chǎn)環(huán)境,你的用戶線程會以每秒多少消息的頻率來寫入內(nèi)存緩沖。

比如說每秒300條消息,那么你就需要壓測一下,假設(shè)內(nèi)存緩沖就32MB,每秒寫300條消息到內(nèi)存緩沖,是否會經(jīng)常把內(nèi)存緩沖寫滿?經(jīng)過這樣的壓測,你可以調(diào)試出來一個合理的內(nèi)存大小。

4、多少數(shù)據(jù)打包為一個Batch合適?

接著你需要思考第二個問題,就是你的“batch.size”應(yīng)該如何設(shè)置?這個東西是決定了你的每個Batch要存放多少數(shù)據(jù)就可以發(fā)送出去了。

比如說你要是給一個Batch設(shè)置成是16KB的大小,那么里面湊夠16KB的數(shù)據(jù)就可以發(fā)送了。

這個參數(shù)的默認(rèn)值是16KB,一般可以嘗試把這個參數(shù)調(diào)節(jié)大一些,然后利用自己的生產(chǎn)環(huán)境發(fā)消息的負(fù)載來測試一下。

比如說發(fā)送消息的頻率就是每秒300條,那么如果比如“batch.size”調(diào)節(jié)到了32KB,或者64KB,是否可以提升發(fā)送消息的整體吞吐量。

因為理論上來說,提升batch的大小,可以允許更多的數(shù)據(jù)緩沖在里面,那么一次Request發(fā)送出去的數(shù)據(jù)量就更多了,這樣吞吐量可能會有所提升。

但是這個東西也不能無限的大,過于大了之后,要是數(shù)據(jù)老是緩沖在Batch里遲遲不發(fā)送出去,那么豈不是你發(fā)送消息的延遲就會很高。

比如說,一條消息進(jìn)入了Batch,但是要等待5秒鐘Batch才湊滿了64KB,才能發(fā)送出去。那這條消息的延遲就是5秒鐘。

所以需要在這里按照生產(chǎn)環(huán)境的發(fā)消息的速率,調(diào)節(jié)不同的Batch大小自己測試一下最終出去的吞吐量以及消息的 延遲,設(shè)置一個最合理的參數(shù)。

5、要是一個Batch遲遲無法湊滿怎么辦?

要是一個Batch遲遲無法湊滿,此時就需要引入另外一個參數(shù)了,“l(fā)inger.ms”

他的含義就是說一個Batch被創(chuàng)建之后,最多過多久,不管這個Batch有沒有寫滿,都必須發(fā)送出去了。

給大家舉個例子,比如說batch.size是16kb,但是現(xiàn)在某個低峰時間段,發(fā)送消息很慢。

這就導(dǎo)致可能Batch被創(chuàng)建之后,陸陸續(xù)續(xù)有消息進(jìn)來,但是遲遲無法湊夠16KB,難道此時就一直等著嗎?

當(dāng)然不是,假設(shè)你現(xiàn)在設(shè)置“l(fā)inger.ms”是50ms,那么只要這個Batch從創(chuàng)建開始到現(xiàn)在已經(jīng)過了50ms了,哪怕他還沒滿16KB,也要發(fā)送他出去了。

所以“l(fā)inger.ms”決定了你的消息一旦寫入一個Batch,最多等待這么多時間,他一定會跟著Batch一起發(fā)送出去。

避免一個Batch遲遲湊不滿,導(dǎo)致消息一直積壓在內(nèi)存里發(fā)送不出去的情況。這是一個很關(guān)鍵的參數(shù)。

這個參數(shù)一般要非常慎重的來設(shè)置,要配合batch.size一起來設(shè)置。

舉個例子,首先假設(shè)你的Batch是32KB,那么你得估算一下,正常情況下,一般多久會湊夠一個Batch,比如正常來說可能20ms就會湊夠一個Batch。

那么你的linger.ms就可以設(shè)置為25ms,也就是說,正常來說,大部分的Batch在20ms內(nèi)都會湊滿,但是你的linger.ms可以保證,哪怕遇到低峰時期,20ms湊不滿一個Batch,還是會在25ms之后強(qiáng)制Batch發(fā)送出去。

如果要是你把linger.ms設(shè)置的太小了,比如說默認(rèn)就是0ms,或者你設(shè)置個5ms,那可能導(dǎo)致你的Batch雖然設(shè)置了32KB,但是經(jīng)常是還沒湊夠32KB的數(shù)據(jù),5ms之后就直接強(qiáng)制Batch發(fā)送出去,這樣也不太好其實,會導(dǎo)致你的Batch形同虛設(shè),一直湊不滿數(shù)據(jù)。


6、最大請求大小

“max.request.size”這個參數(shù)決定了每次發(fā)送給Kafka服務(wù)器請求的最大大小,同時也會限制你一條消息的最大大小也不能超過這個參數(shù)設(shè)置的值,這個其實可以根據(jù)你自己的消息的大小來靈活的調(diào)整。

給大家舉個例子,你們公司發(fā)送的消息都是那種大的報文消息,每條消息都是很多的數(shù)據(jù),一條消息可能都要20KB。

此時你的batch.size是不是就需要調(diào)節(jié)大一些?比如設(shè)置個512KB?然后你的buffer.memory是不是要給的大一些?比如設(shè)置個128MB?

只有這樣,才能讓你在大消息的場景下,還能使用Batch打包多條消息的機(jī)制。但是此時“max.request.size”是不是也得同步增加?

因為可能你的一個請求是很大的,默認(rèn)他是1MB,你是不是可以適當(dāng)調(diào)大一些,比如調(diào)節(jié)到5MB?

7、重試機(jī)制

“retries”和“retries.backoff.ms”決定了重試機(jī)制,也就是如果一個請求失敗了可以重試幾次,每次重試的間隔是多少毫秒。

這個大家適當(dāng)設(shè)置幾次重試的機(jī)會,給一定的重試間隔即可,比如給100ms的重試間隔。


8、持久化機(jī)制

“acks”參數(shù)決定了發(fā)送出去的消息要采用什么樣的持久化策略,這個涉及到了很多其他的概念,大家可以參考之前專門為“acks”寫過的一篇文章:

簡歷寫Kafka,面試官大概率會讓你講acks參數(shù)對消息持久化的影響。

END

歡迎長按下圖關(guān)注公眾號:石杉的架構(gòu)筆記!

公眾號后臺回復(fù)資料,獲取作者獨家秘制學(xué)習(xí)資料

石杉的架構(gòu)筆記,BAT架構(gòu)經(jīng)驗傾囊相授



文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/7301.html

相關(guān)文章

  • Android工程師轉(zhuǎn)型Java后端開發(fā)之路,自己選的路,跪著也要走下去!

    本文是公眾號讀者jianfeng投稿的面試經(jīng)驗恭喜該同學(xué)成功轉(zhuǎn)型目錄:毅然轉(zhuǎn)型,沒頭蒼蠅制定目標(biāo),系統(tǒng)學(xué)習(xí)面試經(jīng)歷毅然轉(zhuǎn)崗,沒頭蒼蠅首先,介紹一下我的背景。本人坐標(biāo)廣州,2016年畢業(yè)于一個普通二本大學(xué),曾經(jīng)在某機(jī)構(gòu)培訓(xùn)過Android。2018年初的時候已經(jīng)在兩家小公司工作干了兩年的android開發(fā),然后會一些Tomcat、Servlet之類的技術(shù),當(dāng)時的年薪大概也就15萬這樣子。由于個人發(fā)展...

    番茄西紅柿 評論0 收藏0
  • 【轉(zhuǎn)】成為Java頂尖程序員 ,看這10本書夠了

    摘要:實戰(zhàn)高并發(fā)程序設(shè)計這本書是目前點評推薦比較多的書,其特色是案例小,好實踐代碼有場景,實用。想要學(xué)習(xí)多線程的朋友,這本書是我大力推薦的,我的個人博客里面二十多篇的多線程博文都是基于此書,并且在這本書的基礎(chǔ)上進(jìn)行提煉和總結(jié)而寫出來的。 學(xué)習(xí)的最好途徑就是看書,這是我自己學(xué)習(xí)并且小有了一定的積累之后的第一體會。個人認(rèn)為看書有兩點好處:showImg(/img/bVr5S5);  1.能出版出...

    DTeam 評論0 收藏0
  • 阿里小哥帶你玩轉(zhuǎn)JVM:揭秘try-catch-finally在JVM底層都干了些啥?

    摘要:當(dāng)觸發(fā)異常的字節(jié)碼的索引值在某個異常表條目的監(jiān)控范圍內(nèi),虛擬機(jī)會判斷所拋出的異常和該條目想要捕獲的異常是否匹配。 作者:李瑞杰目前就職于阿里巴巴,狂熱JVM愛好者讓我們準(zhǔn)備一個函數(shù):showImg(https://user-gold-cdn.xitu.io/2019/5/19/16acbce35adfefb7);然后,反編譯他的字節(jié)碼:showImg(https://user-gold-cd...

    番茄西紅柿 評論0 收藏0
  • 阿里小哥帶你玩轉(zhuǎn)JVM:揭秘try-catch-finally在JVM底層都干了些啥?

    摘要:當(dāng)觸發(fā)異常的字節(jié)碼的索引值在某個異常表條目的監(jiān)控范圍內(nèi),虛擬機(jī)會判斷所拋出的異常和該條目想要捕獲的異常是否匹配。 作者:李瑞杰目前就職于阿里巴巴,狂熱JVM愛好者讓我們準(zhǔn)備一個函數(shù):showImg(https://user-gold-cdn.xitu.io/2019/5/19/16acbce35adfefb7);然后,反編譯他的字節(jié)碼:showImg(https://user-gold-cd...

    番茄西紅柿 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<