商家域穩(wěn)定性建設(shè)之原理探索
一、穩(wěn)定性及其意義
1.什么是穩(wěn)定性?
2.為什么要進(jìn)行穩(wěn)定性建設(shè)?
3.穩(wěn)定性建設(shè)究竟要建什么?
二、穩(wěn)定性建設(shè)面臨什么困難?
1.穩(wěn)定性建設(shè)缺少立竿見影的短期價(jià)值
2.穩(wěn)定性建設(shè)存在極大的復(fù)雜性和風(fēng)險(xiǎn)
三、如何進(jìn)行穩(wěn)定性建設(shè)?
1. 建立穩(wěn)定性共識
2.明確穩(wěn)定性建設(shè)目標(biāo)
3.落地穩(wěn)定性建設(shè)任務(wù)
4.穩(wěn)定性建設(shè)的困難是否都被解決了?
四、穩(wěn)定性建設(shè)全景圖
一、穩(wěn)定性及其意義
什么是穩(wěn)定性?
我們先來探討一個(gè)核心概念:穩(wěn)定性 。想象一下,一個(gè)系統(tǒng)、一個(gè)物體或一個(gè)過程在受到外部干擾或內(nèi)部變化時(shí),能否如一面堅(jiān)實(shí)的墻壁,屹立不倒?在信息系統(tǒng)的世界里,穩(wěn)定性的定義就如同這面的墻壁,它確保在各種干擾面前,我們服務(wù)依舊保持可用。
然而,盡管這個(gè)定義聽上去很清晰,若要用它來推動我們的穩(wěn)定性建設(shè),卻顯得有些模糊。因此,我們需要深入探討如何將這一概念轉(zhuǎn)化為切實(shí)可行的方法論。
我們將方法論定義為影響結(jié)果的公式,并為穩(wěn)定性寫下了如下公式:
穩(wěn)定性 = 全局風(fēng)險(xiǎn)可見性 * 風(fēng)險(xiǎn)轉(zhuǎn)化概率 * 故障可感知 * 預(yù)案可靠性
但隨著實(shí)踐經(jīng)驗(yàn)的增長,再對上述公式因子進(jìn)行正交分析后,我發(fā)現(xiàn)穩(wěn)定性其實(shí)可以簡化為:
穩(wěn)定性 = 系統(tǒng)風(fēng)險(xiǎn)(概率) * 風(fēng)險(xiǎn)應(yīng)對能力
我們進(jìn)一步拆分這一關(guān)系:
系統(tǒng)風(fēng)險(xiǎn)(概率) = 固有風(fēng)險(xiǎn)(概率) + 變更風(fēng)險(xiǎn)(概率)
其中固有風(fēng)險(xiǎn)對應(yīng)穩(wěn)定性概念的內(nèi)部變化,工程上可以定義為網(wǎng)絡(luò)、服務(wù)器等運(yùn)行環(huán)境變化。而變更風(fēng)險(xiǎn),則是包括發(fā)布、配置變更在內(nèi)的,由人為發(fā)起的系統(tǒng)變化。一般固有風(fēng)險(xiǎn)會由運(yùn)維團(tuán)隊(duì)進(jìn)行關(guān)注,因此我們主要展開變更風(fēng)險(xiǎn):
變更風(fēng)險(xiǎn) = 變更頻率 * 變更復(fù)雜度 * 變更爆炸半徑
其中:
變更頻率:代表變更的發(fā)生次數(shù),它一般和業(yè)務(wù)的需求有關(guān)。
變更復(fù)雜度:這不僅限于代碼的可理解性和可修改性,還包括配置的復(fù)雜性。一般來說,復(fù)雜度越高,單次變更出問題的概率也越大。
變更爆炸半徑:表示發(fā)生問題后的影響面,直接影響實(shí)際的損失。這個(gè)爆炸半徑也有很多的衡量因子,如QPS、場景重要性、強(qiáng)弱依賴關(guān)系等等。
接下來我們對風(fēng)險(xiǎn)處理能力進(jìn)行展開:
風(fēng)險(xiǎn)處理能力 = 風(fēng)險(xiǎn)前置發(fā)現(xiàn)概率 * 前置風(fēng)險(xiǎn)處理 * 后置風(fēng)險(xiǎn)發(fā)現(xiàn)時(shí)長 * 應(yīng)急效果
其中,風(fēng)險(xiǎn)前置發(fā)現(xiàn)可以定義為在測試階段發(fā)現(xiàn)問題的場景,由于線下的風(fēng)險(xiǎn)總會有手段可以處理,因此前置風(fēng)險(xiǎn)處理并不會成為瓶頸;后置風(fēng)險(xiǎn)則可定義為上線之后暴露的問題,由于生產(chǎn)問題總會暴露,其關(guān)鍵影響點(diǎn)為發(fā)現(xiàn)時(shí)長,以及完成應(yīng)急后最終的影響面,即應(yīng)急效果。
如果認(rèn)可這些穩(wěn)定性公式的拆解推導(dǎo)步驟,我們最終可以將穩(wěn)定性拉成一個(gè)龐大的公式:
穩(wěn)定性 =(固有風(fēng)險(xiǎn) + 變更頻率 * 變更復(fù)雜度 * 變更爆炸半徑)
*(風(fēng)險(xiǎn)前置發(fā)現(xiàn)概率 * 前置風(fēng)險(xiǎn)處理)*(后置風(fēng)險(xiǎn)發(fā)現(xiàn)時(shí)長 * 應(yīng)急效果)
而這個(gè)公式,涵蓋了影響穩(wěn)定性的一系列關(guān)鍵因素,這些關(guān)鍵因素,也將為后續(xù)的穩(wěn)定性建設(shè)定下基礎(chǔ)。
為什么要進(jìn)行穩(wěn)定性建設(shè)?
在進(jìn)行如何建設(shè)穩(wěn)定性的探討之前。我們先來討論一個(gè)問題:為什么我們?nèi)绱酥匾暦€(wěn)定性?這可以從兩個(gè)重要方面來理解:
1.失去穩(wěn)定性的損失 :
- 直接經(jīng)濟(jì)與業(yè)務(wù)損失 :想象一下,系統(tǒng)故障導(dǎo)致下單鏈路出現(xiàn)異常,訂單急劇下降;營銷邏輯錯誤,導(dǎo)致優(yōu)惠券被濫發(fā),直接造成公司的資損。
- 信任度與隱形資產(chǎn)損失 :故障不可用或大規(guī)模的技術(shù)問題可能引發(fā)輿論危機(jī),給品牌形象帶來巨大損害。尤其對云服務(wù)廠商而言,穩(wěn)定性故障更可能導(dǎo)致客戶的大量流失。
2.具備穩(wěn)定性的好處 :
- 提高業(yè)務(wù)迭代效率,使得團(tuán)隊(duì)能迅速應(yīng)對市場變化。
- 節(jié)約值班等額外的投入,減少資源浪費(fèi)。
此時(shí),大家一定會疑惑,穩(wěn)定性差的損失容易理解,但良好穩(wěn)定性與業(yè)務(wù)迭代的高效又有何關(guān)系呢?回到我們的變更風(fēng)險(xiǎn)公式,你會發(fā)現(xiàn),變更復(fù)雜度與業(yè)務(wù)迭代效率之間存在著顯著的負(fù)相關(guān)關(guān)系,容易的變更交付的快,復(fù)雜的變更交付的慢,這很好理解。因此:良好的穩(wěn)定性 -> 低變更風(fēng)險(xiǎn) -> 低變更復(fù)雜度 -> 高迭代效率,形成了一個(gè)合理的邏輯鏈。
穩(wěn)定性建設(shè)究竟要建什么?
在推導(dǎo)出穩(wěn)定性公式之前,這個(gè)命題簡直寬泛地讓人無從下手。但推導(dǎo)出公式之后,所有的關(guān)鍵點(diǎn)都已經(jīng)成竹在胸!(這也是方法論的魅力所在)
1.1中,我們已經(jīng)給出了穩(wěn)定性的公式,并標(biāo)紅了關(guān)鍵因子。當(dāng)我們應(yīng)用上這個(gè)方法論時(shí),問題就變得清晰起來:穩(wěn)定性建設(shè)的目標(biāo)應(yīng)該聚焦于之前提及的關(guān)鍵因素,借此我們可以制定出實(shí)用的治理項(xiàng)如下:
當(dāng)然,每個(gè)治理項(xiàng)都能進(jìn)一步拆分成若干舉措。由于每個(gè)團(tuán)隊(duì)、每個(gè)應(yīng)用的生命周期階段不同、實(shí)際特性不同,因此各團(tuán)隊(duì)在需要重點(diǎn)治理的方向和舉措上均有所不同。但總歸跳不出這個(gè)框架。
二、穩(wěn)定性建設(shè)面臨什么困難?
穩(wěn)定性建設(shè)在當(dāng)今技術(shù)驅(qū)動的時(shí)代至關(guān)重要,但它常常被視為“重要但不緊急”的任務(wù),導(dǎo)致在排期過程中得不到必要的優(yōu)先級支持。許多時(shí)候,團(tuán)隊(duì)甚至不得不依賴于故障的驅(qū)動才能艱難推進(jìn)穩(wěn)定性建設(shè)。這一現(xiàn)象的根源,可以歸結(jié)為以下幾個(gè)方面。
穩(wěn)定性建設(shè)缺少立竿見影的短期價(jià)值
其一:量化價(jià)值不明確,收益評估困難
我們可以從上文提到的穩(wěn)定性公式中找到一些線索,尤其是兩個(gè)非常重要的因子:變更復(fù)雜度和風(fēng)險(xiǎn)前置發(fā)現(xiàn)概率。變更復(fù)雜度實(shí)際上對應(yīng)的是研發(fā)引入的單次變更中攜帶風(fēng)險(xiǎn)的概率,而風(fēng)險(xiǎn)前置發(fā)現(xiàn)概率是經(jīng)過研發(fā)和測試團(tuán)隊(duì)的努力后,變更風(fēng)險(xiǎn)仍被遺漏到生產(chǎn)環(huán)境中的可能性。
正是因?yàn)樵诜€(wěn)定性的衡量公式計(jì)算中,帶入了這2個(gè)概率因子,穩(wěn)定性建設(shè)的量化價(jià)值的不確定性就顯而易見了。概率常常需要經(jīng)過大量的樣本統(tǒng)計(jì)才能形成有效的量化指標(biāo),但在實(shí)操時(shí)聚焦到某個(gè)團(tuán)隊(duì)、某個(gè)應(yīng)用或某個(gè)具體的治理需求中時(shí),它提升的概率影響往往不足以成為一個(gè)可以衡量的量化指標(biāo)。甚至運(yùn)氣不好的時(shí)候,可能會出現(xiàn)治理越多故障越多的離譜事件。
其二:業(yè)務(wù)壓力重,穩(wěn)定性任務(wù)排不上優(yōu)先級
我們不妨再回到穩(wěn)定性的關(guān)鍵因子,尤其是變更頻率這個(gè)有意思的指標(biāo)。我們很容易通過公式推導(dǎo)得出:變更頻率越高的功能,其穩(wěn)定性治理的收益也越大。然而,正如你所想的,這類功能往往是在業(yè)務(wù)高速發(fā)展時(shí)誕生的,此時(shí)需求繁多且時(shí)間緊迫,在這樣的情況下,穩(wěn)定性治理的優(yōu)先級與業(yè)務(wù)的迭代需求相較,無疑排不上號。
而當(dāng)業(yè)務(wù)進(jìn)入穩(wěn)定期,變更頻率下降,終于有時(shí)間投入穩(wěn)定性治理了,但變更頻率的下降又同樣帶來了穩(wěn)定性風(fēng)險(xiǎn)的減小,治理優(yōu)先級隨之降低。此時(shí)的穩(wěn)定性治理就變成了“食之無味,棄之可惜”的雞肋工程,仍舊排不上優(yōu)先級。
穩(wěn)定性建設(shè)存在極大的復(fù)雜性和風(fēng)險(xiǎn)
與上文所述的不確定收益相對的,卻是穩(wěn)定性建設(shè)確定性的復(fù)雜度和風(fēng)險(xiǎn)。無論是風(fēng)險(xiǎn)識別、風(fēng)險(xiǎn)治理,還是風(fēng)險(xiǎn)預(yù)防,均需要投入大量的精力。
存量風(fēng)險(xiǎn)識別的難度
在解決問題的第一步中,發(fā)現(xiàn)問題是重中之重。穩(wěn)定性建設(shè)的第一步同樣是識別其中的穩(wěn)定性問題。但問題是,我們該如何發(fā)現(xiàn)這些問題呢?依靠故障或者TS工單嗎?這種方式確實(shí)可以幫助我們發(fā)現(xiàn)問題,并在后續(xù)解決問題。但這種亡羊補(bǔ)牢的操作,對于穩(wěn)定性的建設(shè)而言,實(shí)在是太過滯后,根本達(dá)不到預(yù)期的效果。
為了有效地防范問題發(fā)生,我們需要從整體上排除風(fēng)險(xiǎn)——它大到一個(gè)域,幾十個(gè)應(yīng)用,成千上萬條調(diào)用鏈路;小到一個(gè)git倉庫,數(shù)萬甚至數(shù)十萬代碼——要準(zhǔn)確評估整個(gè)域的穩(wěn)定性并識別其中的風(fēng)險(xiǎn),這無疑是一項(xiàng)巨大的挑戰(zhàn)。
風(fēng)險(xiǎn)治理的難度
風(fēng)險(xiǎn)識別已經(jīng)足夠困難,風(fēng)險(xiǎn)治理的復(fù)雜性同樣不容忽視。雖然理論上,技術(shù)同學(xué)從不畏懼已知問題,但不同問題背后的復(fù)雜性,也往往會帶來不同的治理難度。
首當(dāng)其沖的自然是技術(shù)同學(xué)最頭疼的排期問題,“世上無難事,只要有排期”。但正如2.1中提到的,穩(wěn)定性建設(shè)由于價(jià)值的不確定性,往往難以取得足夠的排期。即便是再高瞻遠(yuǎn)矚的管理者,也不得不嚴(yán)格控制技術(shù)投入的占比,將更多的資源用于服務(wù)業(yè)務(wù),創(chuàng)造更多的增長。
其次,穩(wěn)定性治理本身帶來的變更風(fēng)險(xiǎn)也不容小覷。這里貼上技術(shù)人員非常喜歡的一張圖,來貼切地表示這個(gè)難題。
上圖的這個(gè)房屋,毫無疑問是個(gè)風(fēng)吹就塌的危房。但誰又真敢動手對這樣的危房進(jìn)行穩(wěn)定性治理呢?如果就是個(gè)普通房屋,推倒重建就完了,但業(yè)務(wù)系統(tǒng)可無法停機(jī)。在這種情況下進(jìn)行代碼改動,就如同需要持續(xù)地挪動木頭、泥土和石塊,試圖將其替換為堅(jiān)固的建筑材料,卻很可能無意中移走某個(gè)重要支撐,導(dǎo)致整個(gè)系統(tǒng)崩潰。
這在穩(wěn)定性建設(shè)中是不可接受的。為了預(yù)防可能發(fā)生的故障,反而引入了變更故障,這實(shí)屬本末倒置。
至于另外一種治理方案……新建一個(gè)系統(tǒng),然后把流量切過去。如果面對類似圖片這種治理難度地獄級的項(xiàng)目,確實(shí)是個(gè)最佳選擇,并且該方法也確實(shí)大量應(yīng)用在架構(gòu)治理上(如服務(wù)拆分)。但大部分應(yīng)用,使用該方案又著實(shí)奢侈了。疊加上文提及的排期問題,也限制了這種方案成為穩(wěn)定性治理銀彈的可能性。
如果繼續(xù)深入探討變更風(fēng)險(xiǎn)的問題,我們必然會碰到“代碼債務(wù)”的概念。每一位技術(shù)開發(fā)者都對代碼債務(wù)耳熟能詳,深有感觸。它通常定義為低代碼質(zhì)量和不合理架構(gòu)設(shè)計(jì)等一系列技術(shù)負(fù)擔(dān),而這些問題并非立刻顯現(xiàn)出危害。一個(gè)重的代碼債務(wù),只要在生產(chǎn)環(huán)境中能夠正常運(yùn)行,就意味著它是能被接受的。即如圖中的房子再怎么危房,沒塌之前,住人防風(fēng)擋雨都是沒問題的。
然而,代碼債務(wù)阻礙了變更,無論是業(yè)務(wù)的迭代還是技術(shù)的治理,都會提升變更的風(fēng)險(xiǎn)。因此,最后的風(fēng)險(xiǎn)治理難度來到了穩(wěn)定性風(fēng)險(xiǎn)因子中的變更復(fù)雜度問題。
命名為變更復(fù)雜度,而非代碼復(fù)雜度這種客觀描述,也是意味著變更難度是包含主觀含義,是因人而異的。例如某個(gè)應(yīng)用由一位同學(xué)貫穿始終地維護(hù),代碼再復(fù)雜,變更復(fù)雜度也高不到哪里去。因?yàn)檫@份代碼從始至終,都是由同一個(gè)人,以他的思維框架,解讀業(yè)務(wù)鏈路后,再抽象建設(shè)而成的,這份代碼從頭到腳都是這位同學(xué)的形狀。他知道這些代碼從何而來,又應(yīng)當(dāng)往哪里去。但實(shí)際生產(chǎn)過程中,一個(gè)應(yīng)用往往要經(jīng)歷多人維護(hù),就必然出現(xiàn)信息傳遞的損失。最終,我們在面對這種代碼時(shí),大概率會遇到理解困難以及對變更后果的無能為力。因此,變更復(fù)雜度的本質(zhì),是由不同人員的思維方式、設(shè)計(jì)理念、編碼習(xí)慣,以及業(yè)務(wù)知識在傳遞過程中的信息偏差交織在一起,構(gòu)成的一種現(xiàn)象。
至此,排期、變更復(fù)雜度、變更風(fēng)險(xiǎn)三者,構(gòu)成了整個(gè)穩(wěn)定性風(fēng)險(xiǎn)治理的難度。
增量風(fēng)險(xiǎn)預(yù)防的難度
在此前的討論中,我們已經(jīng)探討了存量風(fēng)險(xiǎn)的識別和治理。而本節(jié)將重點(diǎn)關(guān)注每次變更引入的增量風(fēng)險(xiǎn)。這是一個(gè)不可忽視的領(lǐng)域,因?yàn)轱L(fēng)險(xiǎn)的根源在于變更,而變更又是業(yè)務(wù)發(fā)展的必然過程。那么,如何有效控制這些因變更而來的風(fēng)險(xiǎn)呢?
變更可見性
首先,最重要的是確保變更的可見性和可感知性 。這里所說的可見性,不僅僅是變更執(zhí)行者本人的知曉,更是整個(gè)團(tuán)隊(duì)乃至所有相關(guān)方共同的認(rèn)知。畢竟,執(zhí)行變更的同事自然會清楚自己做了什么,但真正的問題在于,執(zhí)行變更的同事是否知道這些變更意味著什么,這個(gè)認(rèn)知和其他相關(guān)人員——比如PM和測試人員——是否是一致的?
這就是為什么變更可見性如此重要。做過業(yè)務(wù)負(fù)責(zé)人的都知道,最擔(dān)心的事情就是業(yè)務(wù)/產(chǎn)品和技術(shù)說要改個(gè)什么一句話功能,或者是刷數(shù)等操作,技術(shù)同學(xué)順手就給做了;因?yàn)楣δ茳c(diǎn)太小,甚至都沒通知測試和PM,直接自測完就上線了,真就映著一句話:天知地知,你知我知。但這個(gè)卻是風(fēng)險(xiǎn)最高的行為,因?yàn)闆]有任何人幫助變更同學(xué)進(jìn)行二次確認(rèn),不出問題都是僥幸。
那么難點(diǎn)來了,對一個(gè)域少則幾十,多則數(shù)百的同學(xué),每個(gè)迭代也是幾十個(gè)需求,上百種不同類型的變更,怎么保證每個(gè)微小的變更,都能讓變更的所有相關(guān)方都感知到,并且進(jìn)行有效的二次確認(rèn)呢?
方案可控性
在確認(rèn)了變更共識后,下一步便是對變更方案本身進(jìn)行評估,從而確保每項(xiàng)調(diào)整都符合預(yù)期。但此時(shí),又出現(xiàn)了一個(gè)障礙:如何保證這個(gè)變更是符合預(yù)期的呢?
對于一項(xiàng)代碼的變更,它不僅會對這行代碼的所有上游場景產(chǎn)生影響,更會影響所有使用到這行代碼結(jié)果的下游場景。若是數(shù)據(jù)的變更,更是牽一發(fā)而動全身,所有讀取和寫入到這行數(shù)據(jù)的場景都要受到影響。由于整體鏈路的復(fù)雜性和不可控性,對于變更方案的風(fēng)險(xiǎn)可控性評估就顯得異常困難。
人員可靠性
最后,涉及到的還有變更執(zhí)行人員本身的可靠性 ,人是同時(shí)具備高上限和低下限的特性的。即便是一個(gè)優(yōu)秀的同學(xué),即有高瞻遠(yuǎn)矚,防范未然的時(shí)候;也有馬失前蹄,被"!"和“NullPointException”搞得焦頭爛額的時(shí)候。
那么怎樣在各種各樣的變更中,去保障人員的下限,不要讓這種人員的波動性影響到系統(tǒng)的穩(wěn)定性;甚至盡可能讓人員保持他們的高上限,將更多的穩(wěn)定性風(fēng)險(xiǎn)扼殺在搖籃之中?這便是穩(wěn)定性建設(shè)中最后一個(gè)需要重點(diǎn)考慮的問題。
三、如何進(jìn)行穩(wěn)定性建設(shè)?
經(jīng)過前面的鋪墊,我們已經(jīng)明確了穩(wěn)定性建設(shè)的重要性,以及在實(shí)施過程中面臨的種種挑戰(zhàn)。那么,問題的關(guān)鍵就在于如何克服這些困難,順利進(jìn)行穩(wěn)定性的建設(shè)。實(shí)際操作中,很多治理建設(shè)的思路和策略都已經(jīng)隱含在前文的分析中,現(xiàn)在我們只需將它們整合提煉出來。
建立穩(wěn)定性共識
從上文知,困難中排在第一點(diǎn)的,即是穩(wěn)定性治理的優(yōu)先級和的資源排期問題。因此,在解決穩(wěn)定性建設(shè)的客觀困難之前,首先需要業(yè)務(wù)團(tuán)隊(duì)內(nèi)部從主觀層面建立對穩(wěn)定性的一致認(rèn)知:即業(yè)務(wù)團(tuán)隊(duì)需要針對本團(tuán)隊(duì)業(yè)務(wù)的重要性、發(fā)展階段、風(fēng)險(xiǎn)情況進(jìn)行綜合評估,確定好穩(wěn)定性建設(shè)在本團(tuán)隊(duì)中的重要程度。
直白點(diǎn)說,這個(gè)共識就是業(yè)務(wù)團(tuán)隊(duì)確定好穩(wěn)定性建設(shè)將在團(tuán)隊(duì)總投入中的時(shí)間占比。
這個(gè)占比可以在迭代維度進(jìn)行波動,但周期拉長到季度、年維度的時(shí)候,是需要保持在一個(gè)符合預(yù)期的比例的。它可以是5%或者更低,也可以是10%甚至更高,具體的數(shù)值需要和團(tuán)隊(duì)目前的業(yè)務(wù)和技術(shù)現(xiàn)狀相匹配。
明確穩(wěn)定性建設(shè)目標(biāo)
當(dāng)確定了資源比例后,接下來就是明確具體的目標(biāo)。在此過程中,我們需制定可執(zhí)行的方案,將大方向細(xì)化為明確的階段目標(biāo)。
回到1.3腦圖中提供的三個(gè)大方向:
- 風(fēng)險(xiǎn)前置發(fā)現(xiàn) :側(cè)重于人和流程的管理;
- 變更風(fēng)險(xiǎn)控制 :關(guān)注系統(tǒng)性架構(gòu)建設(shè);
- 風(fēng)險(xiǎn)后置處理 :著眼于應(yīng)急響應(yīng),同時(shí)關(guān)注人的應(yīng)急流程和系統(tǒng)的預(yù)案建設(shè);
因此,歸根結(jié)底,穩(wěn)定性的目標(biāo)收斂成是練人、建系統(tǒng)兩種。我們通常建議先從練人中的強(qiáng)化意識和流程入手,再優(yōu)化系統(tǒng),最后持續(xù)性地提高人員的綜合能力。
這是因?yàn)榧訌?qiáng)團(tuán)隊(duì)意識和規(guī)范團(tuán)隊(duì)流程的投入相對較低,通過制定規(guī)范、流程,進(jìn)行宣導(dǎo)培訓(xùn)甚至考試等形式,不需要投入過多資源就能取得良好效果。這種意識的培養(yǎng),雖然不會立即影響故障率,但有助于營造穩(wěn)定性的文化氛圍,為長期的治理打下基礎(chǔ)。其次,在這一過程中,無需直接修改代碼,在初期可以盡量避免“越治理越故障”的困境。最后,加強(qiáng)團(tuán)隊(duì)意識和規(guī)范團(tuán)隊(duì)流程,有助于后續(xù)保護(hù)好穩(wěn)定性治理結(jié)果。避免一邊堵漏,一邊挖坑的迷惑行為。
需要注意的是,穩(wěn)定性建設(shè)是一個(gè)動態(tài)變化的過程。隨著時(shí)間的推移,人可能會逐漸懈怠,系統(tǒng)架構(gòu)也可能因?yàn)闃I(yè)務(wù)迭代而腐化。因此,穩(wěn)定性建設(shè)必須是一個(gè)周期性的工作,并且建議每一個(gè)季度都專注于1-2項(xiàng)關(guān)鍵點(diǎn),使得整個(gè)系統(tǒng)的穩(wěn)定性可以在螺旋中上升。
落地穩(wěn)定性建設(shè)任務(wù)
為了有效實(shí)施穩(wěn)定性建設(shè),我們將其任務(wù)進(jìn)一步細(xì)分為五個(gè)核心部分:意識培養(yǎng)、 安全生產(chǎn)規(guī)范、應(yīng)急響應(yīng)、日常巡檢和架構(gòu)治理 。接下來,我們將逐一闡述這五個(gè)部分的重要性及其具體實(shí)現(xiàn)方案,并表述清楚這些部分應(yīng)對的是上述的那些困難點(diǎn)。
意識培養(yǎng)
意識培養(yǎng)是提升團(tuán)隊(duì)成員在穩(wěn)定性建設(shè)中能動性的關(guān)鍵環(huán)節(jié)。它主要涵蓋三個(gè)方面:認(rèn)知、意愿和能力。換句話說,我們要弄清楚團(tuán)隊(duì)成員對于穩(wěn)定性的認(rèn)知程度、愿意投入的程度以及他們的能力如何。
認(rèn)知 :團(tuán)隊(duì)成員是否充分了解穩(wěn)定性的重要性。
針對這一點(diǎn),我們可以定期舉辦“謹(jǐn)慎編碼”宣講,以提高大家的意識。雖然這看似簡單,但不可忽視。因?yàn)槿绻L期不提及穩(wěn)定性,其重要性就會在潛意識中隨時(shí)間弱化。
意愿 :團(tuán)隊(duì)成員是否愿意花費(fèi)時(shí)間和精力去評估并解決穩(wěn)定性風(fēng)險(xiǎn)。
評估穩(wěn)定性風(fēng)險(xiǎn)往往需要深入細(xì)致的工作,還需要克服習(xí)慣、自信、僥幸、嫌麻煩等心理障礙。為了提升意愿度,可從獎、懲兩方面入手。如可以通過設(shè)置穩(wěn)定性紅線或進(jìn)行故障復(fù)盤來進(jìn)行必要的懲罰,同時(shí)引入激勵機(jī)制,比如對表現(xiàn)突出的團(tuán)隊(duì)成員進(jìn)行表彰或績效激勵。此外權(quán)責(zé)到人也是激發(fā)意愿的手段之一,當(dāng)同學(xué)有了固定負(fù)責(zé)的應(yīng)用,并有權(quán)限進(jìn)行完全控制時(shí),會更愿意吃透其業(yè)務(wù),保證其代碼整潔和穩(wěn)定。
能力 :團(tuán)隊(duì)成員能否識別風(fēng)險(xiǎn),并設(shè)計(jì)有效的解決方案。
這塊可提升點(diǎn)就很多了:如一是案例分享可以擴(kuò)展同學(xué)眼界,通過舉一反三可以避免同類問題的發(fā)生;二是沉淀組內(nèi)/域內(nèi)的穩(wěn)定性知識庫,將團(tuán)隊(duì)的能力沉淀下來,將團(tuán)隊(duì)的智慧變成個(gè)人的智慧,提高同學(xué)能力上限;三是尋求組內(nèi)同學(xué)的幫助也是一種方法,這適合于發(fā)現(xiàn)了問題后,在設(shè)計(jì)方案時(shí)進(jìn)行組內(nèi)交流,查缺補(bǔ)漏,共同設(shè)計(jì)完備的解決方案。
當(dāng)然,意識培養(yǎng),或者說人的培養(yǎng),同樣是一個(gè)龐大復(fù)雜的體系,這里僅針對三個(gè)關(guān)鍵因素進(jìn)行粗淺的解讀,更多內(nèi)容可以關(guān)注一些專業(yè)書籍。
安全生產(chǎn)規(guī)范
安全生產(chǎn)規(guī)范,我們定義為為了保證變更風(fēng)險(xiǎn)可控而制定的一系列流程規(guī)范。但很多人對于這些流程規(guī)范可能不以為然,認(rèn)為繁瑣的過程除了降低效率外并沒有什么實(shí)際的益處。但其實(shí),這些環(huán)節(jié)的存在是對變更方案及其風(fēng)險(xiǎn)進(jìn)行二次確認(rèn)的重要保障。
在一個(gè)典型的需求變更流程中,一般會有需求評審、技術(shù)方案評審、用例評審、自測/測試環(huán)節(jié)、CR、驗(yàn)收等多個(gè)環(huán)節(jié)。為什么需要有這么多環(huán)節(jié)呢?
- 需求評審:針對業(yè)務(wù)變化帶來的功能變化,在產(chǎn)品、研發(fā)、測試之間達(dá)成一致,進(jìn)行多方確認(rèn)。
- 技術(shù)方案評審:針對功能變化對應(yīng)的技術(shù)變化,在產(chǎn)品、研發(fā)、測試之間達(dá)成一致,進(jìn)行多方確認(rèn)。
- 用例評審:針對功能變化/技術(shù)變化帶來的用例變化,在產(chǎn)品、研發(fā)、測試之間達(dá)成一致,進(jìn)行多方確認(rèn)。
- 自測/測試環(huán)節(jié):針對技術(shù)變化的正確性和完備性,在研發(fā)、測試之間達(dá)成一致,進(jìn)行二次確認(rèn)。
- CR:針對技術(shù)變化對應(yīng)的代碼變化,在研發(fā)團(tuán)隊(duì)內(nèi)部進(jìn)行風(fēng)險(xiǎn)確認(rèn),屬于二次確認(rèn)。
- 驗(yàn)收:針對功能變化的最終效果,在產(chǎn)品、研發(fā)、測試之間達(dá)成一致,屬于多方確認(rèn)。
可以看到,通過這些環(huán)節(jié),變更的可見性將得以顯著提升:幾乎所有的相關(guān)方,都能夠準(zhǔn)確知道變更內(nèi)容、變更方案和變更時(shí)間,并共同確認(rèn)過變更風(fēng)險(xiǎn)。正因?yàn)檫@些環(huán)節(jié)在現(xiàn)有的需求流程中多半能夠充分落實(shí),因此需求變更帶來風(fēng)險(xiǎn)的概率是相對較低的。
與需求變更的多方確認(rèn)相反的是,技改需求、curl、數(shù)據(jù)訂正、Ark變更等操作,在技術(shù)部多次管控加碼之前,這些變更操作發(fā)生問題的概率遠(yuǎn)高于需求變更。其原因正是由于這些變更可能就是某個(gè)研發(fā)順手操作了,其可見范圍極小。根本沒有相關(guān)方進(jìn)行多輪有效的二次確認(rèn)操作,容易出問題也就不足為奇了。其他類似的案例還有業(yè)務(wù)方突然執(zhí)行了大量的業(yè)務(wù)變更操作,突然進(jìn)行了某項(xiàng)營銷活動導(dǎo)致引入遠(yuǎn)超預(yù)期的流量等等,這同樣也是由于變更的可見性并未被技術(shù)團(tuán)隊(duì)感知,而導(dǎo)致的變更風(fēng)險(xiǎn)。
因此,安全生產(chǎn)規(guī)范,就是用來約定當(dāng)任意變更產(chǎn)生時(shí),需要通過何種流程將該變更通知到所有相關(guān)方,并通過何種方式進(jìn)行多方確認(rèn),共同確保變更風(fēng)險(xiǎn)可控的共識方案。了解了安全生產(chǎn)的本質(zhì)后,各團(tuán)隊(duì)就完全可以針對自己的業(yè)務(wù)特性和所有的變更場景,制定專屬的安全生產(chǎn)規(guī)范。其完備性取決于變更場景的完備性,其有效性取決于多方確認(rèn)的有效性。這樣,也同時(shí)回答了“如何制定一個(gè)好的安全生產(chǎn)規(guī)范”這個(gè)問題。
應(yīng)急響應(yīng)
應(yīng)急響應(yīng)主要分三個(gè)部分:發(fā)現(xiàn)、響應(yīng)和處理;關(guān)鍵的標(biāo)準(zhǔn)則是及時(shí)性和有效性。及時(shí)性確保了問題的影響不被放大,有效性則確保了已經(jīng)發(fā)生的影響能被控制和修復(fù)。
發(fā)現(xiàn):發(fā)現(xiàn)的關(guān)鍵點(diǎn)是及時(shí)。若不考慮及時(shí)性,客戶進(jìn)線、結(jié)算錯誤這種后置發(fā)現(xiàn)手段,是可以發(fā)現(xiàn)所有的問題的。但這種通過實(shí)際的業(yè)務(wù)損失來發(fā)現(xiàn)問題的方案,顯然不符合預(yù)期。因此,必須通過系統(tǒng)的手段,做好監(jiān)控、告警布防,不論是系統(tǒng)資源使用率、服務(wù)可用性情況,還是業(yè)務(wù)數(shù)據(jù)正確性、波動值,均要做好完善的布控,方可及時(shí)發(fā)現(xiàn)。
響應(yīng):響應(yīng)的要點(diǎn)同樣也是及時(shí),它關(guān)系到已經(jīng)出現(xiàn)的異常事件是否有人立即進(jìn)行跟進(jìn)處理,它一方面和意識培養(yǎng)直接相關(guān),對應(yīng)人的責(zé)任意識。另一方面對應(yīng)的工具的正確使用,諸如手機(jī)、電腦、飛書等通知配置,也是關(guān)系到值班同學(xué)是否能第一時(shí)間獲取到緊急事件通知的關(guān)鍵。
處理:問題處理是應(yīng)急響應(yīng)的最后一環(huán),它需要兼顧及時(shí)性和有效性:是否能夠快速定位根因?是否能夠有效止血?這就不僅和個(gè)人的能力有關(guān),也和系統(tǒng)的完備性有關(guān)。
個(gè)人能力這塊基本和3.3.1提及的內(nèi)容一致。但系統(tǒng)能力的完備性,則同樣可以展開大量的建設(shè)任務(wù),如:為了定位問題根因:告警信息的重要性(是否提供關(guān)鍵信息快速定位),日志信息的完備性和串聯(lián)性(是否能夠提供足夠的信息定位問題,是否提供的信息均是重要的關(guān)聯(lián)信息,減少不必要的噪聲),都是非常重要的基礎(chǔ)建設(shè)。
為了快速止血:除了通過個(gè)人的能力快速找到止血方案外,更重要的在于系統(tǒng)是否預(yù)設(shè)過相應(yīng)的故障,并提供了止血預(yù)案。如果有,往往可以快速解決問題。但如果沒有,要在短時(shí)間內(nèi)解決問題,往往難度極高。如果操作不當(dāng),容易引入額外的風(fēng)險(xiǎn)。
最后,團(tuán)隊(duì)中關(guān)于應(yīng)急問題處理的知識庫也是非常重要的知識沉淀,有助于不熟悉該業(yè)務(wù)的同學(xué),也能夠快速定位和處理問題。
日常巡檢
“防患于未然”是我們維護(hù)穩(wěn)定性的重要目標(biāo)。通過日常巡檢,團(tuán)隊(duì)能夠識別潛在的風(fēng)險(xiǎn)苗頭?;蚴锹齋QL、或是慢接口,或是cpu突刺。包括業(yè)務(wù)數(shù)據(jù)量是否逐步增長到了危險(xiǎn)的范圍,各項(xiàng)活動/配置是否臨近過期,上下游的調(diào)用量是否接近容量上限……等等,這些風(fēng)險(xiǎn),均可以在相應(yīng)的巡檢中發(fā)現(xiàn)問題,避免潛在風(fēng)險(xiǎn)逐步積累引發(fā)的災(zāi)難性后果。
架構(gòu)治理
如果之前的部分主要關(guān)注人員層面的提升,那么架構(gòu)治理則是從代碼層面提升系統(tǒng)穩(wěn)定性的一項(xiàng)重要措施,能夠真正提升系統(tǒng)抗風(fēng)險(xiǎn)的硬實(shí)力。
從穩(wěn)定性共識中可知,架構(gòu)治理的能影響的關(guān)鍵因子為變更風(fēng)險(xiǎn) ,而變更風(fēng)險(xiǎn)主要包括變更頻率、變更復(fù)雜度和變更爆炸半徑。
對應(yīng)的領(lǐng)域建模、高內(nèi)聚低耦合、OO等的架構(gòu)原則,反映到變更風(fēng)險(xiǎn)中,就是控制了變更復(fù)雜度。因?yàn)閮?nèi)聚性,變更多可以聚焦在單一應(yīng)用中,爆炸半徑也同時(shí)得到控制。
資源隔離的架構(gòu)設(shè)計(jì),則是專門用于控制爆炸半徑,不論是容器資源、線程池,還是DB、redis,甚至是P0/PN鏈路拆分等,均為控制爆炸半徑,避免相互影響。
還有一種特殊的稱作B/C流量拆分,這種看似是爆炸半徑,但實(shí)際上也控制了變更頻次?;蛘吒_的說法,是運(yùn)營/B/C三端拆分,它的邏輯除了流量來源不同之外,更在于場景和變更頻次不同。一般可以認(rèn)為B端/運(yùn)營端的供給側(cè),相較于C端的消費(fèi)側(cè),會有更復(fù)雜的模型,更高的變更頻次。進(jìn)行這幾端的拆分,更多在于減少C端(往往更核心)的變更頻次,減少變更時(shí)的相互影響。
關(guān)于架構(gòu)治理還有一個(gè)關(guān)鍵點(diǎn),那就是抓住主要矛盾,先從最核心的業(yè)務(wù)場景開始治理。如果沒有考慮好治理優(yōu)先級,那么茫茫多的場景和鏈路就會成為一個(gè)交織在一起的毛線球,是無法進(jìn)行抽絲剝繭逐一治理的。
資損防控
最后還有一個(gè)特殊的穩(wěn)定性場景,資損防控。它在穩(wěn)定性建設(shè)中比較特殊,是一個(gè)強(qiáng)業(yè)務(wù)相關(guān)的防控方案。一般可以在事前、事中、事后三個(gè)環(huán)節(jié)進(jìn)行防控。
事前環(huán)節(jié):一般考慮防呆攔截/提醒、二次確認(rèn)、審批流等多輪操作確認(rèn);更深入的可以增加結(jié)果預(yù)計(jì)算、影響面提示、前后對比等重提示,給到使用方對于執(zhí)行后果的直觀展示,減少誤操作可能性。
事中環(huán)節(jié):一般會有資金上限熔斷、實(shí)時(shí)/準(zhǔn)實(shí)時(shí)Dcheck預(yù)警、相關(guān)資金指標(biāo)波動預(yù)警等策略,在出現(xiàn)資損風(fēng)險(xiǎn)的時(shí)候進(jìn)行預(yù)警,或業(yè)務(wù)熔斷。
事后環(huán)節(jié):一般會采取T+1對賬,確認(rèn)多方資金數(shù)據(jù)一致。并輔以貨款抵扣、調(diào)賬等工具,在發(fā)生資金差額的情況下,進(jìn)行金額補(bǔ)償。
穩(wěn)定性建設(shè)的困難是否都被解決了?
最后,讓我們回過頭來復(fù)盤一下第2節(jié)中提到的困難,看看這些攔路虎是否在本節(jié)中被逐一擊破。
首先是短期價(jià)值不明確帶來的爭議,這塊我們通過建立團(tuán)隊(duì)的穩(wěn)定性共識得到徹底的解決。
其次穩(wěn)定性建設(shè)的復(fù)雜性和風(fēng)險(xiǎn)性:
- 先說相對明確的增量風(fēng)險(xiǎn)預(yù)防:3.3.2中的安全生產(chǎn)規(guī)范整個(gè)存在的意義就是為了通過流程來控制增量風(fēng)險(xiǎn)。
- 然后是風(fēng)險(xiǎn)治理的難度:該問題先可以通過架構(gòu)治理進(jìn)行分而治之,將大問題拆解成若干個(gè)小問題;再通過安全生產(chǎn)規(guī)范,控制每次解決小問題引入風(fēng)險(xiǎn)的概率。
- 最后是存量風(fēng)險(xiǎn)識別的難度:日常巡檢有助于發(fā)現(xiàn)存量風(fēng)險(xiǎn)的苗頭,意識培養(yǎng)則有助于對單應(yīng)用風(fēng)險(xiǎn)的摸排,架構(gòu)治理則對應(yīng)了對于應(yīng)用間、甚至整個(gè)域內(nèi)的依賴鏈路風(fēng)險(xiǎn)評估和治理。
至此,所有的核心困難點(diǎn)都有了解決的方案,穩(wěn)定性治理不再是一座不可逾越的高山,剩下的無非是根據(jù)具體問題,照著公式,逢山開路,遇水搭橋了。
四、穩(wěn)定性建設(shè)全景圖
通過以上的探討,我們不僅分析了穩(wěn)定性建設(shè)的重要性,還從理論角度,揭示了穩(wěn)定性建設(shè)的核心要素與挑戰(zhàn),提供了具體的解決方案和建設(shè)任務(wù)。簡單統(tǒng)合一下,就生成了下面的穩(wěn)定性建設(shè)全景圖,希望能為正在努力追求系統(tǒng)穩(wěn)定性的小伙伴們提供啟發(fā)與幫助。
當(dāng)然,其中的支撐事項(xiàng)僅是拋磚引玉,每個(gè)團(tuán)隊(duì)都可以因地制宜,設(shè)計(jì)有團(tuán)隊(duì)特色的支撐事項(xiàng)。只要是能夠服務(wù)于上層的建設(shè)目標(biāo),就具備落地的價(jià)值。