'為複雜混沌的微服務生產環境設計韌性系統'

"

太長不讀版

  • 即使每一個微服務都在測試部門的QA環境上通過了測試,當將其一個個部署到生產環境後,也必然會發生故障。
  • 不能以通過測試部門的QA測試為目標,而應該為生產環境的韌性而設計。
  • 當使用魚骨根因分析法、因果迴路圖或者麥肯錫MECE分析法進行分析時,要小心不要用錯場景,掉進複雜混沌世界的深淵。
  • 面對複雜混沌的生產環境,應該本著“不信有好事”的原則來進行“明哲保身”式的軟件設計,並在生產環境中利用混沌猴以及在辦公區進行殭屍來襲模擬的混沌工程實踐,來持續地主動揭示系統弱點,並加以改進,以提高系統韌性。

“阿里雲掛了!”

5個月前的一個下午,正在客戶現場的我,從微信群裡得知了這一消息。

阿里雲在那天,至少掛半小時。“我們在運維上的一個操作失誤,導致一些客戶訪問阿里雲官網控制檯和使用部分產品功能出現問題,引發了大量吐槽。”

這是典型的一次黑天鵝事件,符合黑天鵝的三個特性:

  1. 完全出乎意外;
  2. 帶來極端影響;
  3. 事後可編故事。

“對於這次故障,沒有藉口,我們不能也不該出現這樣的失誤!”

阿里雲的上述表態充滿了自責,雖然令我能感受到其誠意,但更好的表述或許是:對於這次故障,我們一方面表示歉意,另一方面要改進系統設計和驗證過程,使得今後局部的故障不會導致全局的失效。

對於阿里雲這樣複雜的系統,掛了的風險不可避免。

對於任何複雜的系統,失誤必然會發生,只是敬畏還不夠。因為——

複雜和混沌的系統無法預測

科幻作家劉慈欣所創作的《三體》,受到了下面三體問題的啟發。

“對於3個任意質量、初始位置和速度的天體,只在牛頓萬有引力定律的作用下運動,那麼能預測這3個天體的運動情況嗎?”

在130多年前,研究過這個問題的德國數學家布隆斯和法國數學家龐加萊得出這樣的結論:對於三體問題,不存在能用簡單代數和積分表達的一般解析解;除特殊情況外,三體的運動通常不會重複。

面對這個問題,龐加萊運用了他發明的相圖理論,並且最終發現了混沌理論。

"

太長不讀版

  • 即使每一個微服務都在測試部門的QA環境上通過了測試,當將其一個個部署到生產環境後,也必然會發生故障。
  • 不能以通過測試部門的QA測試為目標,而應該為生產環境的韌性而設計。
  • 當使用魚骨根因分析法、因果迴路圖或者麥肯錫MECE分析法進行分析時,要小心不要用錯場景,掉進複雜混沌世界的深淵。
  • 面對複雜混沌的生產環境,應該本著“不信有好事”的原則來進行“明哲保身”式的軟件設計,並在生產環境中利用混沌猴以及在辦公區進行殭屍來襲模擬的混沌工程實踐,來持續地主動揭示系統弱點,並加以改進,以提高系統韌性。

“阿里雲掛了!”

5個月前的一個下午,正在客戶現場的我,從微信群裡得知了這一消息。

阿里雲在那天,至少掛半小時。“我們在運維上的一個操作失誤,導致一些客戶訪問阿里雲官網控制檯和使用部分產品功能出現問題,引發了大量吐槽。”

這是典型的一次黑天鵝事件,符合黑天鵝的三個特性:

  1. 完全出乎意外;
  2. 帶來極端影響;
  3. 事後可編故事。

“對於這次故障,沒有藉口,我們不能也不該出現這樣的失誤!”

阿里雲的上述表態充滿了自責,雖然令我能感受到其誠意,但更好的表述或許是:對於這次故障,我們一方面表示歉意,另一方面要改進系統設計和驗證過程,使得今後局部的故障不會導致全局的失效。

對於阿里雲這樣複雜的系統,掛了的風險不可避免。

對於任何複雜的系統,失誤必然會發生,只是敬畏還不夠。因為——

複雜和混沌的系統無法預測

科幻作家劉慈欣所創作的《三體》,受到了下面三體問題的啟發。

“對於3個任意質量、初始位置和速度的天體,只在牛頓萬有引力定律的作用下運動,那麼能預測這3個天體的運動情況嗎?”

在130多年前,研究過這個問題的德國數學家布隆斯和法國數學家龐加萊得出這樣的結論:對於三體問題,不存在能用簡單代數和積分表達的一般解析解;除特殊情況外,三體的運動通常不會重複。

面對這個問題,龐加萊運用了他發明的相圖理論,並且最終發現了混沌理論。

為複雜混沌的微服務生產環境設計韌性系統

無法找到解和不會重複,就無法預測。

在三體問題中,科學家們熟悉其中每一個天體的性質,熟悉萬有引力。

但當3個這樣的天體在一起互動時,運動的軌跡卻不可預測。

複雜的生產環境,尤其是微服務系統的生產環境,至少有3個各自獨立通過了測試的系統,它們各自通過事先定義好的API實現通信。

但當它們在一起互動時,結果同樣不可預知。

雖然龐加萊發現了混沌理論,但從那之後的70多年間,機械論的世界觀仍然在科學界佔據主導地位。

機械論認為,大自然就像一臺精密的機器,只要我們發現了其中的函數,就能精確預測事物的發展,就像精確預測日食、月食、潮汐那樣。

如果再憑藉計算機運算這些函數,就能精確模擬原子彈爆炸和彈道軌跡,甚至能描述天氣的演化過程。

"

太長不讀版

  • 即使每一個微服務都在測試部門的QA環境上通過了測試,當將其一個個部署到生產環境後,也必然會發生故障。
  • 不能以通過測試部門的QA測試為目標,而應該為生產環境的韌性而設計。
  • 當使用魚骨根因分析法、因果迴路圖或者麥肯錫MECE分析法進行分析時,要小心不要用錯場景,掉進複雜混沌世界的深淵。
  • 面對複雜混沌的生產環境,應該本著“不信有好事”的原則來進行“明哲保身”式的軟件設計,並在生產環境中利用混沌猴以及在辦公區進行殭屍來襲模擬的混沌工程實踐,來持續地主動揭示系統弱點,並加以改進,以提高系統韌性。

“阿里雲掛了!”

5個月前的一個下午,正在客戶現場的我,從微信群裡得知了這一消息。

阿里雲在那天,至少掛半小時。“我們在運維上的一個操作失誤,導致一些客戶訪問阿里雲官網控制檯和使用部分產品功能出現問題,引發了大量吐槽。”

這是典型的一次黑天鵝事件,符合黑天鵝的三個特性:

  1. 完全出乎意外;
  2. 帶來極端影響;
  3. 事後可編故事。

“對於這次故障,沒有藉口,我們不能也不該出現這樣的失誤!”

阿里雲的上述表態充滿了自責,雖然令我能感受到其誠意,但更好的表述或許是:對於這次故障,我們一方面表示歉意,另一方面要改進系統設計和驗證過程,使得今後局部的故障不會導致全局的失效。

對於阿里雲這樣複雜的系統,掛了的風險不可避免。

對於任何複雜的系統,失誤必然會發生,只是敬畏還不夠。因為——

複雜和混沌的系統無法預測

科幻作家劉慈欣所創作的《三體》,受到了下面三體問題的啟發。

“對於3個任意質量、初始位置和速度的天體,只在牛頓萬有引力定律的作用下運動,那麼能預測這3個天體的運動情況嗎?”

在130多年前,研究過這個問題的德國數學家布隆斯和法國數學家龐加萊得出這樣的結論:對於三體問題,不存在能用簡單代數和積分表達的一般解析解;除特殊情況外,三體的運動通常不會重複。

面對這個問題,龐加萊運用了他發明的相圖理論,並且最終發現了混沌理論。

為複雜混沌的微服務生產環境設計韌性系統

無法找到解和不會重複,就無法預測。

在三體問題中,科學家們熟悉其中每一個天體的性質,熟悉萬有引力。

但當3個這樣的天體在一起互動時,運動的軌跡卻不可預測。

複雜的生產環境,尤其是微服務系統的生產環境,至少有3個各自獨立通過了測試的系統,它們各自通過事先定義好的API實現通信。

但當它們在一起互動時,結果同樣不可預知。

雖然龐加萊發現了混沌理論,但從那之後的70多年間,機械論的世界觀仍然在科學界佔據主導地位。

機械論認為,大自然就像一臺精密的機器,只要我們發現了其中的函數,就能精確預測事物的發展,就像精確預測日食、月食、潮汐那樣。

如果再憑藉計算機運算這些函數,就能精確模擬原子彈爆炸和彈道軌跡,甚至能描述天氣的演化過程。

為複雜混沌的微服務生產環境設計韌性系統

55年前的一天,美國氣象學家洛倫茲正在第二次用計算機計算一段時間的氣候變化。不過這一天,他沒讓計算機從頭計算,而是特地選擇從昨天計算的一箇中間結果0.506開始往後計算。

為了更細緻地考察結果,他把這個中間結果的精度提高到0.506127,然後就讓計算機使用與昨天同樣的函數開始計算。

因為使用的是同樣的函數,即使精度提高了一點,後半段天氣演化的過程也應該和昨天的結果相吻合。他一邊想,一邊去咖啡館喝了杯咖啡。

等他回來查看時,頓時大吃一驚:與昨天的天氣演化曲線相比,剛剛引入的0.000127這麼小的差異,隨著函數中時間變量的推移,從重合開始逐漸分道揚鑣,最終令計算出的最後結果發生了天壤之別。

再次驗算,他發現計算機的計算沒有問題。

他由此發現,剛剛引入的那個微小誤差,會以非線性的方式增長,從而造成截然不同的後果。

更重要的是,這種微小的誤差很容易被人們所忽視,此時又怎樣能找出造成不同後果的原因呢?

這便產生了蝴蝶效應這個驚世說法:一隻南美洲亞馬遜熱帶雨林中的蝴蝶,偶爾扇動了幾下翅膀,就可以在兩週後引起美國得克薩斯州的一場龍捲風。

如果把蝴蝶換成為生產環境編寫軟件的工程師呢?

一年多前的一天,一位亞馬遜S3服務團隊成員正在根據運維劇本移除少量的服務器。一不小心,他輸錯了命令,導致多於預期的服務器被移除。此後的4個小時內,美國成千上萬的網站無法正常運轉。

"

太長不讀版

  • 即使每一個微服務都在測試部門的QA環境上通過了測試,當將其一個個部署到生產環境後,也必然會發生故障。
  • 不能以通過測試部門的QA測試為目標,而應該為生產環境的韌性而設計。
  • 當使用魚骨根因分析法、因果迴路圖或者麥肯錫MECE分析法進行分析時,要小心不要用錯場景,掉進複雜混沌世界的深淵。
  • 面對複雜混沌的生產環境,應該本著“不信有好事”的原則來進行“明哲保身”式的軟件設計,並在生產環境中利用混沌猴以及在辦公區進行殭屍來襲模擬的混沌工程實踐,來持續地主動揭示系統弱點,並加以改進,以提高系統韌性。

“阿里雲掛了!”

5個月前的一個下午,正在客戶現場的我,從微信群裡得知了這一消息。

阿里雲在那天,至少掛半小時。“我們在運維上的一個操作失誤,導致一些客戶訪問阿里雲官網控制檯和使用部分產品功能出現問題,引發了大量吐槽。”

這是典型的一次黑天鵝事件,符合黑天鵝的三個特性:

  1. 完全出乎意外;
  2. 帶來極端影響;
  3. 事後可編故事。

“對於這次故障,沒有藉口,我們不能也不該出現這樣的失誤!”

阿里雲的上述表態充滿了自責,雖然令我能感受到其誠意,但更好的表述或許是:對於這次故障,我們一方面表示歉意,另一方面要改進系統設計和驗證過程,使得今後局部的故障不會導致全局的失效。

對於阿里雲這樣複雜的系統,掛了的風險不可避免。

對於任何複雜的系統,失誤必然會發生,只是敬畏還不夠。因為——

複雜和混沌的系統無法預測

科幻作家劉慈欣所創作的《三體》,受到了下面三體問題的啟發。

“對於3個任意質量、初始位置和速度的天體,只在牛頓萬有引力定律的作用下運動,那麼能預測這3個天體的運動情況嗎?”

在130多年前,研究過這個問題的德國數學家布隆斯和法國數學家龐加萊得出這樣的結論:對於三體問題,不存在能用簡單代數和積分表達的一般解析解;除特殊情況外,三體的運動通常不會重複。

面對這個問題,龐加萊運用了他發明的相圖理論,並且最終發現了混沌理論。

為複雜混沌的微服務生產環境設計韌性系統

無法找到解和不會重複,就無法預測。

在三體問題中,科學家們熟悉其中每一個天體的性質,熟悉萬有引力。

但當3個這樣的天體在一起互動時,運動的軌跡卻不可預測。

複雜的生產環境,尤其是微服務系統的生產環境,至少有3個各自獨立通過了測試的系統,它們各自通過事先定義好的API實現通信。

但當它們在一起互動時,結果同樣不可預知。

雖然龐加萊發現了混沌理論,但從那之後的70多年間,機械論的世界觀仍然在科學界佔據主導地位。

機械論認為,大自然就像一臺精密的機器,只要我們發現了其中的函數,就能精確預測事物的發展,就像精確預測日食、月食、潮汐那樣。

如果再憑藉計算機運算這些函數,就能精確模擬原子彈爆炸和彈道軌跡,甚至能描述天氣的演化過程。

為複雜混沌的微服務生產環境設計韌性系統

55年前的一天,美國氣象學家洛倫茲正在第二次用計算機計算一段時間的氣候變化。不過這一天,他沒讓計算機從頭計算,而是特地選擇從昨天計算的一箇中間結果0.506開始往後計算。

為了更細緻地考察結果,他把這個中間結果的精度提高到0.506127,然後就讓計算機使用與昨天同樣的函數開始計算。

因為使用的是同樣的函數,即使精度提高了一點,後半段天氣演化的過程也應該和昨天的結果相吻合。他一邊想,一邊去咖啡館喝了杯咖啡。

等他回來查看時,頓時大吃一驚:與昨天的天氣演化曲線相比,剛剛引入的0.000127這麼小的差異,隨著函數中時間變量的推移,從重合開始逐漸分道揚鑣,最終令計算出的最後結果發生了天壤之別。

再次驗算,他發現計算機的計算沒有問題。

他由此發現,剛剛引入的那個微小誤差,會以非線性的方式增長,從而造成截然不同的後果。

更重要的是,這種微小的誤差很容易被人們所忽視,此時又怎樣能找出造成不同後果的原因呢?

這便產生了蝴蝶效應這個驚世說法:一隻南美洲亞馬遜熱帶雨林中的蝴蝶,偶爾扇動了幾下翅膀,就可以在兩週後引起美國得克薩斯州的一場龍捲風。

如果把蝴蝶換成為生產環境編寫軟件的工程師呢?

一年多前的一天,一位亞馬遜S3服務團隊成員正在根據運維劇本移除少量的服務器。一不小心,他輸錯了命令,導致多於預期的服務器被移除。此後的4個小時內,美國成千上萬的網站無法正常運轉。

為複雜混沌的微服務生產環境設計韌性系統

在複雜和混沌的系統中,人、事、物之間的相互作用大多都是非線性的,初始條件千差萬別。

三體互動無法預測,細微原因不易發現。此時,又如何能保證“不能也不該出現失誤”呢?難道要——

用解決“石頭、剪子、布”的簡單思路,來解決氣象預測之類的混沌問題?

英國諮詢師斯諾登用他所創造的“棲息地”框架,把世間的問題分為5種:

  1. 明顯的問題
  2. 繁雜的問題
  3. 複雜的問題
  4. 混沌的問題
  5. 紊亂的問題

明顯的問題,其中的約束少而線性,就如同兩人玩“石頭、剪子、布”那樣。

繁雜的問題,其中的約束雖然多些,但也都是線性的,就如同修汽車那樣。

複雜的問題,其中的約束會是非線形的,且經常發生變化,有時會自相矛盾,就如同太太們打麻將那樣。

混沌的問題,其中的約束難以捉摸,就如同氣象或三體問題那樣。

在明顯的問題和混沌的問題之間有一個陡峭的懸崖,這意味著如果盲目地用解決“石頭、剪子、布”的簡單思路,來解決氣象預測之類的混沌問題,那麼就會墜入深淵。

阿里雲和亞馬遜AWS服務屬於哪類問題呢?

阿里雲和AWS中的每一個微服務,可以看作是明顯或繁雜的問題。但我們能在一個相對簡單的QA測試環境來驗證每一個微服務及其API,然後將它們部署到生產環境,並聲稱它們之間能按預期運行嗎?顯然我們不會那麼自信,因為此時隱約看到了三體問題混沌的影子。

我們能用“相互獨立和完全窮盡”的麥肯錫MECE分析法,來分析阿里雲事故嗎?我們能完全窮盡所有的原因嗎?

“這一功能在測試環境驗證中並未發生問題,上線到自動化運維繫統後,觸發了一個未知代碼bug。錯誤代碼禁用了部分內部IP,導致部分產品訪問鏈路不通。”

在上面阿里雲故障官方說明中,當看到“未知代碼bug”,就知道這是一個“不可知的未知”的混沌問題。此時還何談“完全窮盡”?

即使找到了那段有bug的代碼,定位到了寫代碼的程序員,程序員能否完全窮盡各種原因?人家甚至都不願意說出原因。

在這種混沌情況下,魚骨根因分析法和因果迴路圖,都統統黯然失色。因為除了原因無法窮盡,因果迴路圖還會給人一種原因已被窮盡的自我陶醉的假象。

在複雜和混沌的系統中,我們要——

專注於持續發現約束,而不是尋找根本原因

應對黑天鵝事件的策略可以有3個:

  1. 承認無法預測黑天鵝;
  2. 增強個體抗打擊能力;
  3. 設法利用試錯來獲利。

其中,承認無法預測黑天鵝是關鍵。否則,又會墜入在混沌問題中尋找根因的懸崖。

約束能啟發我們識別臨界狀態,促使我們把各個微服務打造成“明哲保身”且能自愈的自治子系統,增強個體抗打擊能力,從而把整個系統打造成一個韌性系統。

系統韌性(Resilience),是系統在變化和干擾的發生之前、發生期間或發生之後,調整其功能的內在能力,從而可以在預期情況和意外情況下,依然能做出所需的操作。由於系統韌性是指能夠讓系統發揮作用,而不是去抵禦失效所帶來的影響,因此在生產力和安全性之間不存在衝突。

面對複雜和混沌的整個微服務系統,要驗證其韌性,不可能構建第二個阿里雲去做測試,也不能憑藉每個微服務自己的QA環境來驗證,那麼怎麼才能構建韌性系統來避免災難呢?

20多年前的一天,美國理論物理學博士生馬克・布查納正在用一個沙堆來可視化複雜系統中的“災難”。

他發現,當沙子一粒粒落到平面上,逐漸堆積成一個小沙丘後,處於陡峭位置的沙粒會越來越多,全都變得“命懸一線”,從而形成了一個“災難”前的臨界狀態。

此時當有沙子繼續落下,就會令處於臨界狀態的沙丘變得非常敏感,任何一粒沙子都有可能引發沙丘的大規模崩塌。

一個複雜系統,達到臨界狀態,再來一點觸發,隨時災難爆發。

但是,沙丘一旦崩塌,則又恢復為比較平坦的相對安全的狀態。

據說,美國林業部門在預防森林火災時,已經採取偶爾主動引發中小規模的火災,來清除樹木不斷堆積的易燃物,避免森林進入火災臨界狀態,從而預防大型火災。

在平時人際交往中,儘量及時溝通,避免積累情緒和敵意,也是避免進入臨界狀態的一種方法。

"

太長不讀版

  • 即使每一個微服務都在測試部門的QA環境上通過了測試,當將其一個個部署到生產環境後,也必然會發生故障。
  • 不能以通過測試部門的QA測試為目標,而應該為生產環境的韌性而設計。
  • 當使用魚骨根因分析法、因果迴路圖或者麥肯錫MECE分析法進行分析時,要小心不要用錯場景,掉進複雜混沌世界的深淵。
  • 面對複雜混沌的生產環境,應該本著“不信有好事”的原則來進行“明哲保身”式的軟件設計,並在生產環境中利用混沌猴以及在辦公區進行殭屍來襲模擬的混沌工程實踐,來持續地主動揭示系統弱點,並加以改進,以提高系統韌性。

“阿里雲掛了!”

5個月前的一個下午,正在客戶現場的我,從微信群裡得知了這一消息。

阿里雲在那天,至少掛半小時。“我們在運維上的一個操作失誤,導致一些客戶訪問阿里雲官網控制檯和使用部分產品功能出現問題,引發了大量吐槽。”

這是典型的一次黑天鵝事件,符合黑天鵝的三個特性:

  1. 完全出乎意外;
  2. 帶來極端影響;
  3. 事後可編故事。

“對於這次故障,沒有藉口,我們不能也不該出現這樣的失誤!”

阿里雲的上述表態充滿了自責,雖然令我能感受到其誠意,但更好的表述或許是:對於這次故障,我們一方面表示歉意,另一方面要改進系統設計和驗證過程,使得今後局部的故障不會導致全局的失效。

對於阿里雲這樣複雜的系統,掛了的風險不可避免。

對於任何複雜的系統,失誤必然會發生,只是敬畏還不夠。因為——

複雜和混沌的系統無法預測

科幻作家劉慈欣所創作的《三體》,受到了下面三體問題的啟發。

“對於3個任意質量、初始位置和速度的天體,只在牛頓萬有引力定律的作用下運動,那麼能預測這3個天體的運動情況嗎?”

在130多年前,研究過這個問題的德國數學家布隆斯和法國數學家龐加萊得出這樣的結論:對於三體問題,不存在能用簡單代數和積分表達的一般解析解;除特殊情況外,三體的運動通常不會重複。

面對這個問題,龐加萊運用了他發明的相圖理論,並且最終發現了混沌理論。

為複雜混沌的微服務生產環境設計韌性系統

無法找到解和不會重複,就無法預測。

在三體問題中,科學家們熟悉其中每一個天體的性質,熟悉萬有引力。

但當3個這樣的天體在一起互動時,運動的軌跡卻不可預測。

複雜的生產環境,尤其是微服務系統的生產環境,至少有3個各自獨立通過了測試的系統,它們各自通過事先定義好的API實現通信。

但當它們在一起互動時,結果同樣不可預知。

雖然龐加萊發現了混沌理論,但從那之後的70多年間,機械論的世界觀仍然在科學界佔據主導地位。

機械論認為,大自然就像一臺精密的機器,只要我們發現了其中的函數,就能精確預測事物的發展,就像精確預測日食、月食、潮汐那樣。

如果再憑藉計算機運算這些函數,就能精確模擬原子彈爆炸和彈道軌跡,甚至能描述天氣的演化過程。

為複雜混沌的微服務生產環境設計韌性系統

55年前的一天,美國氣象學家洛倫茲正在第二次用計算機計算一段時間的氣候變化。不過這一天,他沒讓計算機從頭計算,而是特地選擇從昨天計算的一箇中間結果0.506開始往後計算。

為了更細緻地考察結果,他把這個中間結果的精度提高到0.506127,然後就讓計算機使用與昨天同樣的函數開始計算。

因為使用的是同樣的函數,即使精度提高了一點,後半段天氣演化的過程也應該和昨天的結果相吻合。他一邊想,一邊去咖啡館喝了杯咖啡。

等他回來查看時,頓時大吃一驚:與昨天的天氣演化曲線相比,剛剛引入的0.000127這麼小的差異,隨著函數中時間變量的推移,從重合開始逐漸分道揚鑣,最終令計算出的最後結果發生了天壤之別。

再次驗算,他發現計算機的計算沒有問題。

他由此發現,剛剛引入的那個微小誤差,會以非線性的方式增長,從而造成截然不同的後果。

更重要的是,這種微小的誤差很容易被人們所忽視,此時又怎樣能找出造成不同後果的原因呢?

這便產生了蝴蝶效應這個驚世說法:一隻南美洲亞馬遜熱帶雨林中的蝴蝶,偶爾扇動了幾下翅膀,就可以在兩週後引起美國得克薩斯州的一場龍捲風。

如果把蝴蝶換成為生產環境編寫軟件的工程師呢?

一年多前的一天,一位亞馬遜S3服務團隊成員正在根據運維劇本移除少量的服務器。一不小心,他輸錯了命令,導致多於預期的服務器被移除。此後的4個小時內,美國成千上萬的網站無法正常運轉。

為複雜混沌的微服務生產環境設計韌性系統

在複雜和混沌的系統中,人、事、物之間的相互作用大多都是非線性的,初始條件千差萬別。

三體互動無法預測,細微原因不易發現。此時,又如何能保證“不能也不該出現失誤”呢?難道要——

用解決“石頭、剪子、布”的簡單思路,來解決氣象預測之類的混沌問題?

英國諮詢師斯諾登用他所創造的“棲息地”框架,把世間的問題分為5種:

  1. 明顯的問題
  2. 繁雜的問題
  3. 複雜的問題
  4. 混沌的問題
  5. 紊亂的問題

明顯的問題,其中的約束少而線性,就如同兩人玩“石頭、剪子、布”那樣。

繁雜的問題,其中的約束雖然多些,但也都是線性的,就如同修汽車那樣。

複雜的問題,其中的約束會是非線形的,且經常發生變化,有時會自相矛盾,就如同太太們打麻將那樣。

混沌的問題,其中的約束難以捉摸,就如同氣象或三體問題那樣。

在明顯的問題和混沌的問題之間有一個陡峭的懸崖,這意味著如果盲目地用解決“石頭、剪子、布”的簡單思路,來解決氣象預測之類的混沌問題,那麼就會墜入深淵。

阿里雲和亞馬遜AWS服務屬於哪類問題呢?

阿里雲和AWS中的每一個微服務,可以看作是明顯或繁雜的問題。但我們能在一個相對簡單的QA測試環境來驗證每一個微服務及其API,然後將它們部署到生產環境,並聲稱它們之間能按預期運行嗎?顯然我們不會那麼自信,因為此時隱約看到了三體問題混沌的影子。

我們能用“相互獨立和完全窮盡”的麥肯錫MECE分析法,來分析阿里雲事故嗎?我們能完全窮盡所有的原因嗎?

“這一功能在測試環境驗證中並未發生問題,上線到自動化運維繫統後,觸發了一個未知代碼bug。錯誤代碼禁用了部分內部IP,導致部分產品訪問鏈路不通。”

在上面阿里雲故障官方說明中,當看到“未知代碼bug”,就知道這是一個“不可知的未知”的混沌問題。此時還何談“完全窮盡”?

即使找到了那段有bug的代碼,定位到了寫代碼的程序員,程序員能否完全窮盡各種原因?人家甚至都不願意說出原因。

在這種混沌情況下,魚骨根因分析法和因果迴路圖,都統統黯然失色。因為除了原因無法窮盡,因果迴路圖還會給人一種原因已被窮盡的自我陶醉的假象。

在複雜和混沌的系統中,我們要——

專注於持續發現約束,而不是尋找根本原因

應對黑天鵝事件的策略可以有3個:

  1. 承認無法預測黑天鵝;
  2. 增強個體抗打擊能力;
  3. 設法利用試錯來獲利。

其中,承認無法預測黑天鵝是關鍵。否則,又會墜入在混沌問題中尋找根因的懸崖。

約束能啟發我們識別臨界狀態,促使我們把各個微服務打造成“明哲保身”且能自愈的自治子系統,增強個體抗打擊能力,從而把整個系統打造成一個韌性系統。

系統韌性(Resilience),是系統在變化和干擾的發生之前、發生期間或發生之後,調整其功能的內在能力,從而可以在預期情況和意外情況下,依然能做出所需的操作。由於系統韌性是指能夠讓系統發揮作用,而不是去抵禦失效所帶來的影響,因此在生產力和安全性之間不存在衝突。

面對複雜和混沌的整個微服務系統,要驗證其韌性,不可能構建第二個阿里雲去做測試,也不能憑藉每個微服務自己的QA環境來驗證,那麼怎麼才能構建韌性系統來避免災難呢?

20多年前的一天,美國理論物理學博士生馬克・布查納正在用一個沙堆來可視化複雜系統中的“災難”。

他發現,當沙子一粒粒落到平面上,逐漸堆積成一個小沙丘後,處於陡峭位置的沙粒會越來越多,全都變得“命懸一線”,從而形成了一個“災難”前的臨界狀態。

此時當有沙子繼續落下,就會令處於臨界狀態的沙丘變得非常敏感,任何一粒沙子都有可能引發沙丘的大規模崩塌。

一個複雜系統,達到臨界狀態,再來一點觸發,隨時災難爆發。

但是,沙丘一旦崩塌,則又恢復為比較平坦的相對安全的狀態。

據說,美國林業部門在預防森林火災時,已經採取偶爾主動引發中小規模的火災,來清除樹木不斷堆積的易燃物,避免森林進入火災臨界狀態,從而預防大型火災。

在平時人際交往中,儘量及時溝通,避免積累情緒和敵意,也是避免進入臨界狀態的一種方法。

為複雜混沌的微服務生產環境設計韌性系統

我們自然也可以利用上述避免臨界狀態的思路,在生產環境中主動進行一些混沌工程的試驗,比如關閉一些“非致命”的服務器實例。一方面驗證系統是否能自愈,另一方面也是提前多次小範圍“引爆”,以釋放“能量”,以免系統達到發生嚴重災難的臨界狀態。這也是設法利用試錯來獲利的一種實踐。

針對複雜和混沌的微服務生產環境,我們可以使用下面的方法來設計系統韌性。

  1. 識別問題種類。使用“棲息地”框架來確定生產環境屬於哪種問題。如果判斷生產環境是複雜和混沌的問題,那麼在分析問題時,就不要使用麥肯錫MECE分析法、魚骨根因分析法和因果迴路圖,承認無法預測黑天鵝,轉而使用下面的方法。
  2. 確定系統願景。 栩栩如生地描述系統在所期望的狀態下是如何運行的。系統未來引人入勝的願景,確定了下面行動的方向。比如:即使錯誤代碼要禁用部分內部IP,系統仍然能保證核心產品訪問鏈路依舊通暢。
  3. 系統成員關係。畫微服務系統用例圖,在圖中畫出微服務系統所有的核心服務、支持服務和通用服務,及其相互關係,並畫出與這些服務交互的人和外部系統。
  4. 識別系統約束。參考用例圖,對用戶旅程進行事件風暴,並在其中識別約束、人和外部系統。在識別約束時,一方面對於與系統交互的人,要考慮“他們的感受和自尊心”,因為這些也是我們要考慮的約束;另一方面,也要考慮約束的延遲性,警惕忽視“時滯性”的不耐煩所導致的系統“振盪”,比如總也調不好水溫的淋浴器。
  5. 明哲保身原則。抱著“不信有好事”的信念對每個微服務進行設計和重構,以增強個體抗打擊能力。每一個微服務經過這番設計後,即使其所依賴的其他微服務都發生故障,甚至自身也發生了局部故障,也能繼續運行。此時可以針對上面所識別出的約束,考慮使用超時、斷路器、艙壁、快速失敗、任其崩潰並替換等設計模式來增強系統韌性。同時要避免連累反應、層疊失效、阻塞的線程、自黑式攻擊、疊羅漢、緩慢的響應、無限長結果集等反模式。
  6. 頻繁小型“引爆”。既然不可能構建第二個阿里雲去做測試,那我們可以考慮使用混沌猴工具,來在生產環境中主動關閉一些非“致命”的服務實例,以檢驗微服務系統是否能自動修復故障,另外更重要的是能頻繁小批量地釋放“能量”,以免系統達到災難前的臨界狀態。此時一旦發現弱點,就立即進行改進。為了驗證團隊在人員發生變動的情況下依舊能正常運轉,可以考慮進行“殭屍來襲模擬”,即從團隊裡隨機選擇50%的人,並告訴他們在當天會被視為殭屍,他們雖然來上班,但需要遠離工作,並且對與其所進行的任何溝通嘗試都不做任何反應。此時同樣要識別在團隊組織方面所發現的弱點,並進行改進。這樣不斷小規模試錯,就能獲得系統穩定性的最大利益。

總結

  • 三體互動無法預測,細微原因不易發現,複雜和混沌的系統無法預測。
  • 面對複雜混沌系統,用解決“石頭、剪子、布”的簡單思路,會墜入深淵。此時應該專注於持續發現約束,而不是尋找根本原因。
  • 約束能啟發我們識別臨界狀態,促使我們把各個微服務打造成“明哲保身”且能自愈的自治子系統,並用頻繁小型的引爆避免進入臨界狀態,從而把整個系統打造成一個韌性系統。

文/ThoughtWorks伍斌

更多精彩洞見,請關注微信公眾號:ThoughtWorks洞見

"

相關推薦

推薦中...