這起事件的分析,會寫得比較長。因此分成幾部分發(fā)出來。這是第一部分。
01一碼通崩潰事件復(fù)盤
12月20日星期一,也就是筆者撰寫本文的日子,西安一碼通崩了。具體一碼通是幾點(diǎn)開始崩的,并沒有一個準(zhǔn)確的說法。有人說是7點(diǎn)40左右開始。不過我個人感覺要早一點(diǎn)。我大概早上7點(diǎn)20左右開車經(jīng)過南三環(huán)繞城高速雁塔收費(fèi)站入口時,發(fā)現(xiàn)那里排了大量的車進(jìn)不去高速。當(dāng)時沒多想,后來到了單位后才發(fā)現(xiàn)一碼通打不開。現(xiàn)在想想,7點(diǎn)多的非高峰期,高速進(jìn)不去,估計(jì)也是因?yàn)樗緳C(jī)進(jìn)高速時無法打開一碼通和核酸結(jié)果。
崩潰的系統(tǒng)其實(shí)不止一碼通,西安的核酸查詢系統(tǒng),包括疫苗接種系統(tǒng)都崩潰了。當(dāng)然后兩者可能是因?yàn)楹鸵淮a通存在強(qiáng)關(guān)聯(lián)所以崩潰的。一直到下午兩三點(diǎn)以后,一碼通和相關(guān)系統(tǒng)才開始陸續(xù)恢復(fù)。但是樣式回滾到了之前沒有接種標(biāo)識的樣子。
到了下午大概七點(diǎn)多,一碼通系統(tǒng)又崩潰了。也是那會,很多人說核酸檢測系統(tǒng)也崩潰了??梢娺@些系統(tǒng)是有一些強(qiáng)關(guān)聯(lián)的。
02一碼通崩潰的影響
一碼通不能使用,對于處于疫情漩渦中的西安來說,無異于雪上加霜。
就在12月19日(星期日),西安高新區(qū)發(fā)布通知,要求周一員工必須持48小時內(nèi)核酸陰性結(jié)果才能進(jìn)出辦公場所。西安的公交、地鐵也在周日發(fā)通知說要求乘客拿48小時的核酸陰性結(jié)果才能乘坐公共交通工具。周一當(dāng)天筆者大概7點(diǎn)40多到了西安軟件園,結(jié)果因?yàn)橐淮a通無法打開,核酸結(jié)果無法查證,物業(yè)和大廈保安沒有辦法放行。軟件園里每個大樓下面都聚集了好多無法進(jìn)入的員工。根據(jù)一些微信群里描述,很多公交車站,地鐵站也都排了長隊(duì)。上午10點(diǎn)多,筆者經(jīng)過一個核酸檢測點(diǎn)時,發(fā)現(xiàn)排隊(duì)長度超過1公里。
由于西安這些天一直有新冠確診患者,政府和整個社會都在加大核酸檢測和防疫政策的力度。而作為防疫政策核心支撐系統(tǒng)的一碼通崩潰,直接影響了整個西安市幾乎所有市民的生活和工作。造成的影響應(yīng)該是很大的。
03一些分析結(jié)論
在這里我們還是從軟件開發(fā)的角度來分析一下這起事件。為了便于大家閱讀,我先直接說一下關(guān)于這起事件個人的一些分析結(jié)論:
一碼通崩潰不是因?yàn)榫W(wǎng)絡(luò)擁堵導(dǎo)致的
一碼通系統(tǒng)的容災(zāi)和備份機(jī)制存在缺陷
一碼通系統(tǒng),核酸查詢系統(tǒng)和核酸檢測系統(tǒng)之間的強(qiáng)關(guān)聯(lián)是設(shè)計(jì)上的失誤
西安市到現(xiàn)在都沒有把自己的核酸檢驗(yàn)報(bào)告系統(tǒng)和國家的核酸報(bào)告系統(tǒng)打通,是決策上的失誤,也是政府信息化建設(shè)中的失誤
未來各地『一碼通』需要逐漸走向互聯(lián)互通
由于話題比較多,考慮到公眾號閱讀的特性。我打算分成幾篇文章發(fā)布。這是這一系列文章的第一篇。在這一系列文章的最后,借著這個機(jī)會,我希望談一下軟件系統(tǒng)如何在設(shè)計(jì),開發(fā)和運(yùn)營中確保系統(tǒng)穩(wěn)定性。
04是擁堵引起的嗎?
一碼通是因?yàn)槭裁丛虮罎⒌??大?shù)據(jù)局曾經(jīng)對媒體說是網(wǎng)絡(luò)擁堵導(dǎo)致(參見陜西交通廣播微博)。今天下午新聞發(fā)布會也說是擁堵導(dǎo)致的。坦率地說,這種說法我是不相信的。原因有二:
1.?西安一碼通上線已經(jīng)很長時間了。這期間大部分時候還是很穩(wěn)定的。西安的上班高峰期,也就是掃碼高峰期大體上應(yīng)該在8點(diǎn)到9點(diǎn)之間。但是一碼通崩潰是從7點(diǎn)多開始的,當(dāng)時大部分人都還沒出門,更談不上掃一碼通了。網(wǎng)絡(luò)根本不可能在那個時候擁堵。更不可能因?yàn)閾矶略斐上到y(tǒng)崩潰。實(shí)際上最近因?yàn)橐咔?,很多人出門會避開高峰期,高峰期一碼通系統(tǒng)的網(wǎng)絡(luò)流量應(yīng)該是沒有平時大的。
2.?如果真的是網(wǎng)絡(luò)擁堵導(dǎo)致系統(tǒng)崩潰,那么解決是很容易的。解決網(wǎng)絡(luò)擁堵大體上有兩種手段:一是限流,二是擴(kuò)容。限流就是把一部分網(wǎng)絡(luò)請求阻擋住,只讓部分網(wǎng)絡(luò)請求通過。這樣系統(tǒng)負(fù)荷就小了。擴(kuò)容就是增加服務(wù)器的硬件,比如增加服務(wù)器的內(nèi)存,CPU,如果服務(wù)器有集群,則可以在集群中增加更多服務(wù)器,之后通過負(fù)載均衡將大流量分布到更多的服務(wù)器去,進(jìn)而降低單個服務(wù)器的負(fù)荷。
如果為不太懂計(jì)算機(jī)技術(shù)的朋友們打個比方,擁堵導(dǎo)致崩潰可以用“小馬拉大車”來理解。本來小馬只能拉一輛車,現(xiàn)在要求它同時拉兩輛車,那小馬肯定身體撐不住。解決辦法中的“限流”可以理解為先扔下一輛車,拉走另外一輛車,之后再來拉扔下的那個車?!皵U(kuò)容”則可以理解為調(diào)來更多的小馬,本來只有一個小馬,現(xiàn)在有兩個小馬拉了,自然就可以拉動了。
需要說明的是,當(dāng)今的計(jì)算機(jī)系統(tǒng),基本上都部署在云上。而在云計(jì)算平臺上,“限流”和“擴(kuò)容”都是非常容易實(shí)現(xiàn)的。甚至夸張一點(diǎn)說,點(diǎn)幾下鼠標(biāo),動一動鍵盤,很快可能就搞定了。一碼通系統(tǒng)據(jù)說部署在阿里云上,無論是搞限流還是擴(kuò)容,應(yīng)該都不難,更不至于花了大半天都沒有恢復(fù)。
另外一個關(guān)于一碼通問題是程序問題的佐證是,一碼通的樣式在今天進(jìn)行了回滾。
下面這個圖是10月份時候健康碼的樣子,注意10月底的時候二維碼就有了邊框注明疫苗接種狀態(tài),比如下面這個是金黃色的,標(biāo)明完成了第二針接種。
直到昨天,這個邊框也是存在的。但是今天下午系統(tǒng)恢復(fù)以后卻消失了。變成了下面這個好幾個月之前的樣子:
所以我們判斷系統(tǒng)進(jìn)行了回滾。
另外,周日進(jìn)行了核酸的一部分人也發(fā)現(xiàn)他們的結(jié)果一直沒出來。但按照常理,應(yīng)該是出來的。我個人的猜想是數(shù)據(jù)庫也進(jìn)行了回滾。回滾到了周日的某個時間點(diǎn)。這比程序回滾的時間跨度要小很多。
如果僅僅是流量太大,正如我上面所說,直接優(yōu)化網(wǎng)絡(luò),優(yōu)化硬件就可以。為什么要把程序回滾到2個月以前的樣子呢?回答只能是,程序出了問題,一時又改不好。所以只能把程序回滾了。有可能回滾了很多次,直到找到這一個版本能運(yùn)行,結(jié)果已經(jīng)是很久以前的程序了。。。而網(wǎng)絡(luò)擁堵,明顯只是一個借口。。。
需要注意的是,在程序下午回滾以后,晚上七點(diǎn)多又崩潰了。原因是什么呢?很可能是數(shù)據(jù)和程序存在不匹配的情況?;蛘呤菙?shù)據(jù)庫里面的存儲過程之類出了問題。
05系統(tǒng)崩潰的真實(shí)原因
那么系統(tǒng)崩潰真實(shí)原因是什么呢?目前看起來,當(dāng)事的企業(yè)和大數(shù)據(jù)局都傾向于用”網(wǎng)絡(luò)擁堵“的接口來說事。他們?nèi)绻桓嬖V我們真實(shí)原因。我們就只能從一些表象進(jìn)行猜測。當(dāng)然這些猜測可能對,也可能不對。下面是我個人的分析。
系統(tǒng)之前運(yùn)行地很穩(wěn)定,突然就崩潰了。這樣的情況,如果不是網(wǎng)絡(luò)問題,那么大體可以分為兩種:
修改了一部分程序代碼,結(jié)果這部分代碼有問題,把系統(tǒng)搞崩了。
或者代碼沒怎么變。但是一些新的數(shù)據(jù)進(jìn)來以后,引發(fā)了以前沒有運(yùn)行過的一些情況,系統(tǒng)崩了。
或者就是上面1和2所說的情況兼具。
筆者認(rèn)為:最大的可能是周日晚上一碼通經(jīng)歷了代碼更改,但是上線的版本出現(xiàn)了 bug導(dǎo)致的。從后面程序回滾以后依然崩潰的現(xiàn)象來看,崩潰的原因和數(shù)據(jù)有一定關(guān)系??赡苁清e誤的代碼修改了數(shù)據(jù)庫,導(dǎo)致程序回滾以后依然有崩潰現(xiàn)象。也有可能是存儲過程等保存在數(shù)據(jù)庫中的代碼出了問題導(dǎo)致的。
06一點(diǎn)感想
一碼通有多重要。相信今天大家都體會到了。然而從這一起事件看起來,一碼通的系統(tǒng),明顯缺乏足夠好的容災(zāi)和備份機(jī)制。如果他們?nèi)轂?zāi)和備份機(jī)制做得足夠好的話,是完全可以在短時間內(nèi)恢復(fù)到昨天或者前天的狀態(tài)的。但是從今天系統(tǒng)反反復(fù)復(fù)的表現(xiàn)看。顯然目前的系統(tǒng)雖然有一定的備份機(jī)制,但是備份機(jī)制不夠完善,甚至比較混亂。這個話題比較長,在后面我會再寫一篇文章來分析。
歡迎大家在簡書關(guān)注我的公眾號?;蛘咴谖⑿潘阉魍娞枴败浖_發(fā)與挖掘機(jī)技術(shù)” (softdive)也可以找到我。謝謝大家