(3)SOFARPC連接管理與心跳剖析

問題:RPC 和多個(gè)服務(wù)端遠(yuǎn)程調(diào)用,每次都進(jìn)行 TCP 連接蚕泽,會(huì)對(duì) RPC 性能影響大晌梨。實(shí)際中桥嗤,要對(duì)連接進(jìn)行管理和保持

解決辦法:用心跳包仔蝌、斷線重連實(shí)現(xiàn)泛领,結(jié)合系統(tǒng) tcp-keepalive 機(jī)制

一敛惊、 連接管理(1. 長(zhǎng)連接和短連接? ?2. TCP 層 keep-alive? ?3. 應(yīng)用層 keep-alive? 4. 應(yīng)用層心跳還是 Keep-Alive)

二渊鞋、SOFARPC 如何實(shí)現(xiàn)

1.基于系統(tǒng) tcp-keepalive 機(jī)制實(shí)現(xiàn)

2.基于 Netty IdleStateHandler 心跳實(shí)現(xiàn)

3. SOFARPC 連接管理斷開重連實(shí)現(xiàn)

一、 連接管理

1. 長(zhǎng)連接和短連接

短連接:客戶端向務(wù)端發(fā)起連接請(qǐng)求瞧挤。連接建立后锡宋,發(fā)送數(shù)據(jù),接收返回特恬,觸發(fā)連接斷開执俩,下次重復(fù)

長(zhǎng)連接:則是在建立連接后癌刽,發(fā)送數(shù)據(jù)役首,接收數(shù)據(jù),不主動(dòng)斷開显拜,主動(dòng)通過心跳等機(jī)制來維持連接可用衡奥,下次無需重連

? ? ? ? ? ? ??場(chǎng)景:長(zhǎng)發(fā)送頻繁远荠,點(diǎn)對(duì)點(diǎn)通訊矮固。TCP握手需要時(shí)間,跨城矮台,或長(zhǎng)距離時(shí)乏屯,處理速度會(huì)降很多。

PS:網(wǎng)絡(luò)設(shè)備防火墻瘦赫,可能導(dǎo)致連接斷開需要管理長(zhǎng)連接蛤迎。

2. TCP 層 keep-alive

2.1 TCP 的 keep-alive 是什么

讓 TCP 連接“活著”确虱,或讓對(duì)方無響應(yīng)TCP 連接斷開,解決痛點(diǎn)場(chǎng)景是:

(1)兩個(gè)機(jī)器之間有防火墻替裆,防火墻自動(dòng)斷開長(zhǎng)期無活動(dòng) TCP 連接校辩。

(2)客戶端。斷電重啟辆童,卡死等等宜咒,導(dǎo)致 TCP 連接無法釋放。

導(dǎo)致:如熱數(shù)據(jù)需傳遞把鉴,連接已斷開故黑,應(yīng)用程序沒感知儿咱,在無效數(shù)據(jù)鏈路層面發(fā)送業(yè)務(wù)數(shù)據(jù),發(fā)送失敗场晶。

解決辦法:tcp-keepalive 連接無活動(dòng)一段時(shí)間混埠,發(fā)送空 ack不會(huì)被防火墻關(guān)閉诗轻。

2.2 TCP 的 keep-alive 的默認(rèn)值

tcp-keepalive钳宪,需要自行開啟,三個(gè)參數(shù)生效扳炬,決定其行為吏颖。

net.ipv4.tcp_keepalive_time = 7200? ? ?TCP 保活打開情況恨樟,發(fā)送心跳的周期侦高,默認(rèn)值為7200s(2h)

net.ipv4.tcp_keepalive_probes = 9? ? ?沒有接收到對(duì)方確認(rèn),繼續(xù)發(fā)送毖岫牛活探測(cè)包次數(shù)奉呛,默認(rèn)值為 9(次)

net.ipv4.tcp_keepalive_intvl = 75? ??沒有接收到對(duì)方確認(rèn),繼續(xù)發(fā)送焙痪。活探測(cè)包的發(fā)送頻率瞧壮,默認(rèn)值為75s。

tcp-keepalive 參數(shù)配置

2.3 如何使用

?Java 的 Netty 為例匙握,服務(wù)端和客戶端設(shè)置即可咆槽。

ChannelOption.SO_KEEPALIVE, true 即打開,bolt默認(rèn)打開圈纺。

.childOption( ChannelOption.SO_KEEPALIVE, Boolean.parseBoolean( System.getProperty (Configs.TCP_SO_KEEPALIVE,"true") ) );

Java 只能設(shè)置 SO_KEEPALIVE 秦忿;TCP_KEEPCNT,TCP_KEEPIDLE蛾娶,TCP_KEEPINTVL 等參數(shù)配置灯谣,依賴于 sysctl 配置,系統(tǒng)進(jìn)行讀取蛔琅。

2.4 檢查

`netstat -no|grep keepalive` 命令來查看當(dāng)前哪些 tcp 連接開啟了 tcp keepalive.

3. 應(yīng)用層 keep-alive

應(yīng)用層 keep-alive 方案胎许,叫心跳包,跟 tcp-keepalive 類似罗售,間隔一定時(shí)間發(fā)送心跳數(shù)據(jù)辜窑,檢測(cè)對(duì)方是否連接,屬于應(yīng)用程序協(xié)議一部分寨躁。

3.1 心跳是什么

實(shí)現(xiàn)和 tcp keep-alive一樣穆碎,為什么要有應(yīng)用層心跳?

tcp keep-alive默認(rèn)2h,系統(tǒng)級(jí)別一旦更改职恳,影響所有服務(wù)器上開啟 keep alive應(yīng)用所禀。socks proxy 讓 tcp keep-alive 失效方面, socks 協(xié)議只管轉(zhuǎn)發(fā) TCP 層具體數(shù)據(jù)包不轉(zhuǎn)發(fā)TCP 協(xié)議內(nèi)實(shí)現(xiàn)細(xì)節(jié)包(也做不到)北秽。

socks 代理葡幸,tcp keep-alive 失效,所以要自己心跳包贺氓。 socks proxy 只是一個(gè)例子蔚叨,有各種原因讓 tcp keep-alive 失效。

3.2 如何使用

基于 netty 開發(fā)的簡(jiǎn)單辙培。分析 rpc 中連接管理時(shí)候介紹蔑水。

4. 應(yīng)用層心跳還是 Keep-Alive

默認(rèn) keepalive 周期2h

4.1 系統(tǒng) keep-alive 優(yōu)勢(shì):

上層應(yīng)用只需要處理數(shù)據(jù)收發(fā)連接異常通知扬蕊;

TCP 協(xié)議層辈蟊穑活探測(cè)機(jī)制,系統(tǒng)內(nèi)核自動(dòng)替上層應(yīng)用做好尾抑;

內(nèi)核層面計(jì)時(shí)器相比上層應(yīng)用歇父,更為高效

數(shù)據(jù)包緊湊再愈;

4.2 應(yīng)用 keep-alive 優(yōu)勢(shì):

(1)關(guān)閉 TCP? keepalive榜苫,完全使用業(yè)務(wù)層心跳保活機(jī)制翎冲;

(2)應(yīng)用的心跳包更靈活垂睬,可控制檢測(cè)間隔,方式等抗悍;

(3)適用于 TCP 和 UDP 驹饺,切換 TCP 和 UDP 時(shí),上層的心跳包功能都適用缴渊;

心跳包附帶:定時(shí)在服務(wù)端和客戶端之間同步如幀數(shù)同步)赏壹;

所以大多數(shù)情況下,業(yè)務(wù)心跳 + TCP keepalive 互相補(bǔ)充疟暖。

二卡儒、SOFARPC 如何實(shí)現(xiàn)

1. SOFABOLT 基于系統(tǒng) tcp-keepalive 機(jī)制實(shí)現(xiàn)

直接打開 KeepAlive 選項(xiàng)即可

客戶端

RpcConnectionFactory 創(chuàng)建 RPC 連接,生成用戶觸發(fā)事件俐巴,init() 方法初始化 Bootstrap通過option()方法給每條連接設(shè)置 TCP屬性,ChannelOption.SO_KEEPALIVE 表示是否開啟 TCP 底層心跳機(jī)制硬爆,默認(rèn)打開 SO_KEEPALIVE 選項(xiàng)欣舵。

服務(wù)端

RpcServer 服務(wù)端啟動(dòng)類 ServerBootstrap 初始化通過 option() 方法給每條連接設(shè)置 TCP底層相關(guān)的屬性,默認(rèn)設(shè)置 ChannelOption.SO_KEEPALIVE 選項(xiàng)為 true缀磕,表示 RPC 連接開啟 TCP 底層心跳機(jī)制劣光。

2. SOFABOLT 基于 Netty IdleStateHandler 心跳實(shí)現(xiàn)

向 Netty 中注冊(cè)一個(gè)處理 Idle 事件的監(jiān)聽器注冊(cè)時(shí)傳入 idle 產(chǎn)生事件糟把,讀 還是寫 IDLE绢涡,還是都有,多久沒有讀寫則認(rèn)為是 IDLE 等遣疯。

客戶端

(1)

(1)SOFABOLT 心跳檢測(cè)客戶端默認(rèn)基于 IdleStateHandler(15000ms, 150000 ms, 0) 即 15 秒沒有讀或者寫操作雄可,注冊(cè)給 Netty

(2)調(diào)用HeartbeatHandler 的?userEventTriggered()方法觸發(fā) RpcHeartbeatTrigger 發(fā)送心跳消息

(3)RpcHeartbeatTrigger 心跳檢測(cè)判斷成功標(biāo)準(zhǔn)為是否接收到服務(wù)端回復(fù)成功響應(yīng)缠犀,如果心跳失敗次數(shù)超過最大心跳次數(shù)(默認(rèn)為 3 )則關(guān)閉連接

(2)
(3)

服務(wù)端

(1)SOFABOLT 心跳檢測(cè)服務(wù)端默認(rèn)基于?IdleStateHandler(0,0, 90000 ms) 即 90 秒沒有讀或者寫操作為空閑数苫,調(diào)用ServerIdleHandler的userEventTriggered() 方法觸發(fā)關(guān)閉連接。

(2)SOFABOLT 心跳檢測(cè)由客戶端沒有對(duì) TCP 有讀或者寫操作后觸發(fā)定時(shí)發(fā)送心跳消息辨液,服務(wù)端接收到響應(yīng)虐急。客戶端 15 秒/服務(wù)端 90 秒心跳檢測(cè)滔迈,服務(wù)端不會(huì)運(yùn)行到 90 秒仍舊沒有任何讀寫操作的止吁,只有客戶端下線拋異常時(shí)等待 90 秒過后服務(wù)端主動(dòng)關(guān)閉與客戶端連接。如果是 tcp-keepalive 需要等到 90秒之后燎悍,在此期間則為讀寫異常敬惦。

服務(wù)端一旦產(chǎn)生 IDLE,客戶端不可用间涵,直接斷連仁热。

3. SOFARPC 連接管理斷開重連實(shí)現(xiàn)

每次 RPC 調(diào)用過程都校驗(yàn)是否有可用連接不需要斷鏈與重連勾哩,沒有則新建抗蠢。一些場(chǎng)景是需要斷鏈和保持長(zhǎng)連接

自動(dòng)斷連:通過 LVS VIP 或者 F5 建立多個(gè)連接,網(wǎng)絡(luò)設(shè)備負(fù)載均衡機(jī)制思劳,可能某些連接固定映射到了某幾臺(tái)后端的 RS 上迅矛,需要自動(dòng)斷連然后重連,靠隨機(jī)性實(shí)現(xiàn)終負(fù)載均衡潜叛。需配合重連使用秽褒。

重連:客戶端發(fā)起建連后由服務(wù)端通過雙工通信發(fā)起請(qǐng)求到客戶端沒有重連無法實(shí)現(xiàn)威兜。

連接管理是客戶端邏輯销斟,啟動(dòng)好,連接管理開啟異步線程椒舵。

(1)SOFARPC 連接管理 ConnectionHolder 客戶端列表 aliveConnections(維護(hù)存活) 和 retryConnections(失敗待重試)蚂踊,RPC 啟動(dòng)守護(hù)線程以默認(rèn) 10 秒的間隔檢查存活和失敗待重試的客戶端列表的可用連接

存活列表不可用則需要放到待重試列表 retryConnections ;遍歷retryConnections?連接命中重連周期重連笔宿;重連成功放到存活列表?犁钟,多次失敗丟棄棱诱。

核心代碼在連接管理器的方法中:com.alipay.sofa.rpc.client.AllConnectConnectionHolder#doReconnect

https://mp.weixin.qq.com/s/2aZz9Slxh8XlhU5U1993uw

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市涝动,隨后出現(xiàn)的幾起案子迈勋,更是在濱河造成了極大的恐慌,老刑警劉巖醋粟,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件靡菇,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡昔穴,警方通過查閱死者的電腦和手機(jī)镰官,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吗货,“玉大人泳唠,你說我怎么就攤上這事≈姘幔” “怎么了笨腥?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)勇垛。 經(jīng)常有香客問我脖母,道長(zhǎng),這世上最難降的妖魔是什么闲孤? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任谆级,我火速辦了婚禮,結(jié)果婚禮上讼积,老公的妹妹穿的比我還像新娘肥照。我一直安慰自己,他們只是感情好勤众,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布舆绎。 她就那樣靜靜地躺著,像睡著了一般们颜。 火紅的嫁衣襯著肌膚如雪吕朵。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天窥突,我揣著相機(jī)與錄音努溃,去河邊找鬼。 笑死阻问,一個(gè)胖子當(dāng)著我的面吹牛茅坛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播则拷,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼贡蓖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了煌茬?” 一聲冷哼從身側(cè)響起斥铺,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坛善,沒想到半個(gè)月后晾蜘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡眠屎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年剔交,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片改衩。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岖常,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出葫督,到底是詐尸還是另有隱情竭鞍,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布橄镜,位于F島的核電站偎快,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏洽胶。R本人自食惡果不足惜晒夹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望姊氓。 院中可真熱鬧丐怯,春花似錦、人聲如沸他膳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)棕孙。三九已至舔亭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蟀俊,已是汗流浹背钦铺。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肢预,地道東北人矛洞。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親沼本。 傳聞我的和親對(duì)象是個(gè)殘疾皇子噩峦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1、TCP狀態(tài)linux查看tcp的狀態(tài)命令:1)抽兆、netstat -nat 查看TCP各個(gè)狀態(tài)的數(shù)量2)识补、lso...
    北辰青閱讀 9,427評(píng)論 0 11
  • 前言 本文更多地面向后端開發(fā)同學(xué)。雖然在后端開發(fā)中辫红,服務(wù)間調(diào)用已經(jīng)廣泛采用 RPC 技術(shù)凭涂。但是由于一些原因,例如像...
    編走編想閱讀 21,134評(píng)論 1 30
  • HTTP Keep-Alive 在http早期贴妻,每個(gè)http請(qǐng)求都要求打開一個(gè)tpc socket連接切油,并且使用一...
    jiangmo閱讀 4,758評(píng)論 0 2
  • 朋友和男朋友產(chǎn)生分歧澎胡,哭著給我打電話問我怎么辦,我說绢片,我是一個(gè)在世界上迷路的人滤馍,現(xiàn)在的我,連愛一個(gè)人都不會(huì)底循,我沒有...
    肆月的阿司匹林閱讀 948評(píng)論 0 0
  • 容顏易老巢株, 華發(fā)已生。 藏于青絲熙涤, 終于年華阁苞。
    南山無落梅閱讀 253評(píng)論 0 1