從反脆弱角度說一說:技術系統高可用性策略

1 非線性

我們先來介紹一個概念:非線性。這個概念在我們的生活中無處不在。

你要趕早上8點鐘的火車,如果6:30出發可以在7:00到達車站,於是你得到一個結論:只要30分鐘就可以到達車站。

你早上想睡晚一點預計7:10出發,想着7:40可以到達車站。但是最可能的結果是你將錯過這趟火車。因爲正好遇上早高峯,堵車導致你至少需要花費1個小時才能到達車站。

一個小雪球的重量是100克,打雪仗時你被砸中100次,這對你不會造成任何影響。

但是如果你被10公斤的雪球砸中1次,這可能會對你造成嚴重的傷害。

這就是非線性。事物不是簡單的疊加關係,當達到某個臨界值時,會造成一種完全截然不同的結果。

2 秒殺系統

我們來分析一個互聯網的秒殺場景。假設你設計的秒殺系統當每秒30個人訪問時,響應時間是10毫秒。即從用戶點擊按鈕至得到結果這個過程,只花費了10毫秒。這個時間的流逝基本上察覺不到,性能是不錯的。你感覺很好,繼續設計:

每秒30個訪問量,響應時間10毫秒

每秒300個訪問量,響應時間100毫秒

每秒3000個訪問量,響應時間1000毫秒

如果你按照這個思路去做系統設計,將會發生重大的錯誤。因爲當每秒3000個訪問量發生時,系統的響應時間可能不是1000毫秒,而可能直接導致系統崩潰,無法再處理任何的請求。最常見的場景就是當緩存系統失效時,導致的系統雪崩:

  • 當耗時低的緩存層出現故障時,流量直接打在了耗時高的數據庫層,用戶的等待時長就會增加
  • 等待時長的增加導致用戶更加頻繁去訪問,更多的流量會打在數據庫層
  • 這導致用戶的等待時長進一步增加,再次導致更頻繁訪問
  • 當訪問量達到一個極限值時,造成系統崩潰,無法再處理任何請求
  • 流量和響應時間絕不是簡單的疊加關係,當到達某個臨界值時,系統將直接崩潰。

3 黑天鵝與三體

歐洲人從來都認爲只有白天鵝,因爲他們從來只看到過白色的天鵝。

他們的這種想法有多堅定,那他們在澳大利亞發現黑色天鵝時,震撼就有多麼大。

這就是著名的黑天鵝事件的由來。黑天鵝事件指事前無法預知,一旦發生將具有巨大影響的不確定事件。

我們來分析一下歐洲人的白天鵝理論。他們採用的是歸納推理的方法,這也是科學實驗中常用的一種方法。

當他們沒有見到黑天鵝之前,認爲只存在白色天鵝是成立的。但當黑天鵝出現時,整個認知瞬間土崩瓦解。

一個更加值得關注的系統是混沌系統。這個系統最大的特點是,當一個微小的擾動發生時,會給整個系統帶來巨大的影響。典型混沌系統的體現就是蝴蝶效應和三體問題。

一隻蝴蝶揮動翅膀可以帶來一場颶風。

三個天體在相互的萬有引力作用下,運動軌跡無法預測,這也是劉慈欣《三體》三部曲的基礎設定。

處於混沌系統,不知道黑天鵝事件將在什麼時間,什麼地方,以什麼形式發生。

我們不知道7點鐘出發會被堵多久,不知道秒殺系統在開搶的瞬間會有多大的訪問量,不知道某大V在微博上公佈的消息會帶來多少激增的流量。

4 工程系統穩定性

我們來思考一個問題:怎樣保證一個工程系統的穩定性?有以下兩種做法:

  • 思路1:考慮到所有意外情況,針對每一個意外的異常情況分別處理
  • 思路2:接受無法預料到所有意外情況的現實,把兜底方案做好,保證即使出現極端情況,系統也不會崩潰

我們仔細分析思路1會發現這其實是一個悖論。

所謂意外情況就是意料之外的情況,無法預料的情況。如果被考慮到了,那麼也就不能稱之爲意外情況了。

塔勒布在經典著作《反脆弱》一直想告訴我們:黑天鵝事件是無法預測的,極端意外情況是無法預測的,尾部風險雖然概率小,但破壞力卻極大。

我們無法預測會發生什麼故障,以及什麼時候發生。但面對不確定性,我們不會束手就擒,至少可以把系統保護好。

5 高可用策略

爲了保證系統的穩定性和高可用性,我們需要採取一些策略。我認爲高可用核心策略一般包含:冗餘+自動故障轉移策略,降級策略,延時策略,隔離策略。高可用實際應用方案多種多樣,但一般都在實施上述策略,從而構建一個穩定的高可用工程系統。

5.1 冗餘 + 自動故障轉移策略

最基本的冗餘策略就是主從模式。原理是準備兩臺機器,部署了同一份代碼,在功能層面是相同的,都可以對外提供相同的服務。

一臺機器啓動提供服務,這就是主服務器。另一臺機器啓動在一旁待命,不提供服務,隨時監聽主服務器的狀態,這就是從服務器。當發現主服務器出現故障時,從服務器立刻替換主服務器,繼續爲用戶提供服務。
自動故障轉移策略是指當主系統發生異常時,應該可以自動探測到異常,並自動切換爲備用系統。不應該只依靠人工去切換成,否則故障處理時間會顯著增加。

5.2 降級策略

所謂降級策略,就是當系統遇到無法承受的壓力時,選擇暫時關閉一些非關鍵的功能,或者延時提供一些功能,把此刻所有的資源都提供給現在最關鍵的服務。

在秒殺場景中,下訂單就是最核心最關鍵的功能。

當系統壓力將要到達臨界值時,可以暫時先關閉一些非核心功能如查詢功能。

當秒殺活動結束後,再將暫時關閉的功能開啓。這樣既保證了秒殺活動的順利進行,也保護了系統沒有崩潰。

還有一種降級策略,當系統依賴的下游服務出現錯誤,甚至已經完全不可用了,那麼此時就不能再調用這個下游服務了,否則可能導致雪崩。所以直接返回兜底方案,把下游服務直接降級。

5.3 延時策略

用戶下訂單成功後就需要進行支付。

假設秒殺系統下訂單每秒訪問量是3000,我們來思考一個問題,有沒有必要將每秒3000次訪問量的壓力傳遞給支付服務器?

答案是沒有必要。

因爲用戶秒殺成功後可以稍晚付款,比如可以跳轉到一個支付頁面,提示用戶只要在10分鐘內支付完成即可。

這樣每秒3000次的訪問量就被分攤至幾分鐘,有效保護了系統。技術架構還可以使用消息隊列做一個緩衝,讓支付服務按照自己的能力去處理業務。

5.4 隔離策略

物理隔離:應用分別部署在不同物理機、不同機房,資源不會互相影響。

線程隔離:不同的請求進行分類,交給不同線程池處理,當一類請求出現高耗時和異常,不影響另一類請求訪問。

6 無所不備則無所不寡

《孫子兵法》虛實篇告訴我們一個道理:備前則後寡,備後則前寡,備左則右寡,備右則左寡,無所不備,則無所不寡。

力量集中在前,後面就空虛。力量集中在後,前面就空虛。力量集中在左,右面就空虛。力量集中在右,左面就空虛。如果力量分散在前後左右,那麼前後左右就都空虛。

不確定性分散在前後左右無法預測。我們不可能將精力分散在前後左右,但是技術人員至少可以做好一點:保護好系統。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章