如果不想總是半夜爬起來搶修生產(chǎn)事故
我以前很崇拜那些能修復(fù)各種軟件缺陷的“救火”高手。很多年前,我還是一個維護(hù)遺留系統(tǒng)的團(tuán)隊的普通開發(fā)人員。那時,團(tuán)隊的每個開發(fā)人員,都輪流帶一個7x24小時開機(jī)的手機(jī),處理用戶問題。團(tuán)隊里有一位英雄。他戴眼鏡,經(jīng)常身穿一件白大褂。我們要是有搞不定的生產(chǎn)事故的各種疑難雜癥,就會找他。
只有他能搞定我們這些普通開發(fā)人員搞不定的問題。所以過去了十多年,我依然很佩服他,覺得他是英雄。但當(dāng)我后來讀了《第五項修煉》中描述的“負(fù)擔(dān)轉(zhuǎn)移”系統(tǒng)基本模式后,醒悟到團(tuán)隊有這樣的“英雄”,看起來值得“慶幸”,但會帶來一個意想不到的后果——團(tuán)隊不再想花時間和精力,提升普通開發(fā)人員解決生產(chǎn)事故的能力,因為“英雄”出馬,以一當(dāng)十。當(dāng)年團(tuán)隊所維護(hù)的遺留系統(tǒng)火情不斷,但我們這些普通水平的開發(fā)人員,一直救不了火。
真英雄,要么能賦能團(tuán)隊成員,提升他們處理生產(chǎn)事故的“救火”的能力,而不僅僅靠他一人;要么能把需要半夜爬起來搶修的生產(chǎn)事故,化解成一個個小任務(wù),在白天上班時間給解決了。
有人會問,作為開發(fā)人員,如何才能把生產(chǎn)事故化解成一個個小任務(wù)呢?
首先,可以在自己日常開發(fā)新代碼,或解決軟件缺陷時,時時思考面前的代碼,是否出現(xiàn)了以下分布式計算的8個謬誤:
- 網(wǎng)絡(luò)是可靠的
- 延遲為零
- 帶寬無限大
- 網(wǎng)絡(luò)很安全
- 網(wǎng)絡(luò)拓?fù)洳粫淖?/li>
- 只有一名網(wǎng)管
- 傳輸成本為零
- 網(wǎng)絡(luò)是同質(zhì)的
比如你發(fā)現(xiàn)要修改的代碼,存在“網(wǎng)絡(luò)是可靠的”這樣的謬誤,接下來就可以借助“復(fù)雜系統(tǒng)穩(wěn)定性的12個反模式”(每個反模式的詳細(xì)描述,參見《發(fā)布!》第2版第4章)列表,來思考哪里會存在“暗債”。
- 集成點
- 同層連累反應(yīng)
- 層疊失效
- 用戶
- 線程阻塞
- 自黑式攻擊
- 放大效應(yīng)
- 失衡的系統(tǒng)容量
- 一窩蜂
- 做出誤判的機(jī)器
- 緩慢的響應(yīng)
- 無限長的結(jié)果集
將思考產(chǎn)生的所有“暗債”集中起來,并按照“暗債”爆發(fā)的“影響度”和“可能性”這兩個維度,把這些“暗債”進(jìn)行排序,然后選擇其中“影響度”最高且“可能性”最大的一個“暗債”,優(yōu)先處理。
假如你發(fā)現(xiàn)代碼中存在一個“集成點”的“暗債”需要優(yōu)先處理,那么就可以借助下面“復(fù)雜系統(tǒng)穩(wěn)定性的12個模式”(每個模式的詳細(xì)描述,參見《發(fā)布!》第2版第5章)列表,來尋找償還“暗債”的思路。
- 超時
- 斷路器
- 艙壁
- 穩(wěn)態(tài)
- 快速失敗
- 任其崩潰并替換
- 握手
- 考驗機(jī)
- 中間件解耦
- 卸下負(fù)載
- 背壓機(jī)制
- 調(diào)速器
比如上面那個“集成點”的“暗債”,可以使用“快速失敗”的思路來解決,那么就可以根據(jù)修復(fù)工作量的大小,要么順手修復(fù),要么將其加入迭代開發(fā)待辦列表中,納入日常開發(fā)活動中。如果每位開發(fā)人員都能在日常開發(fā)過程中,持續(xù)進(jìn)行如上的思考,那么就能在白天上班時,將生產(chǎn)事故的相關(guān)“暗債”,逐一解決,讓自己能睡個好覺。
當(dāng)然你可以把上面那套方法及其成效,分享給你的隊友。但更有效的方法,是設(shè)法影響你的技術(shù)領(lǐng)導(dǎo),請他參考2021年6月中文版新上市的《混沌工程》關(guān)注與該書同名的這一新實踐。
早在2008年,Netflix公司在把數(shù)據(jù)中心遷往亞馬遜云平臺的時候,踩了一個大坑,經(jīng)常會出現(xiàn)生產(chǎn)事故。為了能在白天上班時間解決生產(chǎn)環(huán)境的事故,而不是半夜爬起來解決,他們摸索出一套行之有效的方法——混沌工程。
該如何做混沌工程?
借鑒Netflix的實例,可以從“擺正心態(tài)、人員主動和試點業(yè)務(wù)”三方面入手,來啟動混沌工程。
擺正心態(tài)
承認(rèn)暗債為復(fù)雜系統(tǒng)所固有,而不是一味要求工程師“不能也不該出現(xiàn)失誤”。否則在故障面前,大家就只會花大量時間相互甩鍋,而忽視了提升團(tuán)隊發(fā)現(xiàn)更多暗債和快速修復(fù)生產(chǎn)故障的能力。
人員主動
根據(jù)Ashby的必要多樣性法則(用于控制系統(tǒng)B的系統(tǒng)A,需要和系統(tǒng)B同樣復(fù)雜),要建立對系統(tǒng)能夠承受生產(chǎn)環(huán)境的動蕩的信心,需要針對生產(chǎn)環(huán)境“豐富多彩”的暗債,設(shè)計同樣“豐富多彩”的防范手段。而技術(shù)骨干一個人,是發(fā)現(xiàn)不了那么多暗債,并找到那么多的防范手段的。所以,就需要發(fā)揮各位工程師的主動性。此時,領(lǐng)導(dǎo)者要創(chuàng)造能調(diào)動工程師主動性和創(chuàng)造性的企業(yè)文化,來促進(jìn)工程師更安全地發(fā)現(xiàn)與修復(fù)更多“花樣”的暗債。在修復(fù)暗債的過程中,就可以使用上述8大謬誤、反模式和模式列表。
試點業(yè)務(wù)
- 選擇一個出現(xiàn)生產(chǎn)事故頻率較高的業(yè)務(wù)系統(tǒng),嘗試混沌工程。因為事故的反復(fù),出現(xiàn)會讓發(fā)現(xiàn)與解決暗債的動力更大
- 基于能反映用戶體驗的業(yè)務(wù)穩(wěn)態(tài)行為建立假設(shè),而不是先聚焦于在系統(tǒng)內(nèi)尋找弱點。因為這樣能更利于進(jìn)行全局優(yōu)化,讓成效更大
- 為了讓暗債浮現(xiàn)出來,設(shè)計引入足夠多樣化的現(xiàn)實世界可能發(fā)生的事件,而不是設(shè)計那些易于生成但在現(xiàn)實中不大可能出現(xiàn)的事件,以便切中要害。針對每一個所引入的事件,參考上述模式列表,來進(jìn)行穩(wěn)定性設(shè)計
- 可以先從準(zhǔn)生產(chǎn)環(huán)境入手進(jìn)行混沌實驗,等條件成熟后,再逐漸過渡到生產(chǎn)環(huán)境
- 自動化地持續(xù)進(jìn)行混沌實驗,以起到回歸實驗的效果,持續(xù)發(fā)現(xiàn)并解決暗債,避免系統(tǒng)隨著時間的推移,在韌性方面逐漸“掉隊”
- 設(shè)計更安全的實驗方式,以最小化爆炸半徑,讓實驗所導(dǎo)致的業(yè)務(wù)損失降到最低,而不是明知故障難以控制,還要貿(mào)然進(jìn)行實驗。如果實驗的假設(shè)被證偽,那么就遇到了發(fā)現(xiàn)新的暗債的好機(jī)會。在尋找暗債的過程中,可以參考上述反模式列表,來啟發(fā)尋找漏洞及修復(fù)
總結(jié)一下,真英雄最終都不會在半夜里爬起來搶修生產(chǎn)事故,因為他們會聰明地使用分布式系統(tǒng)穩(wěn)定性設(shè)計,以及混沌工程,避免將自己陷入如此凄慘的境地。
作為一名開發(fā)人員,如何能讓自己能逐漸減少在半夜爬起來搶修生產(chǎn)事故的次數(shù)?可以嘗試使用本文要介紹的8個謬誤、12個反模式和12個模式。
如何讓隊友不會半夜把你喊起來幫著搶修生產(chǎn)事故?影響領(lǐng)導(dǎo),嘗試使用混沌工程,來讓團(tuán)隊成員都在上班時間,主動發(fā)現(xiàn)并修復(fù)分布式系統(tǒng)的漏洞,逐漸減少夜里喊你的次數(shù)。
【本文是51CTO專欄作者“ThoughtWorks”的原創(chuàng)稿件,微信公眾號:思特沃克,轉(zhuǎn)載請聯(lián)系原作者】