在我的技術交流群里,看到有朋友討論實現重連問題,說說我自己對這個問題的淺見。
重連接不如重啟;盡力維持穩定不如讓它崩潰。
當程序內部狀態已經紊亂,而我們無法控制,或許這是第三方庫或框架的問題,或許這是其它同事學藝不精的問題。與其我們花費大量精力去解決,想方設法找一種讓程序永久不停的解決方案,不如我們使用簡單的腳本語言寫一個簡單的守護,由這個守護程序去重啟動我們的應用程序,那么我們的應用程序就可以輕松的退出,就在它無法維持正確狀態的時候。簡單了就使程序容易控制,bug相對少而且容易查找,那么我們就能保證守護程序相對穩定,因此把一個小小的守護程序做穩定,遠比把一個不停變化的應用系統搞穩定容易得多。
守護程序不穩定怎么辦?很多新手擔心應用系統和守護一起死掉,有這種擔心是正確的。為解決這個擔心,一般采用兩級守護:一級守護,負責守護應用系統;二級守護,負責守護一級守護程序。這樣就把同時死掉的幾率下降很多了。那是不是為了安全,我們搞個十級、二十級守護,這就繁瑣到杞人憂天的地步了,如果真有那么不穩定,我們應該檢查程序,提高我們代碼質量,好好考慮開發人員的素質和工作態度了。
當然,簡單的程序退出,是否影響應用系統的業務邏輯完整性?是不是我們的應用系統本身不允許簡單的退出?這個問題很復雜,看你自己怎么設計這個系統的。為了達到能簡單的退出,一個可能的解決辦法就是,在架構上保證,在協議上保證,遵循《unix編程藝術》上的設計原則是很重要的。
早年我力求把程序寫得很穩定,也要求周圍的人把程序寫得很穩定,回頭看其實從來沒達到過。主要是技術不行,別人就更無法把握,就算自己是主管,也逼迫不了別人。
記得曾經有一個客戶端是用java寫的,它本身是一個后臺服務,收集地市服務器的日志和運行狀態,當時采用mina框架,v0.9的版本。為了socket斷開后的重連接,程序員寫了很多代碼,兩三個while循環,最后竟然不穩定。寫了這么多代碼,能達到預期目的還好,達不到還費力,就郁悶了。我也沒時間去查什么bug, 是不是mina使用不對啊什么的。后來,我直接叫他們把那些檢測和重連的代碼刪除,程序一旦發現連接不了中心服務器,直接退出算了,我使用bash寫了一個簡單的守護,負責重啟動它。這個問題就這樣簡單的解決了,本來這個后臺服務也要求不高,直接退出沒有什么業務邏輯問題。
守護是不可靠的,最終還是需要人來維護。守護配合一定的監控報警手段,讓維護人員及時發現問題初現,及時解決軟硬件問題,才是解決之道。
當然,程序穩定性還是要程序本身穩定,如果程序不停core,守護不停重啟,有什么作用呢。