Kafka客戶端報錯MESSAGE_TOO_LARGE

其實我有點猶豫要不要寫這個文章币绩,因為筆者的kafka客戶端版本并不是最新的喝噪,不知道新版本是否會有這個問題。

版本提示

kafka server版本

Scala 2.11 - kafka_2.11-2.0.0.tgz

kafka client版本

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
    <version>2.1.7.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>1.1.1</version>
</dependency>

問題現(xiàn)象

筆者在優(yōu)化公司kafka producer性能時發(fā)現(xiàn)一個很奇怪的現(xiàn)象灼芭,當 1000tps 從外部輸入消息給kafka producer的時候,即每秒1000個record癣猾,但實際上會發(fā)現(xiàn)kafka.producer:type=producer-metrics mbean的record-send-rate會達到14000到15000r/s,record-error-rate會達到1000r/s榨了。因為配置了batch.size為5MB和linger.ms為5秒煎谍,所以消息是會緩沖一段時間發(fā)送出去的,但是不至于能長時間持續(xù)積攢出每秒1萬多的記錄龙屉,這樣大的發(fā)送速度發(fā)下去呐粘,也沒消息能積攢下來啊。

我發(fā)現(xiàn)kafka客戶端的日志沒有打印转捕,于是配置了org.apache.kafka.clients logger, 日志級別設置為TRACE作岖。

我在日志中發(fā)現(xiàn)了下面的報錯,關鍵詞是MESSAGE_TOO_LARGE五芝。

2020-05-14 21:29:58.624 [kafka-producer-network-thread | producer-1] WARN (org.apache.kafka.clients.producer.internals.Sender:509) completeBatch - [Producer clientId=producer-1] Got error produce response in correlation id 226233 on topic-partition span-1, splitting and retrying (3 attempts left). Error: MESSAGE_TOO_LARGE

后續(xù)還試過batch.size設置為1MB痘儡,也是一樣的現(xiàn)象,憑空多出很多消息的感覺枢步。

首次確定報錯含義

搜索這個報錯沉删,是kafka broker側(cè)有個配置message.max.bytes,默認為1MB醉途,如果發(fā)送的消息體積大于這個矾瑰,就會報錯。
《kafka權(quán)威指南》說這個是限制單條record消息體積大小的隘擎。

image.png

官方文檔 也是這么說的

image.png

The request included a message larger than the max message size the server will accept.

這些都指向request里面某個record超過了kafka broker側(cè)message.max.bytes配置殴穴。

當服務端返回MESSAGE_TOO_LARGE報錯后,客戶端將消息拆分成更小的批次進行重新發(fā)送,所以會憑空產(chǎn)生很多消息的錯覺采幌。沒去探究拆分邏輯劲够,是怎么從1000r/s拆到15000r/s的也是奇怪,最好合理設置參數(shù)避免這種場景休傍。

image.png

確定kafka broker側(cè)message.max.bytes配置大小

開始我想通過kafka自帶的kafka-config.sh征绎,卻發(fā)現(xiàn)在我這個版本,這個腳本帶的命令不會反饋所有配置尊残,只會返回你動態(tài)修改過的那些炒瘸。
kafka-manager界面點擊topic的配置淤堵,也只會顯示空

通過搜索上面這個問題寝衫,我發(fā)現(xiàn)了 Getting broker configuration via kafka-configs.sh

Yes this is a known behavior: https://issues.apache.org/jira/browse/KAFKA-7720

Currently this tool only shows configurations that have been dynamically overridden.

To see all broker configs, you have 2 options:

Use the AdminClient.describeConfigs() API
Tweak the ConfigCommand.scala tool. Just remove the filter on https://github.com/apache/kafka/blob/ad26914de65e2db244fbe36a2a5fd03de87dfb79/core/src/main/scala/kafka/admin/ConfigCommand.scala#L347
Update: This issue is being addressed by KIP-524 which is currently targetted for Kafka 2.5

后面我到server.log去grep

我在server.log里發(fā)現(xiàn)了這個配置的大小kafka實際生效的message.max.bytes值是1000012字節(jié),0.95左右拐邪,小于1MB慰毅。

bash-4.4# cat server.log.*|grep message.max.bytes
        message.max.bytes = 1000012
        message.max.bytes = 1000012
        message.max.bytes = 1000012
        message.max.bytes = 1000012
        message.max.bytes = 1000012
        message.max.bytes = 1000012

topic層的配置沒有進行覆蓋,所以參數(shù)值確定為1000012字節(jié)

疑問

但實際上我這次壓測采用的消息體積是固定的扎阶,kafka producer metrics的record-size-avg是2.7KB汹胃,record-size-max是9.6KB,遠遠小于1000012字節(jié)东臀。
為什么這樣還會被拒絕呢着饥。

調(diào)整batch.size重新測試

我將batch.size調(diào)整到512KB, max.request.size調(diào)整到2MB,重新壓測,這次日志里不再刷MESSAGE_TOO_LARGE報錯了惰赋。
record-send-rate恢復到1000r/s每秒宰掉,record-error-rate為0.問題消除
這里我已經(jīng)感覺message.max.bytes可能限制的不是單條消息的大小,而是限制的batch.size的大小赁濒。

去kafka源碼探究message.max.bytes

https://github.com/apache/kafka/blob/847ff8f/core/src/main/scala/kafka/log/Log.scala#L1377

  // Check if the message sizes are valid.
  val batchSize = batch.sizeInBytes
  if (batchSize > config.maxMessageSize) {
    brokerTopicStats.topicStats(topicPartition.topic).bytesRejectedRate.mark(records.sizeInBytes)
    brokerTopicStats.allTopicsStats.bytesRejectedRate.mark(records.sizeInBytes)
    throw new RecordTooLargeException(s"The record batch size in the append to $topicPartition is $batchSize bytes " +
      s"which exceeds the maximum configured value of ${config.maxMessageSize}.")
  }

image.png

不知道我這段看的對不對轨奄,不過確實非常可能是message.max.bytes是限制的batch.size的大小拒炎。

總結(jié)

batch.size最好比服務端實際生效的message.max.bytes配置小一些挪拟,否則在筆者所在的版本會遇到MESSAGE_TOO_LARGE報錯,客戶端進行重試發(fā)送造成很大的消息發(fā)送量击你。這個重試是可以避免發(fā)生的玉组。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市丁侄,隨后出現(xiàn)的幾起案子惯雳,更是在濱河造成了極大的恐慌,老刑警劉巖绒障,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吨凑,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機鸵钝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進店門糙臼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人恩商,你說我怎么就攤上這事变逃。” “怎么了怠堪?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵揽乱,是天一觀的道長。 經(jīng)常有香客問我粟矿,道長凰棉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任陌粹,我火速辦了婚禮撒犀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘掏秩。我一直安慰自己或舞,他們只是感情好,可當我...
    茶點故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布蒙幻。 她就那樣靜靜地躺著映凳,像睡著了一般。 火紅的嫁衣襯著肌膚如雪邮破。 梳的紋絲不亂的頭發(fā)上诈豌,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機與錄音决乎,去河邊找鬼队询。 笑死,一個胖子當著我的面吹牛构诚,可吹牛的內(nèi)容都是我干的蚌斩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼范嘱,長吁一口氣:“原來是場噩夢啊……” “哼送膳!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起丑蛤,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤叠聋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后受裹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碌补,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡虏束,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了厦章。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镇匀。...
    茶點故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖袜啃,靈堂內(nèi)的尸體忽然破棺而出汗侵,到底是詐尸還是另有隱情,我是刑警寧澤群发,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布晰韵,位于F島的核電站,受9級特大地震影響熟妓,放射性物質(zhì)發(fā)生泄漏雪猪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一滑蚯、第九天 我趴在偏房一處隱蔽的房頂上張望浪蹂。 院中可真熱鬧抵栈,春花似錦告材、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至产艾,卻和暖如春疤剑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背闷堡。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工隘膘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人杠览。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓弯菊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親踱阿。 傳聞我的和親對象是個殘疾皇子管钳,可洞房花燭夜當晚...
    茶點故事閱讀 44,689評論 2 354