溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Kafka消息體大小設(shè)置的一些方法

發(fā)布時(shí)間:2021-06-26 09:13:04 來(lái)源:億速云 閱讀:889 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Kafka消息體大小設(shè)置的一些方法”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

微信公眾號(hào)「后端進(jìn)階」,專(zhuān)注后端技術(shù)分享:Java、Golang、WEB框架、分布式中間件、服務(wù)治理等等。

還記得前幾天有個(gè)小伙伴跟我反饋發(fā)送消息時(shí)提示請(qǐng)求數(shù)據(jù)過(guò)大的異常嗎?經(jīng)過(guò)調(diào)整 max.request.size 的大小之后,又報(bào)了了如下異常

查看相關(guān)資料后,發(fā)現(xiàn) Broker 端對(duì) Producer 發(fā)送過(guò)來(lái)的消息也有一定的大小限制,這個(gè)參數(shù)叫 message.max.bytes,這個(gè)參數(shù)決定了 Broker 能夠接收到的最大消息的大小,它的默認(rèn)值為 977 KB,而 max.request.size 的值已經(jīng)設(shè)置成 2M 大小了,很顯然已經(jīng)比 message.max.bytes 大了很多,因此消息大于 997KB 時(shí),就會(huì)拋出如上異常。

值得一提的是,主題配置也有一個(gè)參數(shù),叫 max.message.bytes,它只針對(duì)某個(gè)主題生效,可動(dòng)態(tài)配置,可覆蓋全局的 message.max.bytes,好處就是可以針對(duì)不同主題去設(shè)置 Broker 接收消息的大小,而且不用重啟 Broker。

這還沒(méi)完,消費(fèi)端拉取消息數(shù)據(jù)的大小也需要更改,這個(gè)參數(shù)叫 fetch.max.bytes,這個(gè)參數(shù)決定消費(fèi)者單次從 Broker 獲取消息的最大字節(jié)數(shù),那么問(wèn)題來(lái)了,如果該參數(shù)值比 max.request.size 小,那么會(huì)導(dǎo)致消費(fèi)者很可能消費(fèi)不了比 fetch.max.bytes 大的消息。

所以綜合起來(lái),需要這么設(shè)置:

producer端:
max.request.size=5242880(5M)
broker:
message.max.bytes=6291456(6M)
consumer:
fetch.max.bytes=7340032(7M)

max.request.size < message.max.bytes < fetch.max.bytes

另外補(bǔ)充一點(diǎn),還記得之前說(shuō)過(guò)的 batch.size 參數(shù)的作用嗎,從源碼可看出,Producer 每次發(fā)送的消息封裝成 ProducerRecord,然后利用消息累加器 RecordAccumulator 添加到 ProducerBatch 中,由于每次創(chuàng)建 ProducerBatch 都需要分配一個(gè) batch.size 大小的內(nèi)存空間,頻繁創(chuàng)建和關(guān)閉會(huì)導(dǎo)致性能極大開(kāi)銷(xiāo),所以 RecordAccumulator 內(nèi)部有個(gè) BufferPool,它實(shí)現(xiàn)了緩存的復(fù)用,只不過(guò)只針對(duì) batch.size 大小的 BufferByte 進(jìn)行復(fù)用,如果大于 batch.size 的 ProducerBatch,它并不會(huì)加入 BufferPool 中,也就不會(huì)復(fù)用。

之前有個(gè)疑問(wèn)就是:假如 max.request.size 大于 batch.size,那么該條消息會(huì)不會(huì)分多個(gè) batch 發(fā)送到 broker?

答案顯然是不會(huì),根據(jù)上述所說(shuō),如果一個(gè) ProducerRecord 就已經(jīng)超出了 batch.size 的大小,那么 ProducerBatch 僅包含一個(gè) ProducerRecord,并且該 ProducerBatch 并不會(huì)加入到 BufferPool 中。

所以,在 Kafka Producer 調(diào)優(yōu)過(guò)程中,根據(jù)業(yè)務(wù)需求,需要特別注意 batch.size 與 max.request.size 之間的大小值的設(shè)定,避免內(nèi)存空間頻繁地創(chuàng)建和關(guān)閉。

“Kafka消息體大小設(shè)置的一些方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI