www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 公眾號(hào)精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]作者:vivo互聯(lián)網(wǎng)服務(wù)器團(tuán)隊(duì)-ZhangLin一、業(yè)務(wù)背景目前移動(dòng)端的使用場(chǎng)景中會(huì)用到大量的消息推送,push消息可以幫助運(yùn)營(yíng)人員更高效地實(shí)現(xiàn)運(yùn)營(yíng)目標(biāo)(比如給用戶推送營(yíng)銷活動(dòng)或者提醒APP新功能)。對(duì)于推送系統(tǒng)來說需要具備以下兩個(gè)特性:消息秒級(jí)送到用戶,無(wú)延時(shí),支持每秒百萬(wàn)推送,單機(jī)百萬(wàn)長(zhǎng)連接。支持通知、文本、自定義消息透?jìng)鞯日宫F(xiàn)形式。正是由于以上原因,對(duì)于系統(tǒng)的開發(fā)和維護(hù)帶來了挑戰(zhàn)。下圖是推送系統(tǒng)的簡(jiǎn)單描述(API->推送模塊->手機(jī))。二、問題背景推送系統(tǒng)中長(zhǎng)連接集群在穩(wěn)定性測(cè)試、壓力測(cè)試階運(yùn)行一段時(shí)間后隨機(jī)會(huì)出現(xiàn)一個(gè)進(jìn)程掛掉的情況,概率較?。l率為一個(gè)月左右發(fā)生一次),這會(huì)影響部分客戶...

作者:vivo互聯(lián)網(wǎng)服務(wù)器團(tuán)隊(duì)-Zhang Lin

一、業(yè)務(wù)背景


目前移動(dòng)端的使用場(chǎng)景中會(huì)用到大量的消息推送,push消息可以幫助運(yùn)營(yíng)人員更高效地實(shí)現(xiàn)運(yùn)營(yíng)目標(biāo)(比如給用戶推送營(yíng)銷活動(dòng)或者提醒APP新功能)。


對(duì)于推送系統(tǒng)來說需要具備以下兩個(gè)特性:

  • 消息秒級(jí)送到用戶,無(wú)延時(shí),支持每秒百萬(wàn)推送,單機(jī)百萬(wàn)長(zhǎng)連接。

  • 支持通知、文本、自定義消息透?jìng)鞯日宫F(xiàn)形式。正是由于以上原因,對(duì)于系統(tǒng)的開發(fā)和維護(hù)帶來了挑戰(zhàn)。下圖是推送系統(tǒng)的簡(jiǎn)單描述(API->推送模塊->手機(jī))。


深入理解Netty-從偶現(xiàn)宕機(jī)看Netty流量控制


二、問題背景


推送系統(tǒng)中長(zhǎng)連接集群在穩(wěn)定性測(cè)試、壓力測(cè)試階運(yùn)行一段時(shí)間后隨機(jī)會(huì)出現(xiàn)一個(gè)進(jìn)程掛掉的情況,概率較?。l率為一個(gè)月左右發(fā)生一次),這會(huì)影響部分客戶端消息送到的時(shí)效。


推送系統(tǒng)中的長(zhǎng)連接節(jié)點(diǎn)(Broker系統(tǒng))是基于Netty開發(fā),此節(jié)點(diǎn)維護(hù)了服務(wù)端和手機(jī)終端的長(zhǎng)連接,線上問題出現(xiàn)后,添加Netty內(nèi)存泄露監(jiān)控參數(shù)進(jìn)行問題排查,觀察多天但并未排查出問題。


于長(zhǎng)連接節(jié)點(diǎn)是Netty開發(fā),為便于讀者理解,下面簡(jiǎn)單介紹一下Netty。


三、?Netty介紹


Netty是一個(gè)高性能、異步事件驅(qū)動(dòng)的NIO框架,基于Java NIO提供的API實(shí)現(xiàn)。它提供了對(duì)TCP、UDP和文件傳輸?shù)闹С郑鳛楫?dāng)前最流行的NIO框架,Netty在互聯(lián)網(wǎng)領(lǐng)域、大數(shù)據(jù)分布式計(jì)算領(lǐng)域、游戲行業(yè)、通信行業(yè)等獲得了廣泛的應(yīng)用,HBase,Hadoop,Bees,Dubbo等開源組件也基于Netty的NIO框架構(gòu)建。


四、問題分析


4.1 猜想


最初猜想是長(zhǎng)連接數(shù)導(dǎo)致的,但經(jīng)過排查日志、分析代碼,發(fā)現(xiàn)并不是此原因造成。


長(zhǎng)連接數(shù):39萬(wàn),如下圖:


深入理解Netty-從偶現(xiàn)宕機(jī)看Netty流量控制


每個(gè)channel字節(jié)大小1456, 按40萬(wàn)長(zhǎng)連接計(jì)算,不致于產(chǎn)生內(nèi)存過大現(xiàn)象。


4.2 查看GC日志


查看GC日志,發(fā)現(xiàn)進(jìn)程掛掉之前頻繁full GC(頻率5分鐘一次),但內(nèi)存并未降低,懷疑堆外內(nèi)存泄露。


4.3 分析heap內(nèi)存情況


ChannelOutboundBuffer對(duì)象占將近5G內(nèi)存,泄露原因基本可以確定:ChannelOutboundBuffer的entry數(shù)過多導(dǎo)致,查看ChannelOutboundBuffer的源碼可以分析出,是ChannelOutboundBuffer中的數(shù)據(jù)。


沒有寫出去,導(dǎo)致一直積壓;

ChannelOutboundBuffer內(nèi)部是一個(gè)鏈表結(jié)構(gòu)。


深入理解Netty-從偶現(xiàn)宕機(jī)看Netty流量控制


4.4 從上圖分析數(shù)據(jù)未寫出去,為什么會(huì)出現(xiàn)這種情況?


代碼中實(shí)際有判斷連接是否可用的情況(Channel.isActive),并且會(huì)對(duì)超時(shí)的連接進(jìn)行關(guān)閉。從歷史經(jīng)驗(yàn)來看,這種情況發(fā)生在連接半打開(客戶端異常關(guān)閉)的情況比較多---雙方不進(jìn)行數(shù)據(jù)通信無(wú)問題。


按上述猜想,測(cè)試環(huán)境進(jìn)行重現(xiàn)和測(cè)試。

1)模擬客戶端集群,并與長(zhǎng)連接服務(wù)器建立連接,設(shè)置客戶端節(jié)點(diǎn)的防火墻,模擬服務(wù)器與客戶端網(wǎng)絡(luò)異常的場(chǎng)景(即要模擬Channel.isActive調(diào)用成功,但數(shù)據(jù)實(shí)際發(fā)送不出去的情況)。


2)調(diào)小堆外內(nèi)存,持續(xù)發(fā)送測(cè)試消息給之前的客戶端。消息大小(1K左右)。


3)按照128M內(nèi)存來計(jì)算,實(shí)際上調(diào)用9W多次就會(huì)出現(xiàn)。


深入理解Netty-從偶現(xiàn)宕機(jī)看Netty流量控制


五、問題解決


5.1 啟用autoRead機(jī)制


當(dāng)channel不可寫時(shí),關(guān)閉autoRead;

public void channelReadComplete(ChannelHandlerContext ctx) throws Exception { if (!ctx.channel().isWritable()) { Channel channel = ctx.channel(); ChannelInfo channelInfo = ChannelManager.CHANNEL_CHANNELINFO.get(channel); String clientId = ""; if (channelInfo != null) { clientId = channelInfo.getClientId(); }
LOGGER.info("channel is unwritable, turn off autoread, clientId:{}", clientId); channel.config().setAutoRead(false); }}

當(dāng)數(shù)據(jù)可寫時(shí)開啟autoRead;

@Overridepublic void channelWritabilityChanged(ChannelHandlerContext ctx) throws Exception{ Channel channel = ctx.channel(); ChannelInfo channelInfo = ChannelManager.CHANNEL_CHANNELINFO.get(channel); String clientId = ""; if (channelInfo != null) { clientId = channelInfo.getClientId(); } if (channel.isWritable()) { LOGGER.info("channel is writable again, turn on autoread, clientId:{}", clientId); channel.config().setAutoRead(true); }}

說明:

深入理解Netty-從偶現(xiàn)宕機(jī)看Netty流量控制


autoRead的作用是更精確的速率控制,如果打開的時(shí)候Netty就會(huì)幫我們注冊(cè)讀事件。當(dāng)注冊(cè)了讀事件后,如果網(wǎng)絡(luò)可讀,則Netty就會(huì)從channel讀取數(shù)據(jù)。那如果autoread關(guān)掉后,則Netty會(huì)不注冊(cè)讀事件。


這樣即使是對(duì)端發(fā)送數(shù)據(jù)過來了也不會(huì)觸發(fā)讀事件,從而也不會(huì)從channel讀取到數(shù)據(jù)。當(dāng)recv_buffer滿時(shí),也就不會(huì)再接收數(shù)據(jù)。


5.2 設(shè)置高低水位

serverBootstrap.option(ChannelOption.WRITE_BUFFER_WATER_MARK, new WriteBufferWaterMark(1024 * 1024, 8 * 1024 * 1024));
注:高低水位配合后面的isWritable使用

5.3 增加channel.isWritable()的判斷


channel是否可用除了校驗(yàn)channel.isActive()還需要加上channel.isWrite()的判斷,isActive只是保證連接是否激活,而是否可寫由isWrite來決定。

private void writeBackMessage(ChannelHandlerContext ctx, MqttMessage message) { Channel channel = ctx.channel(); //增加channel.isWritable()的判斷 if (channel.isActive()
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉