今天老大跟我討論說,沒有看到過一篇夠全面體系的高可用的文章。談到高可用,基本都是以偏概全的文章。今晚抽空想了一下這個問題。
高可用我另一個更資深老大其實總結的很全面了:別人死我們不死,自己不作死,不被隊友搞死。
然后就是怎么別人死我們不死:最好就是別人的東西和我們沒關系,就是去依賴。如果實在有依賴呢,那就盡量弱依賴。弱依賴有需要被依賴方的返回結果和不依賴返回結果兩種。需要結果就要請求后回調,不需要就直接異步化。另外要做好超時和重試、蓄洪、限流、熔斷、降級。如果只能強依賴呢,人家死了,那就我們報錯,但是我們不死。這也需要設置合理超時和重試、蓄洪、限流、熔斷、降級。人家又復活了,我們也要立即恢復。
基於對依賴的策略總結如下:

依賴策略里涉及到容災的問題。容災需要解決兩個方面的問題:

這里就怎樣快速失敗和安全失敗舉一個例子。java.util包的容器的迭代器,在每次迭代的時候,其內部實現都會去判斷modCount變量是否為expectedModCount的值。是的話就繼續遍歷,否則就拋出異常,終止遍歷。這是一個快速失敗的典型例子。
而采用安全失敗機制的集合容器,在遍歷時不時直接在集合內容上訪問的,而是先復制原有集合內容,然后在拷貝的集合上進行遍歷。所以再遍歷過程中對元集合所作的修改並不能被迭代器檢測到,不會觸發異常。但是這時遍歷對原集合的修改是不感知的。
快速恢復有些策略。最簡單的比如心跳檢測、事件監聽等。
安全恢復一般主要是在恢復前對系統或數據先做一些檢查、數據還原等。
有依賴的時候要盡量弱化依賴,除了理清業務邏輯之外,技術手段上可以采用異步化和旁路來解決。
再考慮怎么自己不作死。自己不作死,就是要考慮兩個關鍵字:一個作,一個死。
作就是:改出問題?那就要不出問題:規范流程、做好測試、做好演練和壓測。不當小白鼠,只用成熟的技術。職責單一化。

死就是:要考慮單個接口掛了咋辦?單個接口掛了現場返回錯誤,同時不擴大影響,用其他服務補數據。單個節點掛了咋辦?用集群。一個機房掛了咋辦?多機房。一個地區的網斷了咋辦?多地區。后面幾個合起來叫做異地多活。

涉及到集群和跨區,就要考慮策略問題。

策略的問題非常難解決,所以業界做異地多活的非常少。拿阿里巴巴來說,他們的異地多活經歷了3個階段。

最后考慮怎么不被隊友搞死。
別人死我們不死和不被隊友搞死的區別在於,隊友和我們需要有明確的業務邊界,搞清楚哪些是我們負責的,然后就是保證別人死我們不死。

總結與思考:
一個失敗的leader是自己很牛,卻沒能帶出來牛人。
跑題時間:
炊煙
小時候總愛無故的停下來發呆。有時候是風,想感受風,風的聲音、風的力道、風的氣息,就這樣傻傻的呆站着半天,直到已經走了離我很遠的小玩伴們大聲在前面叫我。有時候是一座房子,總覺得夢里或者很久很久以前見到過、住過,好熟悉的感覺。而炊煙,是一種心境。裊裊升起的炊煙們,大家覺得自己在毫無規律的完成自己的宿命。而這宿命是由風、由引力、由相互間的碰撞、由爐灶中生的火勢,早早已經決定好。大規律是那么一致,各自的曲線又那么不同。努力的想掙脫自己的命運,卻又被命運狠狠的捉弄。不是心靜的人是看不懂炊煙的。
小巷
總是會被看上去神秘的小去處吸引,一條蜿蜒的小路、一片樹林,一扇斷牆,最逃不過的吸引力是古朴的小巷。總能感覺到他們蘊藏的故事和哀怨。每次想到自己在日本新宿時特別想進去的那條“思い出の町”,就想起給別人帶來的危險。當時是一群同事一起去的,我好想進去看看,但是被他們叫住,說不知道里面有什么,出了危險怎么辦,我只好作罷。然而想來從那以后我也從來沒斷過把自己置於危險的境地。我終究不會甘於歲月靜好,偏愛波瀾起伏的人生。這是命運,逃也逃不掉。
峽谷
現在看電影電視劇到底誰愛上了誰,終究與我無關,愛情之於我仿佛是桌面的落灰,遙遠而輕淺。我更關心的是里面的兄弟之情、親子之情,這些是更永恆純粹的。那年我回家小姨家,每天睡醒了就去峽谷里的小溪邊坐着,看着日光、山澗、青草、山花。后來弟弟給我寫信我才知道,這時候他總是在山上,遠遠的看着我的背影。記得他帶我尋訪住在山間的書法家,告訴我將來他也要歸隱過這樣的日子。跟別人,更多的是“欲訴無人能懂”,而血脈之間,無需言語,看到對方就找到了自己。
我喜歡的風景從來都不是特意去某個地方,而是做某件事情過程中的路過。中午出去買水果時伸手接住的雪花、出差到達的另一個國度、坐火車轉車干脆訂個酒店在附近看到的冰燈…… 也許有一天,你會陪我一起看彼此眼中的風景
