那些黑天鵝教會我們的IT知識

 

近日國際市場可謂黑天鵝事件不斷,先是由於石油輸出國組織OPEC與俄羅斯的減產談判未果,造成國際原油價格大跌40%,截止昨天甚至一度觸及19美元低位。而美國三大股指也在3月9日以來迎來數次暴跌,短短几天當中觸發了5次熔斷,這是美股幾十年來也未見到過的景象暴跌熔斷。

其實所謂的熔斷機制,簡單來說就是當股市跌到一定幅度之後,市場自動停止交易一段時間的保護機制。這樣做的主要目的就是,防範恐慌情緒進一步擴散,給市場帶來更大的衝擊。

融斷是在1987年的著名股災“黑色星期一”後,由美國監管機構所提出的。自提出後的三十多年來美股市場只有1997年10月27日,由於道瓊斯工業指數暴跌7.18%,而觸發過熔斷機制。

其實從更宏觀的角度上看,經濟系統與信息系統並不二致,很多道理都是相通的,從IT的角度理解所謂的熔斷機制,其實就是藍屏警報而已。筆者接下來就和大家聊一下我們能從那些經濟黑天鵝事件中學到什麼。

複雜系統的預測術

在複雜系統的發展趨勢的規律中,邊際效用定律應該是最爲重要的約束條件沒有之一。它的基本內容是,在一定時間內,在其他商品的消費數量保持不變的條件下,消費者從某種物品連續增加的每一消費單位中所得到的效用增量,即邊際效用是遞減的。

比如我們在單核CPU的時代只需要給CPU多加一個核心就可以使性能得到一倍的提升,但是在目前動轍十幾個核心的情況下,多加一個核心對於系統性能的提升就十分有限了,邊際效應的限制對於系統的影響與演進是非常明顯的。

而邊際效應對應的則是正反饋效應了,正反饋是指系統的輸出影響到輸入,造成輸出變動持續加大的情形。比如金融市場當中的各種槓桿類產品,在面對巨大跌幅時就會被強制爆倉,形成典型的正反饋現象。

也就是系統在向一個方向演化的過程中,其發展趨勢往往會受到邊際效應的限制而愈發的舉步爲堅,但是當系統發展到一定程度以後,向反方向演化的趨勢一旦開啓,往往就立刻形成正反饋現象,而迅速演進。而做爲一名系統架構師所要關注的點在於這種趨勢反轉的臨界點是否可以被預測,如果可以預測,那麼就應該在臨界時啓動如藍屏告警的保護機制,防止事態擴散。

不過從目前最新的研究結論來看複雜系統的臨界點很可能是不可預測的,也就是說危機的到來可能真的是隨機事件。比如當我們在沙灘上把沙子堆成一個金字塔形狀的沙堆時,就是在構建一個最簡單的複雜系統。爲此物理學家專門做過實驗,發現當沙堆中的沙子會自發地形成一個自組織系統,也就是說,當一粒新的沙子進入或者脫落之後,原來的沙子都會自動地調整位置,並趨於穩定。但是,隨着沙子繼續增加或者掉落並達到一個臨界值後,沙堆就會進入不穩定狀態。這個時候,沙堆隨時可能會發生塌方,但是具體何時塌方,對不起這完全是一個隨機事件,無法預測。當然用沙堆來類比經濟系統可能存在問題,不過筆者更加傾向於經濟危機無法被預測的觀點。

複雜系統的平衡術

讓我們假定臨界點的到來不可預知,那麼系統在運行過程中就只能在各項目標中尋求平衡了,而且這種平衡術也普遍存在於系統設計的原則當中,比如從微觀上看,分佈式系統需要在CAP三要素當中平衡,貨幣系統受到蒙代爾三角的制約,這些設計原則筆者在諸如《遠程辦公 4 大坑,坑坑“致命”!》等文中都有過詳細介紹,這裏不加贅述了。

而從宏觀上看,只要系統達到一定的複雜度,那麼系統設計者就必須在系統的健壯性、容錯性與連續性之間做出平衡。如果一味強調健壯性,那一旦系統發生錯誤,就很可能讓錯誤擴大化,釀成更大危機,而如果單純追求容錯性,那麼經常帶病上崗的系統,健壯性又不會太強。

比如我們人類就是韌性也就是容錯性特別強的物種,雖然在健壯性上不如恐龍等生物,不過在面臨到巨大災難時,人類就會比恐龍更容易逃過一劫,但是呢站在更高的角度上說人類統治整個地球的時間並不長,今後鹿死誰手未爲可知,我們容錯性最強是否就是最佳策略真的很難講。

再舉一個電競的例子,在DOTA比賽中到底是選擇以小娜迦爲核心的容錯體系,還是選擇拍拍熊爲核心的硬剛體系,其實就是在做這樣的平衡。以健壯性爲核心的硬剛體系容易被對手翻盤,甚至直接猝死;而容錯性爲核心的體系容易被對手積累優勢,最終慢性死亡。所謂一代版本一代強,最終的版本之子,往往都和設計者的初始目標並不一致,所以也可以看到現在基本主流的即時戰略和MOBA類遊戲廠商都會開立體驗服,以提前獲取遊戲平衡性調整的資料,僅靠紙上談兵幾乎無法預測實際情況。

所以看到沒,只有簡單系統才做取捨,複雜系統只能做平衡,十全十美的策略並不存在。

複雜系統的危機處理之道

要處理好複雜系統的危機,首先要了解異常與錯誤的類型

已知異常:最具代表的已知異常就是檢查性異常,一般是由用戶錯誤或問題引起的,例如要打開一個不存在文件或者一個不合法的交易員發起的交易時,檢查性異常就發生了,在實際生活中這種異常也很常見,比如我們現在乘坐飛機火車都需要查驗身份證件,對付這類異常都需要有對應的預案或者處理流程。對於系統整體來講,服務不應該因此類異常中斷。

重要錯誤:如堆棧溢出,磁盤IO錯誤等等,遇到此類錯誤到底是立即藍屏或者崩潰以防事態擴大。

未知錯誤:這種情況一般是程序存在的問題,未將系統所遇情況考慮完整,屬於BUG的範圍,但是未知異常和重要錯誤的界限往往模糊不清,出現後到底是讓程序繼續運行還是崩潰退出,其實就是健壯性與容錯性之間的抉擇。

而複雜系統的異常處理原則就是做好檢查性異常的處理流程,避免因爲小錯誤造成大影響;確定重要錯誤主要中斷服務,避免事態擴散;同時也要根據系統類型選擇對未知錯誤的處理方式。最後儘量提供類似於JAVA中Finally的兜底機制,以便保存好錯誤現場情況後續覆盤。

控制系統的複雜性

我們剛剛談內容有一個最大的前提,就是系統的複雜程度。而如果系統的複雜程度不高,那麼就不會有這麼多麻煩了。所以我們在實際生活中經常通過開闢新戰場,尋找新領域等方式,在新興增長點變得足夠複雜之前,對於進行方向掌握,這樣不斷尋找增量的方式,其背後也正是的控制系統複雜程度的道理。

而近些年IT界不斷興起的模塊解耦及微服務等理念,本質上也是在控制系統的複雜程度,但是我們了必須看到當新興的增長點融入整個經濟體系,微服務總體協同工作之後系統還是終究難逃複雜的命運,所以也只能擁抱複雜,擁抱不確定性,在各方之間做出平衡,纔是終極之道。

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