在項(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是感知不到的。