5.3 可靠性設(shè)計(jì)

分布式服務(wù)框架可能會(huì)運(yùn)行在非常惡劣的網(wǎng)絡(luò)環(huán)境中葵蒂,網(wǎng)絡(luò)超時(shí)担敌、閃斷郭宝、對(duì)方進(jìn)程僵死或者處理緩慢等情況都有可能發(fā)生辞槐。為了保證在這些極端異常場(chǎng)景下服務(wù)仍能夠正常調(diào)用或者自動(dòng)恢復(fù),需要底層的協(xié)議棧支持HA粘室。

5.3.1 客戶端連接超時(shí)

在傳統(tǒng)的同步阻塞編程模式下榄檬,客戶端Socket發(fā)起網(wǎng)絡(luò)連接,往往需要指定連接超時(shí)時(shí)間衔统,這樣做的目的主要有兩個(gè):

  • 在同步阻塞I/O模型中鹿榜,連接操作是同步阻塞的海雪,如果不設(shè)置超時(shí)時(shí)間,客戶端I/O線程可能會(huì)被長(zhǎng)時(shí)間阻塞舱殿,這會(huì)導(dǎo)致系統(tǒng)可用I/O線程數(shù)的減少奥裸。
  • 業(yè)務(wù)層需要:大多數(shù)系統(tǒng)都會(huì)對(duì)業(yè)務(wù)流程執(zhí)行時(shí)間有限制,例如web交互類的響應(yīng)時(shí)間要小于3s沪袭〈滩剩客戶端設(shè)置連接超時(shí)時(shí)間是為了實(shí)現(xiàn)業(yè)務(wù)層的超時(shí)。

對(duì)NIO的SocketChannel枝恋,在非阻塞模式下创倔,它會(huì)直接返回連接結(jié)果,如果沒有連接成功焚碌,也沒有發(fā)生IO異常畦攘,則需要將SocketChannel注冊(cè)到Selector上監(jiān)聽連接結(jié)果。所有十电,異步連接的超時(shí)無法在API層面直接設(shè)置知押,而是需要通過用戶自定義定時(shí)器來主動(dòng)監(jiān)測(cè)。

5.3.2 客戶端重連機(jī)制

客戶端通過鏈路關(guān)閉監(jiān)聽器監(jiān)聽鏈路狀態(tài)鹃骂,如果鏈路中斷台盯,等待INTERVAL時(shí)間后,由客戶端發(fā)起重連操作畏线,如果重連失敗静盅,間隔周期INTERVAL后再次發(fā)起重連,知道重連成功寝殴。
為了保證服務(wù)端能夠有充足的時(shí)間釋放句柄資源蒿叠,在首次斷連時(shí),客戶端需要等待INTERVAL時(shí)間之后再次發(fā)起重連蚣常,而不是失敗后立即重連市咽。
為了保證句柄資源能夠及時(shí)釋放,無論什么場(chǎng)景下的重連失敗抵蚊,客戶端都必須保證自身的資源被及時(shí)釋放施绎,包括但不限于SocketChannel、Socket等贞绳。
重連失敗后谷醉,需要打印異常堆棧信息,方便后續(xù)的問題定位熔酷。為了防止服務(wù)端正常下線長(zhǎng)期不再上線孤紧,客戶端通常會(huì)對(duì)重連次數(shù)做限制,防止無限重連下午無謂的損耗資源拒秘。

5.3.3 客戶端重復(fù)握手保護(hù)

當(dāng)客戶端握手成功之后号显,在鏈路處于正常狀態(tài)下臭猜,不允許客戶端重復(fù)握手,以防止客戶端在異常狀態(tài)下反復(fù)重連導(dǎo)致句柄資源被耗盡押蚤。
服務(wù)端接收到客戶端的握手請(qǐng)求消息之后蔑歌,首先對(duì)IP地址進(jìn)行合法性檢驗(yàn),如果校驗(yàn)成功揽碘,在緩存的地址表中查看客戶端是否已經(jīng)登錄次屠,如果已經(jīng)登錄,則拒絕重復(fù)登錄雳刺,返回錯(cuò)誤碼-1劫灶,同時(shí)關(guān)閉TCP鏈路,并在服務(wù)端的日志中打印握手失敗的原因掖桦。
客戶端接收到握手失敗的應(yīng)答消息之后本昏,關(guān)閉客戶端的TCP連接,等待INTERVAL時(shí)間之后枪汪,再次發(fā)起TCP連接涌穆,直到認(rèn)證成功。
為了防止由服務(wù)端和客戶端對(duì)鏈路狀態(tài)理解不一致導(dǎo)致的客戶端無法握手成功的問題雀久,當(dāng)服務(wù)端連續(xù)N次心跳超時(shí)之后需要主動(dòng)關(guān)閉鏈路宿稀,清空該客戶端的地址緩存信息,以保證后續(xù)該客戶端可以重連成功赖捌,防止被重復(fù)登錄保護(hù)機(jī)制拒絕掉祝沸。

5.3.4 消息緩存重發(fā)

無論客戶端還是服務(wù)端,當(dāng)發(fā)生鏈路中斷之后巡蘸,在鏈路恢復(fù)之前奋隶,緩存在消息隊(duì)列中待發(fā)送的消息不能丟失,等鏈路恢復(fù)之后悦荒,重新發(fā)送這些消息,保證鏈路中斷期間消息不丟失嘹吨。
考慮到內(nèi)存溢出的風(fēng)險(xiǎn)搬味,建議消息緩存隊(duì)列設(shè)置上限,當(dāng)達(dá)到上限之后蟀拷,應(yīng)該拒絕繼續(xù)想該隊(duì)列添加新的消息碰纬。

5.3.5 心跳機(jī)制

在凌晨等業(yè)務(wù)低谷期時(shí)段,如果發(fā)生網(wǎng)絡(luò)閃斷问芬、連接被Hang住等網(wǎng)絡(luò)問題時(shí)悦析,由于沒有業(yè)務(wù)消息,應(yīng)用進(jìn)程很難發(fā)現(xiàn)此衅。到了白天業(yè)務(wù)高峰期時(shí)强戴,會(huì)發(fā)生大量的網(wǎng)絡(luò)通信失敗亭螟,嚴(yán)重的回導(dǎo)致一段時(shí)間進(jìn)程內(nèi)無法處理業(yè)務(wù)消息。為了解決這個(gè)問題骑歹,在網(wǎng)絡(luò)空閑時(shí)采用心跳機(jī)制來檢測(cè)鏈路的互通性预烙,一旦發(fā)生網(wǎng)絡(luò)故障,立即關(guān)閉鏈路道媚,主動(dòng)重連扁掸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市最域,隨后出現(xiàn)的幾起案子谴分,更是在濱河造成了極大的恐慌,老刑警劉巖镀脂,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狸剃,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡狗热,警方通過查閱死者的電腦和手機(jī)钞馁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匿刮,“玉大人僧凰,你說我怎么就攤上這事∈焱瑁” “怎么了训措?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)光羞。 經(jīng)常有香客問我绩鸣,道長(zhǎng),這世上最難降的妖魔是什么纱兑? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任呀闻,我火速辦了婚禮,結(jié)果婚禮上潜慎,老公的妹妹穿的比我還像新娘捡多。我一直安慰自己,他們只是感情好铐炫,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布垒手。 她就那樣靜靜地躺著,像睡著了一般倒信。 火紅的嫁衣襯著肌膚如雪科贬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天鳖悠,我揣著相機(jī)與錄音榜掌,去河邊找鬼优妙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛唐责,可吹牛的內(nèi)容都是我干的鳞溉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼鼠哥,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼熟菲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起朴恳,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤抄罕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后于颖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呆贿,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年森渐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了做入。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡同衣,死狀恐怖竟块,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耐齐,我是刑警寧澤浪秘,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站埠况,受9級(jí)特大地震影響耸携,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辕翰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一夺衍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧金蜀,春花似錦刷后、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)丧裁。三九已至护桦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間煎娇,已是汗流浹背二庵。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工贪染, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人催享。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓杭隙,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親因妙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子痰憎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)攀涵,斷路器铣耘,智...
    卡卡羅2017閱讀 134,628評(píng)論 18 139
  • 1.這篇文章不是本人原創(chuàng)的,只是個(gè)人為了對(duì)這部分知識(shí)做一個(gè)整理和系統(tǒng)的輸出而編輯成的以故,在此鄭重地向本文所引用文章的...
    SOMCENT閱讀 13,049評(píng)論 6 174
  • 一蜗细、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,333評(píng)論 6 152
  • 1、TCP狀態(tài)linux查看tcp的狀態(tài)命令:1)怒详、netstat -nat 查看TCP各個(gè)狀態(tài)的數(shù)量2)炉媒、lso...
    北辰青閱讀 9,410評(píng)論 0 11
  • 個(gè)人認(rèn)為,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記昆烁,這雖然只是...
    貳零壹柒_fc10閱讀 5,051評(píng)論 0 8