Netflix正在搞的混沌工程到底是什么?終于有人講明白了
導(dǎo)讀:與任何新概念一樣,混沌工程時(shí)常被誤解。本文會(huì)探討混沌工程是什么以及不是什么。
作者:Casey Rosenthal, Nora Jones
來源:大數(shù)據(jù)DT(ID:hzdashuju)

在Netflix的混沌工程實(shí)踐之初,大家實(shí)際上并不明確這門學(xué)科究竟是什么。關(guān)于如何讓服務(wù)更可靠存在著許多誤解。比如那時(shí)經(jīng)常聽到這樣一些口號(hào)——拔掉電纜、在生產(chǎn)環(huán)境搞破壞或在生產(chǎn)環(huán)境進(jìn)行測(cè)試。另外,也幾乎不存在混沌工程實(shí)際工具的例子。
Netflix成立混沌工程團(tuán)隊(duì)就是要?jiǎng)?chuàng)建一門有意義的學(xué)科。該學(xué)科能夠借助工具主動(dòng)提高可靠性。我們花了幾個(gè)月的時(shí)間研究韌性工程和其他學(xué)科,并提出混沌工程的定義和藍(lán)圖以造福他人。
混沌工程的定義已經(jīng)以宣言的形式上線,稱為“混沌工程原則”。
https://principlesofchaos.org
01 混沌工程是什么
混沌工程原則定義了混沌工程學(xué)科,以便大家了解何時(shí)該進(jìn)行、該如何進(jìn)行以及該如何做好混沌工程。如今,混沌工程的通用定義是“促進(jìn)發(fā)現(xiàn)系統(tǒng)弱點(diǎn)的實(shí)驗(yàn)”。混沌工程原則的網(wǎng)站概述了如下實(shí)驗(yàn)步驟:
首先定義“穩(wěn)態(tài)”(steady state,穩(wěn)定狀態(tài)),以表示系統(tǒng)正常行為的某些可測(cè)量的輸出。
建立如下假說—對(duì)照組和實(shí)驗(yàn)組都將持續(xù)這種穩(wěn)態(tài)。
引入反映真實(shí)事件的變量,例如崩潰的服務(wù)器、發(fā)生故障的硬盤驅(qū)動(dòng)器、斷開的網(wǎng)絡(luò)連接等。
試圖通過在對(duì)照組和實(shí)驗(yàn)組之間尋找穩(wěn)態(tài)差異來推翻這一假說。
該實(shí)驗(yàn)構(gòu)成了混沌工程的基本原則,并為實(shí)驗(yàn)的實(shí)施提供了很大的自由度。
1. 實(shí)驗(yàn)與測(cè)試
在Netflix,我們發(fā)現(xiàn)首先必須要做出的澄清是,混沌工程是一種實(shí)驗(yàn)而非測(cè)試。可以說,“質(zhì)量保證”涵蓋了兩者,但該詞在軟件行業(yè)通常具有負(fù)面含義。
最初,Netflix的某些團(tuán)隊(duì)會(huì)問混沌工程團(tuán)隊(duì):“難道你們就不能編寫一堆集成測(cè)試來發(fā)現(xiàn)同樣的問題嗎?”從理論上講,這種觀點(diǎn)是務(wù)實(shí)的。但實(shí)際上,不可能從集成測(cè)試中獲得理想的結(jié)果。
嚴(yán)格來說,測(cè)試不會(huì)創(chuàng)造新知識(shí)。測(cè)試要求編寫測(cè)試的工程師知道要驗(yàn)證的系統(tǒng)的特定屬性。復(fù)雜系統(tǒng)對(duì)于這種類型的分析是不透明的。對(duì)于復(fù)雜系統(tǒng)中各個(gè)部件所有的潛在相互作用所帶來的所有潛在副作用,人類根本就無法理解。這使我們得出了測(cè)試的下述關(guān)鍵特性。
測(cè)試會(huì)根據(jù)現(xiàn)有知識(shí)做出一個(gè)斷言,然后執(zhí)行測(cè)試,并給出該斷言的結(jié)果(通常為真或假)。測(cè)試是關(guān)于系統(tǒng)已知屬性的聲明。
另一方面,實(shí)驗(yàn)創(chuàng)造了新知識(shí)。實(shí)驗(yàn)提出了一個(gè)假說,只要假說不被推翻,對(duì)該假說的信心就會(huì)增強(qiáng)。而如果假說被推翻了,那就會(huì)學(xué)到一些新東西。這就能啟動(dòng)一個(gè)調(diào)查,以弄清楚假說為什么是錯(cuò)的。
在復(fù)雜系統(tǒng)中所發(fā)生的事情的原因通常都不會(huì)是顯而易見的。實(shí)驗(yàn)可以建立信心,也可以讓我們學(xué)到系統(tǒng)的新屬性。這是對(duì)未知的探索。
因?yàn)闇y(cè)試需要有人提前提出斷言,所以僅憑測(cè)試是無法取得通過實(shí)驗(yàn)而收獲的洞察的。實(shí)驗(yàn)引入了一種發(fā)現(xiàn)新屬性的正規(guī)方法。而當(dāng)發(fā)現(xiàn)了系統(tǒng)的新屬性后,完全可以將其轉(zhuǎn)換為測(cè)試。
實(shí)驗(yàn)還有助于將有關(guān)系統(tǒng)的新設(shè)想編碼為新的假說,從而創(chuàng)建類似“回歸實(shí)驗(yàn)”的實(shí)踐,以便隨著時(shí)間的推移而對(duì)系統(tǒng)做進(jìn)一步探索。
由于混沌工程誕生于應(yīng)對(duì)復(fù)雜系統(tǒng)問題,因此該學(xué)科必須體現(xiàn)實(shí)驗(yàn)性而非測(cè)試性。

2. 驗(yàn)證與清查
在運(yùn)維管理和物流規(guī)劃領(lǐng)域,驗(yàn)證(verification)和清查(validation)的定義是不同的。而混沌工程更偏重于驗(yàn)證。
驗(yàn)證
復(fù)雜系統(tǒng)的驗(yàn)證是在系統(tǒng)邊界分析輸出的過程。比如房主可以通過測(cè)試水槽(系統(tǒng)邊界)中的污染物,來驗(yàn)證水(輸出)的質(zhì)量,而無須了解管道或市政供水系統(tǒng)(系統(tǒng)部件)的功能。
清查
復(fù)雜系統(tǒng)的清查是分析系統(tǒng)的各個(gè)部件并建立反映部件之間的相互作用的思維模型的過程。房主可以通過檢查所有管道和基礎(chǔ)設(shè)施(系統(tǒng)部件)來清查水質(zhì)。這些管道和基礎(chǔ)設(shè)施會(huì)采集、清潔和輸送水(功能部件的思維模型),并將水輸送到居民區(qū)中的千家萬戶。
這兩種做法都是有用的,并且都可以建立對(duì)系統(tǒng)輸出的信心。作為軟件工程師,我們經(jīng)常會(huì)偏向于強(qiáng)迫自己去深入研究代碼,并驗(yàn)證代碼是否反映了我們關(guān)于代碼應(yīng)如何工作的思維模型。與這種偏好相反,混沌工程極力主張進(jìn)行驗(yàn)證而不是清查?;煦绻こ趟P(guān)心的是某事是否有效,而不是如何工作。
請(qǐng)注意,在上面有關(guān)管道的隱喻中,雖然可以清查用于提供清潔飲用水的所有組件,但由于某些未曾想到的原因,最終水龍頭里流出來的仍是被污染的水。在復(fù)雜系統(tǒng)中總是存在不可預(yù)測(cè)的交互。但是,如果驗(yàn)證水龍頭流出的水是干凈的,那么就不必操心水是如何來的。
在大多數(shù)業(yè)務(wù)案例中,比起考慮系統(tǒng)的實(shí)現(xiàn)是否符合我們的思維模型,系統(tǒng)的輸出要重要得多?;煦绻こ谈P(guān)心業(yè)務(wù)和輸出,而不是正在互動(dòng)的各個(gè)部件的實(shí)現(xiàn)或思維模型。

02 混沌工程不是什么
有兩個(gè)概念經(jīng)常和混沌工程混淆——在生產(chǎn)環(huán)境中搞破壞和反脆弱。
1. 在生產(chǎn)環(huán)境中搞破壞
在博客文章或會(huì)議演講中,人們時(shí)常會(huì)將混沌工程描述為“在生產(chǎn)環(huán)境中搞破壞”。對(duì)于能從混沌工程中獲益良多的大型企業(yè)以及其他復(fù)雜系統(tǒng)的運(yùn)營者來說,盡管這句話聽起來很酷,但對(duì)他們并沒有吸引力。
有關(guān)混沌工程的一個(gè)更好的說法是:修復(fù)生產(chǎn)環(huán)境中的漏洞。 “搞破壞”很容易,但完成下述事情很難:減小爆炸半徑,對(duì)安全性進(jìn)行批判性思考,確定漏洞是否值得修復(fù),決定是否應(yīng)該進(jìn)行實(shí)驗(yàn),等等。
“搞破壞”可以用無數(shù)的方式來完成,且花費(fèi)的時(shí)間也很少。但更大的問題是,在不知道系統(tǒng)部件已被破壞的情況下,該如何推測(cè)出哪些部件已經(jīng)被破壞?
“修復(fù)生產(chǎn)環(huán)境中的漏洞”能更好地體現(xiàn)混沌工程的價(jià)值,因?yàn)檎麄€(gè)混沌工程實(shí)踐的重點(diǎn)是主動(dòng)提高復(fù)雜系統(tǒng)的可用性和安全性。現(xiàn)在已經(jīng)有很多對(duì)事故做出應(yīng)急反應(yīng)的學(xué)科和工具,比如告警工具、事故響應(yīng)管理、可觀測(cè)性工具、災(zāi)難恢復(fù)計(jì)劃等。其目的是當(dāng)事故發(fā)生后能縮短檢測(cè)時(shí)間和修復(fù)時(shí)間。
有人可能會(huì)說,SRE(Site Reliability Engineering,網(wǎng)站可靠性工程)是一門兼具被動(dòng)性和主動(dòng)性的學(xué)科,可以通過從過去的事故中獲得知識(shí),并將知識(shí)進(jìn)行社交化來防止將來發(fā)生類似的事故。而混沌工程是軟件行業(yè)中唯一專注于主動(dòng)提高復(fù)雜系統(tǒng)安全性的學(xué)科。
2. 反脆弱
熟悉納西姆·塔勒布(Nassim Taleb)所提出的反脆弱性概念的人,經(jīng)常會(huì)認(rèn)為混沌工程本質(zhì)上是反脆弱的軟件版。塔勒布認(rèn)為,諸如“低劑量毒物興奮效應(yīng)”之類的詞,已不足以表達(dá)復(fù)雜系統(tǒng)的適應(yīng)能力。因此他發(fā)明了“反脆弱”一詞,指系統(tǒng)當(dāng)受到隨機(jī)壓力時(shí)能變得更強(qiáng)的特性。
混沌工程和反脆弱之間一個(gè)重要的關(guān)鍵區(qū)別是混沌工程能教育系統(tǒng)維護(hù)人員,讓他們認(rèn)識(shí)到混沌為系統(tǒng)所固有,從而使他們成為一支更具韌性的團(tuán)隊(duì)。而相比之下,反脆弱卻給系統(tǒng)加入混沌,并希望系統(tǒng)在響應(yīng)混沌時(shí)能變得更強(qiáng)大,而不是屈服于混沌。
作為框架,反脆弱的觀點(diǎn)與學(xué)術(shù)界所研究的韌性工程、人因?qū)W和安全系統(tǒng)都不一致。例如對(duì)于提高系統(tǒng)健壯性而言,反脆弱建議的第一步是尋找并消除弱點(diǎn)。這項(xiàng)建議看似直觀,但韌性工程告訴我們,對(duì)于安全性而言,尋找做對(duì)的地方要比尋找做錯(cuò)的地方提供的信息要多得多。
反脆弱的下一步是添加冗余。這似乎也很直觀,但是添加冗余既可以緩解故障,也可以導(dǎo)致故障。在有關(guān)韌性工程的文獻(xiàn)中有眾多冗余所導(dǎo)致的安全性故障案例。
這兩種思想流派之間還存在許多其他分歧。韌性工程是一個(gè)有著數(shù)十年歷史,并正不斷發(fā)展的研究領(lǐng)域。而反脆弱則游離于學(xué)術(shù)界之外,且缺乏同行評(píng)審。因?yàn)閮烧叨际且獞?yīng)對(duì)混沌和復(fù)雜系統(tǒng),所以很容易就產(chǎn)生兩者可以融合在一起的感覺。
但反脆弱實(shí)際上并不具備混沌工程所擁有的經(jīng)驗(yàn)主義和理論基礎(chǔ)。由此,兩者在根本追求上就已分道揚(yáng)鑣。
