一、非線性
我們先來介紹一個概念:非線性。這個概念在我們的生活中無處不在。
你要趕早上8點鐘的火車,如果6:30出發可以在7:00到達車站,于是你得到一個結論:隻要30分鐘就可以到達車站。
你早上想睡晚一點預計7:10出發,想着7:40可以到達車站。但是最可能的結果是你将錯過這趟火車。因為正好遇上早高峰,堵車導緻你至少需要花費1個小時才能到達車站。
一個小雪球的重量是100克,打雪仗時你被砸中100次,這對你不會造成任何影響。
但是如果你被10公斤的雪球砸中1次,這可能會對你造成嚴重的傷害。
這就是非線性。事物不是簡單的疊加關系,當達到某個臨界值時,會造成一種完全截然不同的結果。
二、秒殺系統
我們來分析一個網際網路的秒殺場景。假設你設計的秒殺系統當每秒30個人通路時,響應時間是10毫秒。即從使用者點選按鈕至得到結果這個過程,隻花費了10毫秒。這個時間的流逝基本上察覺不到,性能是不錯的。你感覺很好,繼續設計:
每秒30個通路量,響應時間10毫秒
每秒300個通路量,響應時間100毫秒
每秒3000個通路量,響應時間1000毫秒
如果你按照這個思路去做系統設計,将會發生重大的錯誤。因為當每秒3000個通路量發生時,系統的響應時間可能不是1000毫秒,而可能直接導緻系統崩潰,無法再處理任何的請求。最常見的場景就是當緩存系統失效時,導緻的系統雪崩:
- 當耗時低的緩存層出現故障時,流量直接打在了耗時高的資料庫層,使用者的等待時長就會增加
- 等待時長的增加導緻使用者更加頻繁去通路,更多的流量會打在資料庫層
- 這導緻使用者的等待時長進一步增加,再次導緻更頻繁通路
- 當通路量達到一個極限值時,造成系統崩潰,無法再處理任何請求
流量和響應時間絕不是簡單的疊加關系,當到達某個臨界值時,系統将直接崩潰。
三、黑天鵝與三體
歐洲人從來都認為隻有白天鵝,因為他們從來隻看到過白色的天鵝。
他們的這種想法有多堅定,那他們在澳洲發現黑色天鵝時,震撼就有多麼大。
這就是著名的黑天鵝事件的由來。黑天鵝事件指事前無法預知,一旦發生将具有巨大影響的不确定事件。
我們來分析一下歐洲人的白天鵝理論。他們采用的是歸納推理的方法,這也是科學實驗中常用的一種方法。
當他們沒有見到黑天鵝之前,認為隻存在白色天鵝是成立的。但當黑天鵝出現時,整個認知瞬間土崩瓦解。
一個更加值得關注的系統是混沌系統。這個系統最大的特點是,當一個微小的擾動發生時,會給整個系統帶來巨大的影響。典型混沌系統的展現就是蝴蝶效應和三體問題。
一隻蝴蝶揮動翅膀可以帶來一場飓風。
三個天體在互相的萬有引力作用下,運動軌迹無法預測,這也是劉慈欣《三體》三部曲的基礎設定。
處于混沌系統,不知道黑天鵝事件将在什麼時間,什麼地方,以什麼形式發生。
我們不知道7點鐘出發會被堵多久,不知道秒殺系統在開搶的瞬間會有多大的通路量,不知道某大V在微網誌上公布的消息會帶來多少激增的流量。
四、工程系統穩定性
我們來思考一個問題:怎樣保證一個工程系統的穩定性?有以下兩種做法:
- 思路1:考慮到所有意外情況,針對每一個意外的異常情況分别處理
- 思路2:接受無法預料到所有意外情況的現實,把兜底方案做好,保證即使出現極端情況,系統也不會崩潰
我們仔細分析思路1會發現這其實是一個悖論。
所謂意外情況就是意料之外的情況,無法預料的情況。如果被考慮到了,那麼也就不能稱之為意外情況了。
塔勒布在經典著作《反脆弱》一直想告訴我們:黑天鵝事件是無法預測的,極端意外情況是無法預測的,尾部風險雖然機率小,但破壞力卻極大。
我們無法預測會發生什麼故障,以及什麼時候發生。但面對不确定性,我們不會束手就擒,至少可以把系統保護好。
五、高可用政策
為了保證系統的穩定性和高可用性,我們需要采取一些政策。我認為高可用核心政策一般包含:備援+自動故障轉移政策,降級政策,延時政策,隔離政策。高可用實際應用方案多種多樣,但一般都在實施上述政策,進而建構一個穩定的高可用工程系統。
5.1 備援 + 自動故障轉移政策
最基本的備援政策就是主從模式。原理是準備兩台機器,部署了同一份代碼,在功能層面是相同的,都可以對外提供相同的服務。
一台機器啟動提供服務,這就是主伺服器。另一台機器啟動在一旁待命,不提供服務,随時監聽主伺服器的狀态,這就是從伺服器。當發現主伺服器出現故障時,從伺服器立刻替換主伺服器,繼續為使用者提供服務。
自動故障轉移政策是指當主系統發生異常時,應該可以自動探測到異常,并自動切換為備用系統。不應該隻依靠人工去切換成,否則故障處理時間會顯著增加。
5.2 降級政策
所謂降級政策,就是當系統遇到無法承受的壓力時,選擇暫時關閉一些非關鍵的功能,或者延時提供一些功能,把此刻所有的資源都提供給現在最關鍵的服務。
在秒殺場景中,下訂單就是最核心最關鍵的功能。
當系統壓力将要到達臨界值時,可以暫時先關閉一些非核心功能如查詢功能。
當秒殺活動結束後,再将暫時關閉的功能開啟。這樣既保證了秒殺活動的順利進行,也保護了系統沒有崩潰。
還有一種降級政策,當系統依賴的下遊服務出現錯誤,甚至已經完全不可用了,那麼此時就不能再調用這個下遊服務了,否則可能導緻雪崩。是以直接傳回兜底方案,把下遊服務直接降級。
5.3 延時政策
使用者下訂單成功後就需要進行支付。
假設秒殺系統下訂單每秒通路量是3000,我們來思考一個問題,有沒有必要将每秒3000次通路量的壓力傳遞給支付伺服器?
答案是沒有必要。
因為使用者秒殺成功後可以稍晚付款,比如可以跳轉到一個支付頁面,提示使用者隻要在10分鐘内支付完成即可。
這樣每秒3000次的通路量就被分攤至幾分鐘,有效保護了系統。技術架構還可以使用消息隊列做一個緩沖,讓支付服務按照自己的能力去處理業務。
5.4 隔離政策
實體隔離:應用分别部署在不同實體機、不同機房,資源不會互相影響。
線程隔離:不同的請求進行分類,交給不同線程池處理,當一類請求出現高耗時和異常,不影響另一類請求通路。
六、無所不備則無所不寡
《孫子兵法》虛實篇告訴我們一個道理:備前則後寡,備後則前寡,備左則右寡,備右則左寡,無所不備,則無所不寡。
力量集中在前,後面就空虛。力量集中在後,前面就空虛。力量集中在左,右面就空虛。力量集中在右,左面就空虛。如果力量分散在前後左右,那麼前後左右就都空虛。
不确定性分散在前後左右無法預測。我們不可能将精力分散在前後左右,但是技術人員至少可以做好一點:保護好系統。
作者:JAVA前線
連結:https://juejin.cn/post/7213744681419030583
來源:稀土掘金