1. 程式人生 > >那個不管“萬一”的程式設計師後來怎麼樣了?

那個不管“萬一”的程式設計師後來怎麼樣了?

不怕一萬,只怕萬一呀,朋友。

“這個情況很極端肯定不會遇到,不管了”

從前,有個程式設計師叫小明,他在開發一個股票的投資組合功能。這個功能簡單的來說,就是一個投資組合裡有現金、股票等資產,我們根據組合裡股票漲跌等情況,給出一個整體組合的指數,以評判組合的水平。

聰明的小明在開發的時候就發現了,如果存在現金為0,並且所持有的股票都退市了的話,這個股票指數的計算就會存在問題。小明想:“現金為0的情況很少,退市的情況就更不多,這個情況很極端,肯定不會遇到,實現異常情況處理的邏輯也很複雜,測試肯定也發現不了,不管了”,於是程式碼就歡快地跑到了線上。

隨著業務的發展,投資組合越來越多了,也隨著政策的轉向,退市的股票也陸陸續續地變多了。某一天,夜裡跑批報錯了!告警簡訊在夜裡發到了小明的手機了,小明只好半夜跑來公司排查問題,原來之前考慮的情況真的出現了,小明心裡暗罵了一句,還TM真的出現這情況了!罵歸罵,小明運用他聰明的大腦,重新看了一遍邏輯,分析了各種情況,然後給出了在這種情況下指數的跑批值應該是多少,經過一次又一次戰戰兢兢的複核計算,最後戰戰兢兢地把資料一條一條地更新到了資料庫。經過一番折騰後,已經快早上5點了...第二天跟領導解釋了情況,說這種情況很少見,我們後續抽時間把這塊的邏輯補上!

然而在這次事故的不久之後,小明還在想啥時候開始補這塊邏輯時,小明夜裡又收到了投資組合模組的告警簡訊.....

“只要不考慮宕機這些極端情況,基本都沒有問題”

從前,有另外一個程式設計師叫小王,他在做一個完成交易時給使用者的積分賬號加積分的功能,訂單與積分在不同的資料庫,這涉及到一個分散式事務的問題。

聰明的小王早就知道了有很多形態可以解決這個問題,最合適的當然是MQ,但是目前系統沒有MQ要額外加入維護,很麻煩;TCC也可以,但要寫額外的程式碼,也好煩;2PC嘛,好像沒有合適的,效能也據說不高,不選;Best Efforts 1PC,這個不錯!效能比2PC高,無需額外編碼,大多數情況下能有強一致性保證,唯一可能出現異常的情況就是在commit階段,若一個數據庫事務提交了,另外一個數據庫事務由於宕機提交失敗的話,才會出現不一致,這情況多少見呀!就Best Effors 1PC啦!出問題我手工給他補上就好啦。

於是程式碼就輕鬆愉快地上線了。

隨著業務的發展,業務範圍和交易量也在逐步地變大,小王寫了一個新功能準備更新到交易服務裡,公司裡有超強的滾動釋出,上線過程很愉快的就完成了。完成驗證後,小王心滿意足地跑回家睡覺了。

這個小王比較幸運,睡到了第二天上班。然後客服部傳來訊息,說客戶投訴,其交易沒有產生積分!小王一下子就猜測到可能是昨晚滾動升級服務下線的時候,沒有做優雅停機相關程式碼設計,導致Best Effors 1PC失敗了,於是小王翻了下日誌和資料,排查出果然是這個問題導致的,實際還有額外幾條資料也有這問題,小王一併修復了這些資料問題,雖然小王很聰明,但這個修復過程也佔用小王一上午的時間。同時,小王也決定,給加上優雅停機的相關邏輯。後來再也沒有出現過由於更新導致的不一致了。

再隨著業務的發展,使用者交易量也跟著上去了,然而在一個交易較為頻繁的時段,突然飈出來很多告警,機房內網路也不穩定,經過一排查,原來是網路裝置出現了問題,經過一小段時間折騰網路恢復了正常。然後小王心裡帶著忐忑地去翻看交易服務的日誌,發現出現了大量的報錯,還有不少報錯是顯式提示BestEffors1PC在Commit階段的錯誤!統計了一下,這次可不是手工能解決的問題了.....

小王寫了一個批量資料修復程式,開始在生產跑了起來,但小王開始想,我用BestEffor1PC是對的麼?

那個不管“萬一”的程式設計師後來怎麼樣了?

相信大家都聽過墨菲定律,就是說,你越擔心的事情,越有可能發生。

當然,這不符合我們程式設計師嚴謹的風格。我們萬事都要量化。小明同學的案例中,即使出現的概率是萬分之一,但當組合數量達到十萬個呢?達到百萬個呢?是不是就會變得經常出現了呢?小王同學的案例裡,因commit要走網路等IO,這個整個過程要1-2毫秒不過分吧?當TPS增多,這個1-2毫秒的危險視窗是不是就遍佈整個時間範圍了呢?這個時候隨便發生下網路抖動,會怎樣呢?

寫程式有一個特點就是,寫了一次,計算機會幫你執行無數遍,而你無需付出任何額外努力。但我們人工重複執行一件事情,卻要我們每次都付出精力與時間。

如果我們在寫程式碼時放過的萬一經過的評估是:一年都不會發生一次的話,個人認為你是可以強行閉上眼睛不管這個萬一的。

但是誰能評估準呢?當發生了的時候,你要做的補救措施就是你當時遺漏的邏輯。當發生需要人工補救的情況時,所需付出的努力甚至要遠大於你當時完成這段邏輯付出的努力。

因此,小明和小王之後都懂得了 “出來行,遲早要還”的道理,不再放過任何一個萬一。

作者簡介:某信用卡中心架構師,多年金融行業經驗,愛好廣泛,從聯機交易到深度學習都都有涉獵,歡迎關注個人公眾號,在這我會分享日常工作及生活中對於架構、程式碼地思考。

image