一、原因
kafka作為消息隊(duì)列,其中數(shù)據(jù)積壓也是經(jīng)常遇到的問(wèn)題之一。
我們都知道,數(shù)據(jù)積壓的直接原因,一定是系統(tǒng)中的某個(gè)部分出現(xiàn)了性能問(wèn)題,來(lái)不及處理上游發(fā)送的數(shù)據(jù),才會(huì)導(dǎo)致數(shù)據(jù)積壓。
那么我們就需要分析在使用kafka時(shí),如何通過(guò)優(yōu)化代碼以及參數(shù)配置來(lái)最大程度的避免數(shù)據(jù)積壓來(lái)對(duì)業(yè)務(wù)中的影響。
二、解決方案
1.1、通過(guò)優(yōu)化代碼
數(shù)據(jù)積壓可能是我們?cè)诰帉懘a處理邏輯的時(shí)候,代碼質(zhì)量不高,處理速度慢導(dǎo)致消費(fèi)數(shù)據(jù)的性能低,可以優(yōu)化代碼。
1.2、優(yōu)化kafka配置參數(shù)
1.2.1、優(yōu)化生產(chǎn)者producer的參數(shù)
首先我們?cè)谏厦娣治龅贸?,是由于上游生產(chǎn)者producer發(fā)送數(shù)據(jù)過(guò)快,以及下游消費(fèi)者consumer拉取數(shù)據(jù)過(guò)慢,實(shí)質(zhì)上就是,生產(chǎn)者生產(chǎn)數(shù)據(jù)速度>>消費(fèi)者消費(fèi)數(shù)據(jù)速度。那么就可以把問(wèn)題定位到生產(chǎn)者producer以及消費(fèi)者consumer這兩方面上。
可以通過(guò)修改以下參數(shù)配置提提升生產(chǎn)者的吞吐量:
1)batch.memory修改緩沖區(qū)大小
設(shè)置發(fā)送消息的緩沖區(qū),默認(rèn)值是33554432,就是32MB
如果發(fā)送消息出去的速度小于寫入消息進(jìn)去的速度,就會(huì)導(dǎo)致緩沖區(qū)寫滿,此時(shí)生產(chǎn)消息就會(huì)阻塞住,所以說(shuō)這里就應(yīng)該多做一些壓測(cè),盡可能保證說(shuō)這塊緩沖區(qū)不會(huì)被寫滿導(dǎo)致生產(chǎn)行為被阻塞住。
2)compression.type壓縮格式
默認(rèn)是none,不壓縮,但是也可以使用lz4壓縮,效率還是不錯(cuò)的,壓縮之后可以減小數(shù)據(jù)量,提升吞吐量,但是會(huì)加大producer端的cpu開(kāi)銷。
3)batch.size批次大小
設(shè)置merge batch合并批次消息的大小
如果 batch 批次太小,會(huì)導(dǎo)致頻繁網(wǎng)絡(luò)請(qǐng)求,吞吐量下降;
如果batch批次太大,會(huì)導(dǎo)致一條消息需要等待很久才能被發(fā)送出去,而且會(huì)讓內(nèi)存緩沖區(qū)有很大壓力,過(guò)多數(shù)據(jù)緩沖在內(nèi)存里。
默認(rèn)值是:16384,就是16kb,也就是一個(gè)batch批次滿了16kb就發(fā)送出去,一般在實(shí)際生產(chǎn)環(huán)境,這個(gè)batch批次的值可以增大一些來(lái)提升吞吐量,可以自己壓測(cè)一下。
4)linger.ms等待時(shí)長(zhǎng)
這個(gè)值默認(rèn)是0,意思就是消息必須立即被發(fā)送,但是這是不對(duì)的。
一般設(shè)置一個(gè)100毫秒之類的,這樣的話就是說(shuō),這個(gè)消息被發(fā)送出去后進(jìn)入一個(gè)batch批次,如果100毫秒內(nèi),這個(gè)batch批次滿了16kb,自然就會(huì)發(fā)送出去。
但是如果100毫秒內(nèi),batch沒(méi)滿,那么也必須把消息發(fā)送出去了,不能讓消息的發(fā)送延遲時(shí)間太長(zhǎng),也避免給內(nèi)存造成過(guò)大的一個(gè)壓力。
1.2.2、優(yōu)化消費(fèi)者cousumer文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-652636.html
擴(kuò)容,擴(kuò)分區(qū);增加consumer文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-652636.html
1)提升消費(fèi)者組中的消費(fèi)者數(shù)以及Topic中的分區(qū)數(shù),讓二者相等,假設(shè)設(shè)置為3個(gè)分區(qū) = 3CPU。
什么是分區(qū)?
分區(qū)就是一個(gè)topic的數(shù)據(jù)被分成多少份的單元,比如一個(gè)topic的數(shù)據(jù)被分成3份,那么就是3個(gè)分區(qū),一個(gè)分區(qū)對(duì)應(yīng)一份的數(shù)據(jù)。而每個(gè)分區(qū)中的寫入的數(shù)據(jù)是有順序的,分區(qū)之間數(shù)據(jù)是無(wú)序。
2)提高消費(fèi)者拉取數(shù)據(jù)的能力,比如Flume每次拉取的數(shù)據(jù)可以由1000條改為3000條、Spark中將限流的參數(shù)增大、Flink中保證數(shù)據(jù)的處理效率等。
到了這里,關(guān)于kafka千萬(wàn)級(jí)數(shù)據(jù)積壓原因以及解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!