應(yīng)對接口級故障:服務(wù)降級婴程、熔斷廓奕、限流、排隊(duì)

  • 接口級故障:系統(tǒng)沒有宕機(jī)档叔、網(wǎng)絡(luò)沒有中斷桌粉,但是業(yè)務(wù)卻出現(xiàn)了問題:業(yè)務(wù)響應(yīng)慢、大量訪問超時(shí)衙四、大量訪問異常铃肯。
    • 本質(zhì):系統(tǒng)負(fù)載過高,導(dǎo)致無法快速處理業(yè)務(wù)传蹈。比如押逼,如果系統(tǒng)中存在慢查詢,當(dāng)負(fù)載過高時(shí)惦界,慢查詢會(huì)將數(shù)據(jù)庫資源耗盡挑格,導(dǎo)致讀寫操作超時(shí),業(yè)務(wù)讀寫很容易出現(xiàn)超時(shí)現(xiàn)象沾歪。即使沒有慢查詢當(dāng)負(fù)載過高時(shí)也會(huì)出現(xiàn)超時(shí)情況漂彤。
    • 產(chǎn)生原因的內(nèi)部條件:程序bug導(dǎo)致死循環(huán)、存在慢查詢灾搏、程序邏輯不對導(dǎo)致耗盡內(nèi)存
    • 外部條件:黑客攻擊显歧、促銷、第三方系統(tǒng)響應(yīng)緩慢

解決思路

  • 解決接口級故障的核心思想是優(yōu)先保障核心業(yè)務(wù)和優(yōu)先保障絕大部分用戶确镊。比如登錄功能很重要士骤,當(dāng)訪問量過高時(shí),停掉注冊功能蕾域,為登錄騰出資源拷肌。

解決策略

降級

系統(tǒng)將某些不重要的業(yè)務(wù)或接口的功能降低,可以只提供部分功能旨巷,也可以完全停到所有所有不重要的功能巨缘。降級的思想是丟車保帥。

  • 常見降級方式
    • 系統(tǒng)后門降級:系統(tǒng)預(yù)留后門用于降級采呐,比如提供一個(gè)降級URL若锁,訪問URL時(shí)就執(zhí)行降級指令。缺點(diǎn):如果服務(wù)器數(shù)量多斧吐,需要一臺一臺去操作又固,效率低仲器。
    • 獨(dú)立系統(tǒng)降級:將降級操作獨(dú)立到一個(gè)單獨(dú)的系統(tǒng)中,可以實(shí)現(xiàn)復(fù)雜的權(quán)限管理仰冠、批量操作等功能乏冀。


      獨(dú)立降級系統(tǒng)

熔斷

降級是應(yīng)對系統(tǒng)自身的故障,而熔斷的目的是應(yīng)對外部系統(tǒng)的故障洋只。比如A服務(wù)的X功能依賴B服務(wù)的某個(gè)接口辆沦,當(dāng)B服務(wù)接口響應(yīng)很慢時(shí),A服務(wù)X功能的響應(yīng)也會(huì)被拖慢识虚,進(jìn)一步導(dǎo)致了A服務(wù)的線程都卡在了X功能上肢扯,A服務(wù)的其它功能也會(huì)卡主或拖慢。此時(shí)就需要熔斷機(jī)制担锤,即A服務(wù)不在請求B這個(gè)接口蔚晨,A服務(wù)內(nèi)部發(fā)現(xiàn)B接口就直接返回錯(cuò)誤,從而避免整個(gè)A服務(wù)被拖慢妻献。

  • 實(shí)現(xiàn)思路:需要系統(tǒng)有一個(gè)統(tǒng)一的API調(diào)用層,由API來進(jìn)行采樣或者統(tǒng)計(jì)团赁。

限流

限流:只允許系統(tǒng)能夠承受的訪問量進(jìn)來育拨,超出的會(huì)被丟棄。

  • 降級從系統(tǒng)功能優(yōu)先級角度考慮如何應(yīng)對故障欢摄,而限流則從用戶訪問壓力的角度來考慮如何應(yīng)對故障熬丧。

  • 常見限流方式

    • 基于請求限流:指從外部請求的角度考慮限流。常見的方式有:

      • 限制總量:限制某個(gè)指標(biāo)的累積上限怀挠。比如直播間的用戶總數(shù)上限為100萬析蝴,超過后用戶無法進(jìn)入。搶購商品數(shù)量為100绿淋,限制搶購用戶上限為1萬個(gè)闷畸,超過或直接拒絕。
      • 限制時(shí)間量:限制一段時(shí)間內(nèi)某個(gè)指標(biāo)的上限吞滞。例如:一分鐘內(nèi)只允許1000個(gè)用戶訪問佑菩。每秒請求峰值為10萬。
      • 都需要找到合適的閥值:需要通過性能壓測來確定閥值或者逐步優(yōu)化裁赠。
    • 基于資源限流:指從系統(tǒng)內(nèi)部考慮殿漠,找到影響性能的關(guān)鍵資源,對其使用上限限制佩捞。常見的內(nèi)部資源有:連接數(shù)绞幌、文件句柄、線程數(shù)一忱、請求隊(duì)列莲蜘、CPU利用率等谭确。例如,使用Netty實(shí)現(xiàn)服務(wù)器菇夸,每個(gè)請求先放到請求隊(duì)列中琼富,業(yè)務(wù)線程從請求隊(duì)列中獲取任務(wù)進(jìn)行處理,請求隊(duì)列大小為1000庄新,那么超過該值則直接拒絕鞠眉。

排隊(duì)

排隊(duì)方式來應(yīng)對接口級故障的方式是:讓用戶等待一段時(shí)間,而不是像限流方式直接拒絕用戶择诈。從體驗(yàn)上來講械蹋,雖然用戶沒有很快得到拒絕響應(yīng),但是如果等待時(shí)間過長羞芍,體驗(yàn)也不是很好哗戈。(但是對于一些請求,等待比直接拒絕要好荷科,比如支付請求唯咬,排隊(duì)總比直接拒絕好,因?yàn)橹苯泳芙^用戶就有可能不買了)

  • 實(shí)現(xiàn)方式:排隊(duì)需要保存未被處理的請求畏浆,所以排隊(duì)需要緩存大量數(shù)據(jù)胆胰,一般單個(gè)系統(tǒng)無法緩存這么多數(shù)據(jù),所有需要單獨(dú)的排隊(duì)系統(tǒng)去實(shí)現(xiàn)刻获。例如使用Kafka蜀涨、RocketMQ等消息隊(duì)列來緩存用戶的請求。
1號店雙11秒殺排隊(duì)系統(tǒng)

實(shí)現(xiàn)思路:藍(lán)色區(qū)域是排隊(duì)系統(tǒng)

【排隊(duì)模塊】
負(fù)責(zé)將用戶的請求以FIFO的方式存入隊(duì)列中蝎毡,不同商品的秒殺請求放在不同的隊(duì)列中厚柳,隊(duì)列大小可以根據(jù)秒殺商品數(shù)量自行定義。
【調(diào)度模塊】
負(fù)責(zé)動(dòng)態(tài)調(diào)度排隊(duì)模塊中的請求到服務(wù)模塊中沐兵。動(dòng)態(tài)性體現(xiàn)在:會(huì)根據(jù)服務(wù)模塊的當(dāng)前處理能力控制拉取請求速度别垮,如果服務(wù)模塊的處理能力有空閑就提升拉取請求速度,否則降慢速度扎谎。
【服務(wù)模塊】
負(fù)責(zé)調(diào)用真正的業(yè)務(wù)來處理請求宰闰,并獲取返回結(jié)果,再調(diào)用排隊(duì)模塊的接口寫回業(yè)務(wù)處理結(jié)果簿透。

案例

如果你來設(shè)計(jì)一個(gè)整點(diǎn)限量秒殺系統(tǒng)移袍,包括登錄、搶購老充、支付(依賴支付寶)等核心功能葡盗,你會(huì)如何設(shè)計(jì)接口級的故障應(yīng)對手段?

  • 思路:
    丟車保帥:在秒殺時(shí),通過服務(wù)降級把注冊觅够、修改個(gè)人信息等非核心功能關(guān)閉掉胶背。(是否為核心此時(shí)的判斷標(biāo)準(zhǔn)為:秒殺時(shí)間段這些功能影響人數(shù)少)
    熔斷:支付依賴第三方服務(wù),要設(shè)置熔斷策略喘先,熔斷后要給出友好提示钳吟,比如10分鐘后再來支付。
    排隊(duì)+限流:搶購下單接口采用排隊(duì)+限流方式窘拯,如搶購1000件商品红且,則設(shè)置2000大小的隊(duì)列,請求超過2000后直接拒絕掉涤姊,前2000請求加入隊(duì)列中暇番,然后可以開啟多線程對隊(duì)列進(jìn)行處理。

內(nèi)容參考:《從0開始學(xué)架構(gòu)》
微服務(wù)接口限流的設(shè)計(jì)與思考(附GitHub框架源碼)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末思喊,一起剝皮案震驚了整個(gè)濱河市壁酬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恨课,老刑警劉巖舆乔,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剂公,居然都是意外死亡希俩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門诬留,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斜纪,“玉大人贫母,你說我怎么就攤上這事文兑。” “怎么了腺劣?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵绿贞,是天一觀的道長。 經(jīng)常有香客問我橘原,道長籍铁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任趾断,我火速辦了婚禮拒名,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘芋酌。我一直安慰自己增显,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布脐帝。 她就那樣靜靜地躺著同云,像睡著了一般糖权。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上炸站,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天星澳,我揣著相機(jī)與錄音,去河邊找鬼旱易。 笑死禁偎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咒唆。 我是一名探鬼主播届垫,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼全释!你這毒婦竟也來了装处?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤浸船,失蹤者是張志新(化名)和其女友劉穎妄迁,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體李命,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡登淘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了封字。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黔州。...
    茶點(diǎn)故事閱讀 40,675評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阔籽,靈堂內(nèi)的尸體忽然破棺而出流妻,到底是詐尸還是另有隱情,我是刑警寧澤笆制,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布绅这,位于F島的核電站,受9級特大地震影響在辆,放射性物質(zhì)發(fā)生泄漏证薇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一匆篓、第九天 我趴在偏房一處隱蔽的房頂上張望浑度。 院中可真熱鬧,春花似錦鸦概、人聲如沸箩张。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伏钠。三九已至横漏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間熟掂,已是汗流浹背缎浇。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赴肚,地道東北人素跺。 一個(gè)月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像誉券,于是被迫代替她去往敵國和親指厌。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評論 2 360

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