防止發(fā)送隊(duì)列積壓

在項(xiàng)目中,考慮的性能參數(shù)

在實(shí)際項(xiàng)目中,根據(jù)業(yè)務(wù)QPS 規(guī)劃、客戶端處理性能、網(wǎng)絡(luò)帶寬、鏈路數(shù)、消息平

均碼流大小等綜合因素計(jì)算并設(shè)置高水位( WriteBufferHigh Water Mark )值, 利用高水位

做消息發(fā)送速度的流控, 既可以保護(hù)自身,同時(shí)又能減輕服務(wù)端的壓力,防止服務(wù)端被壓

掛。

在日常監(jiān)控中, 需要將Netty 的鏈

路數(shù)、網(wǎng)絡(luò)讀寫(xiě)速度等指標(biāo)納入監(jiān)控系統(tǒng), 發(fā)現(xiàn)問(wèn)題之后需要及時(shí)告警。

https://www.infoq.cn/article/netty-reliability/?

(Netty 系列之 Netty 可靠性分析)

Netty流控小技巧

客戶端高并發(fā),服務(wù)器正常響應(yīng)

? ? 單獨(dú)的一個(gè)客戶端,但是發(fā)送頻繁,直接進(jìn)行循環(huán)發(fā)送

客戶端發(fā)送過(guò)于頻繁,直接采用循環(huán),在循環(huán)體內(nèi)沒(méi)有任何業(yè)務(wù)處理。直接進(jìn)行全負(fù)荷測(cè)試

調(diào)用Channel 的write 方法時(shí),如果發(fā)送方為業(yè)務(wù)線程, 則將發(fā)送操作封裝成WriteTask , 放到Netty 的NioEventLoop中執(zhí)行。

顯然Netty 的I/O 線程N(yùn)ioEventLoop 無(wú)法完成如此多消息的發(fā)送,因此發(fā)送任務(wù)隊(duì)列積壓,進(jìn)而導(dǎo)致內(nèi)存泄漏。

為了防止在高并發(fā)場(chǎng)景下,由于服務(wù)端處理慢導(dǎo)致客戶端消息積壓,除了服務(wù)端做流控,客戶端也需要做并發(fā)保護(hù),防止自身發(fā)生消息積壓。

利用Netty 提供的高低水位機(jī)制,可以實(shí)現(xiàn)客戶端更精準(zhǔn)的流控,

? ? Netty 的NioEventLoop 線程內(nèi)部維護(hù)了一個(gè)Queue<Runnable> taskQueue, 除了處理網(wǎng)

絡(luò)I/O 讀寫(xiě)操作,同時(shí)還負(fù)責(zé)執(zhí)行網(wǎng)絡(luò)讀寫(xiě)相關(guān)的Task ( 包含用戶自定義Task )。

? ? 積壓點(diǎn):這個(gè)Queue這個(gè)值會(huì)積壓,問(wèn)題,如何取得這個(gè)值進(jìn)行監(jiān)控?

現(xiàn)象:統(tǒng)計(jì)GC數(shù)據(jù),發(fā)現(xiàn)老生代已經(jīng)滿

客戶端高并發(fā),服務(wù)器響應(yīng)慢,客戶端發(fā)送隊(duì)列積壓 ? ?

????取得發(fā)送隊(duì)列的值。

?????ctx.channel().unsafe().outboundBuffer().nioBufferSize()


channelActive?當(dāng)Channel 處于活動(dòng)狀態(tài)時(shí)被調(diào)用;Channel 已經(jīng)連接/綁定并且已經(jīng)就緒

channelInactive?當(dāng)Channel 離開(kāi)活動(dòng)狀態(tài)并且不再連接它的遠(yuǎn)程節(jié)點(diǎn)時(shí)被調(diào)用

如果客戶端異常關(guān)閉,chanelactive是感知不到的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容