核心鏈路,不能讓所有請(qǐng)求平等搶資源)
上線配置要保護(hù)核心鏈路不能讓所有請(qǐng)求平等搶資源資源緊張時(shí)如果所有請(qǐng)求共享同一批 worker、隊(duì)列和連接最重要的用戶操作往往也會(huì)一起變慢。把連接池調(diào)大或多開幾個(gè) worker只能暫時(shí)推高上限不能回答一個(gè)更根本的問題資源不夠時(shí)系統(tǒng)準(zhǔn)備保留什么又允許放棄什么。以判題服務(wù)為例提交代碼和查詢判定結(jié)果通常屬于核心路徑生成詳細(xì)解釋、批量統(tǒng)計(jì)、緩存預(yù)熱等能力則可能延遲或暫停。優(yōu)先級(jí)策略的價(jià)值在于把這種業(yè)務(wù)判斷落實(shí)到隊(duì)列、并發(fā)、超時(shí)和反饋上而不是寫一段口號(hào)放在故障預(yù)案里。先把能力分成可執(zhí)行的等級(jí)優(yōu)先級(jí)不宜太細(xì)。先列出必須在壓力下繼續(xù)服務(wù)的路徑、可以等待的路徑和可以臨時(shí)關(guān)閉的路徑并寫清每一種失敗時(shí)用戶會(huì)得到什么反饋。低優(yōu)先級(jí)任務(wù)進(jìn)入獨(dú)立隊(duì)列或有獨(dú)立并發(fā)上限時(shí)即使它們積壓也不會(huì)立刻吃掉核心路徑全部工作者。隊(duì)列滿了不能悄悄丟任務(wù)。不同任務(wù)可選擇拒絕并提示稍后再試、持久化后延遲執(zhí)行、合并重復(fù)任務(wù)或交給后臺(tái)處理。具體策略取決于任務(wù)是否可重試、是否有副作用、用戶是否需要及時(shí)看到結(jié)果。關(guān)鍵是狀態(tài)明確調(diào)用方知道任務(wù)沒有被無(wú)聲吞掉。不要把所有請(qǐng)求都標(biāo)成高優(yōu)先級(jí)。標(biāo)簽一旦失去區(qū)分能力系統(tǒng)又會(huì)回到無(wú)序競(jìng)爭(zhēng)。優(yōu)先級(jí)需要由真正的用戶影響和業(yè)務(wù)時(shí)限決定而不是由每個(gè)功能負(fù)責(zé)人自行申請(qǐng)。配置要可審查也要能快速收緊優(yōu)先級(jí)、隊(duì)列容量、并發(fā)預(yù)算和降級(jí)開關(guān)應(yīng)由版本化配置管理。配置至少應(yīng)有默認(rèn)值、負(fù)責(zé)人、變更說明和上一版本的回退方式。業(yè)務(wù)節(jié)奏變化時(shí)可以調(diào)整策略而不必修改和發(fā)布一段臨時(shí)代碼故障時(shí)也能快速關(guān)閉非核心能力。配置的修改仍需要評(píng)審。把某項(xiàng)任務(wù)升為高優(yōu)先級(jí)意味著它會(huì)與其他核心任務(wù)爭(zhēng)資源不是一次無(wú)成本的標(biāo)簽變更。對(duì)于敏感操作可要求變更同時(shí)說明受影響的隊(duì)列、預(yù)期負(fù)載和恢復(fù)條件。開關(guān)的語(yǔ)義要單一。例如“停止生成解釋”只影響解釋生成不應(yīng)同時(shí)關(guān)閉提交記錄或結(jié)果查詢。開關(guān)越模糊故障期間越容易誤傷核心功能。上線前就要確認(rèn)開關(guān)在配置中心、服務(wù)緩存和各副本間的生效時(shí)間不能等事故發(fā)生后才發(fā)現(xiàn)有的實(shí)例還在跑舊策略。防止低優(yōu)先級(jí)占住關(guān)鍵資源簡(jiǎn)單的優(yōu)先級(jí)隊(duì)列不一定足夠。低優(yōu)先級(jí)任務(wù)可能先拿到數(shù)據(jù)庫(kù)連接、文件句柄、沙箱配額或共享鎖然后讓高優(yōu)先級(jí)任務(wù)在資源前等待這就是常見的優(yōu)先級(jí)反轉(zhuǎn)。排查時(shí)不要只看隊(duì)列順序還要看關(guān)鍵共享資源由誰(shuí)持有、持續(xù)多久。對(duì)最關(guān)鍵的資源可以設(shè)置預(yù)留額度或按類別隔離。比如核心判題保留一部分 worker 與沙箱容量后臺(tái)統(tǒng)計(jì)只能使用其余容量或者低優(yōu)先級(jí)任務(wù)達(dá)到閾值后不再進(jìn)入會(huì)占用共享鎖的階段。隔離會(huì)降低平時(shí)的資源利用率但在高峰或故障時(shí)能換來更可預(yù)測(cè)的服務(wù)。等待也需要上限。低優(yōu)先級(jí)任務(wù)無(wú)限積壓會(huì)占用內(nèi)存和調(diào)度開銷超過保留窗口后應(yīng)按任務(wù)類型取消、合并、落庫(kù)或通知調(diào)用方。清理策略必須保留審計(jì)信息避免用戶無(wú)從得知任務(wù)為何沒有完成。在壓力下驗(yàn)證策略而不是只測(cè)正常路徑測(cè)試環(huán)境可以同時(shí)發(fā)起不同等級(jí)的請(qǐng)求逐步增加負(fù)載觀察核心路徑的等待、錯(cuò)誤率和資源占用是否仍在目標(biāo)范圍內(nèi)。然后觸發(fā)低優(yōu)先級(jí)開關(guān)、模擬隊(duì)列滿和共享資源緊張確認(rèn)核心服務(wù)確實(shí)得到保護(hù)而不是只有監(jiān)控面板上的標(biāo)簽變化。還應(yīng)測(cè)試優(yōu)先級(jí)標(biāo)記錯(cuò)誤、配置回滾和副本配置不一致。錯(cuò)誤標(biāo)記不應(yīng)讓任務(wù)繞過全部限制回滾后積壓任務(wù)如何處理也需要有預(yù)期。演練結(jié)果要能說明策略的邊界而不是只證明某一輪壓測(cè)成功。降級(jí)并不承諾每個(gè)功能在任何時(shí)候都可用。它做的是一件更實(shí)際的事資源不足時(shí)優(yōu)先把有限能力留給最需要的操作。把這個(gè)判斷寫進(jìn)配置、隊(duì)列和資源管理核心鏈路才不會(huì)在高峰時(shí)被非核心工作悄悄擠掉。