作者 / Manuel Correa,Arthur Gonigberg,Daniel West
譯者 / Alpha
原文鏈接/https://netflixtechblog.com/keeping-netflix-reliable-using-prioritized-load-shedding-6cc827b02f94
對(duì)世界各地的司機(jī)來(lái)說(shuō),堵車是最令人沮喪的經(jīng)歷之一。每個(gè)人都緩慢得像是在爬行一樣,有時(shí)是因?yàn)槌霈F(xiàn)了一個(gè)小問(wèn)題,有時(shí)則是毫無(wú)理由的擁堵。作為Netflix的工程師,我們一直在不斷評(píng)估如何重新設(shè)計(jì)流量管理框架。如果我們知道每個(gè)人行程的緊迫性,就可以有針對(duì)性地為他們選擇路線,而不是讓大家做無(wú)謂的等待,這么做的結(jié)果會(huì)如何呢?
在Netflix的工程設(shè)計(jì)中,我們的動(dòng)力是確保Netflix可以在您需要的時(shí)候及時(shí)出現(xiàn)。然而,就在去年,我們的系統(tǒng)還很容易受到人們所說(shuō)的的“交通擁堵”的影響;我們有開(kāi)關(guān)斷路器,但沒(méi)有循序漸進(jìn)的方式來(lái)減輕負(fù)載。為了改善會(huì)員的播放體驗(yàn),我們引入了基于優(yōu)先級(jí)的漸進(jìn)式減載法。
下面的動(dòng)畫(huà)展示了當(dāng)后端根據(jù)優(yōu)先級(jí)限制流量時(shí),觀眾體驗(yàn)到的Netflix性能。當(dāng)較低優(yōu)先級(jí)的請(qǐng)求被限制時(shí),整個(gè)播放體驗(yàn)完整流暢,觀眾可以盡情享受觀看的內(nèi)容。接下來(lái)讓我們深入研究一下我們是如何做到這一點(diǎn)的。
觸發(fā)失敗的誘因有很多,比如客戶端行為不當(dāng)引發(fā)的重試風(fēng)暴、后臺(tái)服務(wù)器規(guī)模不足、部署不當(dāng)、網(wǎng)絡(luò)故障或云提供商的問(wèn)題等等。任何上述原因都可能瞬即給系統(tǒng)造成巨大的載荷,在以前,這些例子中的每一個(gè)都會(huì)使我們的會(huì)員無(wú)法播放視頻。為了防止此類突發(fā)事件的發(fā)生,我們開(kāi)始著手實(shí)現(xiàn)以下目標(biāo),使Netflix的服務(wù)更具彈性:
- 跨設(shè)備(移動(dòng)、瀏覽器和電視)持續(xù)確定請(qǐng)求的優(yōu)先級(jí)
- 根據(jù)優(yōu)先級(jí)逐步限制請(qǐng)求
- 通過(guò)對(duì)特定優(yōu)先級(jí)的請(qǐng)求進(jìn)行紊亂測(cè)試(Chaos Testing)(有意的故障輸入)來(lái)驗(yàn)證假設(shè)
我們?cè)O(shè)想的,包含優(yōu)先級(jí)節(jié)流和紊亂測(cè)試的最終架構(gòu),如下所示。
具有優(yōu)先級(jí)節(jié)流和紊亂測(cè)試的高級(jí)播放端架構(gòu)
構(gòu)建請(qǐng)求分類
我們決定聚焦于三個(gè)維度來(lái)對(duì)請(qǐng)求流量進(jìn)行分類:吞吐量、功能性和重要性。根據(jù)這些特征,流量被分為以下幾類:
- 非關(guān)鍵型請(qǐng)求:該類型流量不影響播放或會(huì)員體驗(yàn),日志和后臺(tái)請(qǐng)求就屬于此類流量。此類請(qǐng)求通常有較高的吞吐量,是系統(tǒng)負(fù)載來(lái)源中占據(jù)比例較大的部分。
- 體驗(yàn)降級(jí)型請(qǐng)求:該類型流量影響會(huì)員體驗(yàn),但不影響播放功能。此類請(qǐng)求流量常用于以下功能:停止和暫停標(biāo)記、播放器中的語(yǔ)言選擇、觀看歷史記錄等。
- 關(guān)鍵型請(qǐng)求:流量影響播放功能。如果請(qǐng)求失敗,會(huì)員在點(diǎn)擊播放時(shí)會(huì)看到一條錯(cuò)誤消息。
API網(wǎng)關(guān)服務(wù)(Zuul)根據(jù)請(qǐng)求的屬性,將其分為非關(guān)鍵型請(qǐng)求、體驗(yàn)降級(jí)型請(qǐng)求和關(guān)鍵型請(qǐng)求,并根據(jù)每個(gè)請(qǐng)求的單獨(dú)特征,計(jì)算它們從1到100之間的優(yōu)先級(jí)分?jǐn)?shù)。計(jì)算是任務(wù)開(kāi)始的第一步,以便在其余關(guān)于請(qǐng)求的工作流程中來(lái)使用。
大多數(shù)情況下,請(qǐng)求的工作流在不考慮請(qǐng)求優(yōu)先級(jí)的情況下,也可以正常運(yùn)行。然而,就像任何服務(wù)器一樣,有時(shí)我們會(huì)遇到這樣的情況:我們的兩個(gè)后端中有一個(gè)遇到了麻煩,或者Zuul本身也遇到了麻煩。當(dāng)這種情況發(fā)生時(shí),具有更高優(yōu)先級(jí)的請(qǐng)求將得到優(yōu)先處理。優(yōu)先級(jí)較高的請(qǐng)求將得到服務(wù),而優(yōu)先級(jí)較低的請(qǐng)求不會(huì)被接待。它的執(zhí)行,類似于具有動(dòng)態(tài)優(yōu)先級(jí)閾值的優(yōu)先級(jí)隊(duì)列,允許Zuul丟棄優(yōu)先級(jí)低于當(dāng)前閾值的請(qǐng)求。
尋找最佳的流量控制點(diǎn)
在請(qǐng)求的整個(gè)生命周期中,Zuul有兩個(gè)時(shí)間點(diǎn)可以執(zhí)行負(fù)載分流:當(dāng)它將請(qǐng)求,路由到特定的后端服務(wù)器時(shí)(服務(wù)器節(jié)流),或者在初始請(qǐng)求處理時(shí),這會(huì)影響所有后端服務(wù)(全局節(jié)流)。
服務(wù)器節(jié)流
通過(guò)監(jiān)控錯(cuò)誤率和對(duì)后端服務(wù)的并發(fā)請(qǐng)求,Zuul可以感知該服務(wù)器何時(shí)出現(xiàn)問(wèn)題。這兩個(gè)指標(biāo),是故障和延遲的大致指標(biāo),當(dāng)超過(guò)這兩個(gè)指標(biāo)閾值的百分之一時(shí),我們將通過(guò)限制流量,來(lái)降低服務(wù)器負(fù)載。
全局節(jié)流
另一種情況是Zuul本身出現(xiàn)問(wèn)題。與上面情況相反,全局節(jié)流將影響Zuul后面所有后端服務(wù)器,而不是單個(gè)后端服務(wù)器,這種全局節(jié)流的影響,可能會(huì)給成員國(guó)帶來(lái)更大的問(wèn)題。用于觸發(fā)全局限制的關(guān)鍵指標(biāo),是CPU利用率、并發(fā)請(qǐng)求和連接數(shù)量,當(dāng)超出任何一個(gè)這些指標(biāo)的閾值時(shí),Zuul將積極地限制流量,以在系統(tǒng)恢復(fù)的同時(shí),保持自身的正常運(yùn)行。這一功能非常關(guān)鍵:如果Zuul出現(xiàn)故障,流量就不能傳送到我們的后端服務(wù)器,從而導(dǎo)致供應(yīng)的全面中斷。
引入基于優(yōu)先級(jí)的漸進(jìn)式負(fù)載分流
一旦確定了優(yōu)先級(jí),我們就可以將其與我們的減負(fù)機(jī)制結(jié)合起來(lái),從而極大地提高流媒體的可靠性。當(dāng)我們處于困境時(shí)(即超過(guò)上述任何閾值)時(shí),我們會(huì)從最低優(yōu)先級(jí)開(kāi)始,逐步丟棄流量。三次函數(shù)用于管理節(jié)流級(jí)別,如果情況變得非常非常糟糕,這一水平將觸及曲線的尖端,使其能夠節(jié)掉任何流量。
上圖是如何應(yīng)用立方函數(shù)的一個(gè)示例。隨著過(guò)載百分比的增加(即節(jié)流閾值和最大容量之間的范圍),優(yōu)先級(jí)閾值非常緩慢地落后于它:過(guò)載百分比35%,優(yōu)先級(jí)閾值仍然在90左右。如果系統(tǒng)繼續(xù)降級(jí),我們的過(guò)載百分比會(huì)在超過(guò)80%的情況下,優(yōu)先級(jí)達(dá)到50,然后在95%的情況下最終達(dá)到10,以此類推。
鑒于相對(duì)較少的請(qǐng)求,會(huì)影響流媒體可用性,限制低優(yōu)先級(jí)流量,可能會(huì)影響某些產(chǎn)品功能,但不會(huì)阻礙到人們點(diǎn)擊“播放”,觀看他們最愛(ài)的節(jié)目。通過(guò)添加漸進(jìn)式的,基于優(yōu)先級(jí)的負(fù)載分流,Zuul可以減少足夠的流量來(lái)穩(wěn)定服務(wù),而不會(huì)引起人們察覺(jué)。
應(yīng)對(duì)重試風(fēng)暴
當(dāng)Zuul決定減少流量時(shí),它會(huì)向設(shè)備發(fā)送信號(hào),設(shè)備接收到信號(hào)會(huì)執(zhí)行后退命令。Zuul通過(guò)指示設(shè)備可以執(zhí)行的重試次數(shù),以及可以在哪種時(shí)間窗口內(nèi)執(zhí)行這些重試命令,解決出現(xiàn)的問(wèn)題。例如:
利用這種反壓機(jī)制,我們可以比過(guò)去更快地停止重試風(fēng)暴。我們根據(jù)請(qǐng)求的優(yōu)先級(jí)自動(dòng)調(diào)整這兩個(gè)刻度盤(pán),相比較低優(yōu)先級(jí)的請(qǐng)求,具有較高優(yōu)先級(jí)的請(qǐng)求會(huì)更積極地重試,這也增加了流媒體的可用性。
驗(yàn)證哪些請(qǐng)求適合作業(yè)
為了驗(yàn)證我們關(guān)于特定請(qǐng)求是否屬于非關(guān)鍵型、體驗(yàn)降級(jí)型或關(guān)鍵型的分類假設(shè),我們需要一種方法來(lái)測(cè)試,當(dāng)用戶在該請(qǐng)求被阻止時(shí)的體驗(yàn)。為此,我們利用了內(nèi)部故障注入工具(FIT),并在Zuul中創(chuàng)建了一個(gè)故障注入點(diǎn),允許我們根據(jù)提供的優(yōu)先級(jí),舍棄任何請(qǐng)求。這使我們能夠通過(guò)阻止特定設(shè)備,或成員的優(yōu)先級(jí)范圍,來(lái)手動(dòng)模擬減負(fù)體驗(yàn),讓我們了解哪些請(qǐng)求可以安全地減負(fù),而不會(huì)影響用戶。
持續(xù)確保這些請(qǐng)求仍然適用作業(yè)
這里的一個(gè)目標(biāo),是通過(guò)丟棄那些預(yù)計(jì)不會(huì)影響用戶流媒體體驗(yàn)的請(qǐng)求,來(lái)減輕相對(duì)較糟的用戶體驗(yàn)。然而,Netflix變化很快,原本被認(rèn)為不關(guān)鍵的請(qǐng)求,可能會(huì)出人意料地變得關(guān)鍵。此外,Netflix擁有各種各樣的客戶端設(shè)備、客戶端版本,以及與系統(tǒng)交互的方式,為了確保在這些場(chǎng)景中,限制非關(guān)鍵請(qǐng)求時(shí)不會(huì)給成員帶來(lái)麻煩,我們利用了我們的基礎(chǔ)設(shè)施實(shí)驗(yàn)平臺(tái)CHAP。
該平臺(tái)允許我們進(jìn)行A/B實(shí)驗(yàn),將少量產(chǎn)品用戶,分配給對(duì)照組或?qū)嶒?yàn)組,45分鐘的時(shí)間,同時(shí)限制實(shí)驗(yàn)組一系列的優(yōu)先級(jí)。這使我們能夠捕獲各種實(shí)時(shí)使用案例,并衡量它們對(duì)回放體驗(yàn)的影響。CHAP分析每個(gè)設(shè)備成員的KPI,以確定對(duì)照組和實(shí)驗(yàn)組之間是否存在偏差。
在我們的第一個(gè)實(shí)驗(yàn)中,我們?cè)贏ndroid和IOS設(shè)備上都檢測(cè)到了低優(yōu)先級(jí)請(qǐng)求的競(jìng)爭(zhēng)情況,這會(huì)導(dǎo)致零星的播放錯(cuò)誤。由于我們進(jìn)行的是連續(xù)實(shí)驗(yàn),所以一旦初始實(shí)驗(yàn)運(yùn)行、并修復(fù)了錯(cuò)誤,我們就安排它們繼續(xù)定期運(yùn)行。這使得當(dāng)數(shù)據(jù)再次出現(xiàn)異常時(shí),我們能夠及早發(fā)現(xiàn)它,從而保持用戶流媒體的正常運(yùn)作。
FIX前后的實(shí)驗(yàn)數(shù)據(jù)回歸檢測(cè)
初嘗成果
2019年,在漸進(jìn)式分流法到位前,Netflix流媒體服務(wù)經(jīng)歷了一次中斷,導(dǎo)致相當(dāng)大比例的成員,在一段時(shí)間內(nèi)無(wú)法看視頻。2020年,在該方法實(shí)施部署幾天后,團(tuán)隊(duì)開(kāi)始看到這種解決方案的好處。Netflix也遇到過(guò)與2019年的服務(wù)中斷事件類似、并有著相同潛在影響的事件。與當(dāng)時(shí)不同的是,Zuul的漸進(jìn)式減負(fù)手段開(kāi)始發(fā)揮作用,開(kāi)始減流流量,直到服務(wù)處于健康狀態(tài),而且完全不會(huì)影響視頻播放的功能。
下圖顯示了穩(wěn)定的每秒流可用性指標(biāo)流(SPS),而Zuul正在根據(jù)事件期間請(qǐng)求的優(yōu)先級(jí)進(jìn)行漸進(jìn)式負(fù)載分流。
圖表中的不同顏色,表示被限制的優(yōu)先級(jí)不同的請(qǐng)求。
就此,在基礎(chǔ)架構(gòu)從系統(tǒng)故障中自我恢復(fù)時(shí),會(huì)員們?nèi)阅茼樌卦贜etflix上觀看他們最喜歡的節(jié)目。
未完待續(xù)
在未來(lái)的工作中,我們這支團(tuán)隊(duì)正在研究怎樣擴(kuò)展請(qǐng)求優(yōu)先級(jí)在其他用例中的運(yùn)用,比如設(shè)備和后端之間更好的重試策略、動(dòng)態(tài)更改負(fù)載分流閾值、以紊亂測(cè)試為指導(dǎo)原則,調(diào)整請(qǐng)求優(yōu)先級(jí),以及其他將使Netflix更具彈性的領(lǐng)域。