家里有做程序員的領(lǐng)導(dǎo)查邢,他曾經(jīng)說(shuō)過(guò)的工作中出錯(cuò)的一件事情讓我印象深刻!
那次他們負(fù)責(zé)一個(gè)24小時(shí)運(yùn)轉(zhuǎn)的大型工廠項(xiàng)目酵幕,就是在廠區(qū)有多個(gè)工作站扰藕,將各自負(fù)責(zé) 數(shù)據(jù)收集后傳至服務(wù)器處理。軟件系統(tǒng)上線運(yùn)行后芳撒,發(fā)現(xiàn)有時(shí)工作站在運(yùn)行過(guò)程中會(huì)偶爾不明原因死機(jī)邓深,但是現(xiàn)場(chǎng)工作人員一般直接重啟一下電腦就又正常運(yùn)行了。因?yàn)閿?shù)據(jù)都已實(shí)時(shí)上傳備份至服務(wù)器笔刹,工作站重啟后也沒(méi)什么影響芥备,次數(shù)不多,大家也都基本忽略了這個(gè)問(wèn)題的存在舌菜。(更何況造成電腦死機(jī)的原因很多萌壳,不一定是軟件方面的問(wèn)題。)
直到有一次,半夜被現(xiàn)場(chǎng)人員緊急呼叫:整個(gè)廠區(qū)的工作站都死機(jī)袱瓮!整個(gè)廠區(qū)工作接近癱瘓了缤骨!
于是緊急排查,發(fā)現(xiàn)是服務(wù)器死機(jī)尺借!
為什么服務(wù)器死機(jī)會(huì)造成所有工作站死機(jī)绊起?!
追蹤代碼發(fā)現(xiàn)是代碼里一個(gè)小bug褐望!
原來(lái)工作站向服務(wù)器發(fā)送數(shù)據(jù)時(shí)的 步驟是:第一步:向服務(wù)器發(fā)送握手信號(hào)(表明我要發(fā)送數(shù)據(jù)了)勒庄;第二步:服務(wù)器接收到握手信號(hào)后向工作站發(fā)送一個(gè)已經(jīng)準(zhǔn)備接收數(shù)據(jù)的信號(hào);第三步:工作站收到服務(wù)器準(zhǔn)備接收的消息后瘫里,開(kāi)始發(fā)送數(shù)據(jù)实蔽;第四步:完成!
乍看之下谨读,沒(méi)有任何問(wèn)題局装,步驟明確!可是問(wèn)題就出在第一第二步上劳殖!沒(méi)有考慮到特殊情況铐尚!
當(dāng)?shù)谝徊焦ぷ髡景l(fā)送握手信號(hào)時(shí),默認(rèn)就在等第二步的回應(yīng)了哆姻!可是當(dāng)服務(wù)器有問(wèn)題(死機(jī))時(shí)宣增,它沒(méi)有給工作站回復(fù)握手信號(hào),然后工作站就一直在等待中……直到工作人員認(rèn)為它死機(jī)了……
為什么以前工作站死機(jī)再重啟就好了矛缨?
因?yàn)闄C(jī)房有工作人員將服務(wù)器已經(jīng)重啟了爹脾,所以工作站再重啟就好了!
為什么這次全部工作站都死機(jī)箕昭?
因?yàn)闄C(jī)房服務(wù)器值班人員脫崗了灵妨!長(zhǎng)時(shí)間沒(méi)有發(fā)現(xiàn)服務(wù)器死機(jī)!
等等落竹?泌霍!為什么會(huì)有機(jī)房服務(wù)器工作人員脫崗?述召!服務(wù)器有專人看著朱转?!是的积暖!因?yàn)樵瓉?lái)發(fā)現(xiàn)服務(wù)器有過(guò)這樣現(xiàn)象所以安排了值班人員24小時(shí)值班肋拔,專門(mén)看管服務(wù)器,任務(wù)就是在發(fā)現(xiàn)服務(wù)器死機(jī)后立刻最快時(shí)間重啟呀酸!
傲狗洹?!問(wèn)了現(xiàn)場(chǎng)負(fù)責(zé)的為什么這樣操作窿吩,對(duì)方說(shuō)人家廠區(qū)一直都是這樣茎杂,以前的系統(tǒng)也是這樣,機(jī)房服務(wù)器工作人員24小時(shí)值班纫雁,主要的任務(wù)就是負(fù)責(zé)各種服務(wù)器重啟煌往!
這邊以最快速度加了幾行代碼!
在工作站端加了一個(gè)容錯(cuò)處理轧邪,當(dāng)工作站準(zhǔn)備傳數(shù)據(jù)時(shí)刽脖,在*秒內(nèi)等不到服務(wù)器的回應(yīng),就暫存數(shù)據(jù)在本地忌愚,然后處理下一個(gè)任務(wù)曲管。順便給服務(wù)器發(fā)送一個(gè)讓服務(wù)器重啟的命令!然后在下一個(gè)時(shí)間段再嘗試去和服務(wù)器連接硕糊!
死機(jī)的問(wèn)題完美解決院水!順便解決了機(jī)房必須24小時(shí)小心翼翼值班的問(wèn)題!(不用再刻意時(shí)刻關(guān)注是否死機(jī)了)
問(wèn)題的根本就是大家都是在以慣性思維去解決問(wèn)題简十,最初寫(xiě)代碼的程序員默認(rèn)服務(wù)器永遠(yuǎn)都不會(huì)出問(wèn)題檬某,沒(méi)有考慮過(guò)服務(wù)器也會(huì)死機(jī)!而機(jī)房的工作人員也以為服務(wù)器重啟必須靠人工來(lái)解決螟蝙,根本沒(méi)想過(guò)讓軟件自身來(lái)處理這個(gè)問(wèn)題恢恼!心疼那些值了好多夜班的機(jī)房工作人員!