最近遇到的一些坑坑

2022-09-05 21:57:28 字數 2257 閱讀 8006

1. 未初始化

因為php語言是弱型別語言,不需要宣告變數型別,也不需要初始化值,所以經常對變數直接用,也不初始化。在php中這種做法不會造成致命錯誤,但是不初始化的這種思路會出問題。專案中經常要寫一些指令碼來統計業務的增長。增量的計算是今天基於前一天的增長,如果前一天的總量資料計算失敗,如何計算增量呢。如果這個程式在一台新的機器上運算,沒有前一天的資料,如何基於前一天的資料計算今天的增量呢。所以在計算增量的時候,兩天資料的初始化是重要的。

除此之外,有的業務講究原子性,執行業務b必須在業務a執行完畢之後。但是如果業務a一直執行失敗,b就一直等待,然後阻塞後面的c業務,d業務。比如說下了訂單之後,需要支付成功才能發貨。那麼如果支付一直不成功,這種crash如何捕捉又如何自動恢復。有乙個同事寫的指令碼就是業務a執行失敗的時候沒有報警,而業務b一直在等待業務a執行成功的狀態,沒有嘗試過重試,沒有去自動恢復。導致後續的業務都阻塞了沒有執行。

上面問題的關鍵,需要初始化程式狀態,不要只想著程式在正常預期的狀態,應該考慮異常的狀態,如何捕捉異常狀態並且自動恢復。

問題一,我們當發現前一天的資料不存在的話,就重新初始化程式狀態。或者獲取到最後一次成功的資料狀態作為原始的資料。

問題二,當業務b捕捉到業務a未在預期時間內未執行成功的時候,發出報警,並且自動重啟重試。  

2. 新增一條日誌引發的蝴蝶效應

本來以為在程式中新增一條日誌,沒什麼關係,不就加一條日誌,對業務邏輯又沒什麼影響。後來才知道自己是too young,too ******。因為這個success日誌是在業務處理成功的時候打。業務量每天都可以達到10億,所以一下子每天多出10億日誌。

(1)首先日誌量過多,而磁碟有限。所以磁碟儲存的日誌天數減少,之前可以儲存5天,後續只能儲存3天。你也許會說,日誌少了就少了唄,又不影響線上業務。但是對於技術運營來說,親你知道日誌對於排查問題的重要性麼,就相當於破案之保留現場的重要性。

(2)再者是日誌量過多,導致日誌同步過慢,每10分鐘的日誌10分鐘都無法同步完。比如在19:00的時候將2015/12/18/19/00將日誌移動到backup_log資料夾,然後進行rsync,rsync時間過長,超過了10分鐘,在19:10的時候2015/12/18/19/10日誌已經移動到了backup_log資料夾。原有的邏輯是rsync完之後,要清空backup_log資料夾。so第二個十分鐘2015/12/18/19/10的日誌還沒rsync就被清空了,導致同步日誌丟失。後續考慮不刪除backup_log的資料夾。日誌都是按照時間分片的,雖然rsync是按照增量推送,因為推送整個backup_log資料夾,導致一下子資料夾中包含了很多的分支(19點的6個分支,18點的所有分支。。。),從而導致rsync的連線數過多。最後決定指定資料夾推送,不推送backup_log整個資料夾,推送19/00的日誌,就指定推送00的日誌資料夾,推送19/10的日誌,就指定推送10的日誌資料夾。

(3)後續就是日誌分析,因為每次都是10分鐘日誌全域性搜尋,由於日誌量太多,寫入記憶體也變多,搜尋也變慢,日誌分析也慢。

真是動一發遷全身,一步錯步步錯。後來將日誌進行精簡,解決了上述各種問題。

3. for迴圈,if等各個分支的考慮

很多人在寫程式的時候,估計也犯過這樣的錯誤,在for迴圈中有if判斷,if判斷只考慮某些情況,不考慮for迴圈或者while迴圈的各個分支。特別是在for迴圈和while迴圈要剔除某些情況,經常不用continue而是直接return false。但有時候也犯相反的錯誤。某些異常不滿足執行條件,不能執行for迴圈以後的邏輯,所以要直接return false,卻使用了continue,導致不符合要求的分支在for迴圈之後繼續往下執行。

這個錯誤雖然很低階,但是大家經常犯。所以在**review的時候,一定要含情脈脈多加凝視,多加考慮再三。否則後續出問題,排查起來問題,坑坑可不會輕易饒過你。嘿嘿~

4. linux命令的濫用(awk/sed/sort/rsync)

這件事也讓我明白:

(1)業務程式的可讀性擺在第一位

如果程式不可讀,一是容易邏輯混亂,滋生bug。二是後續接手的人不好維護,無法清晰理解程式邏輯,從而引進更多bug。

(2)每種程式語言或者工具都有其使用條件和侷限性

awk固然簡短好用,但是在實現多程序處理和複雜業務邏輯處理的時候還是有其侷限性,畢竟它只是乙個工具語言,而非乙個適用於實現複雜業務邏輯的高階語言。為什麼會誤用awk和rsync,關鍵還是對工具了解不深,從而無法了解工具的適用場景和使用侷限。

(3)盡可能簡單,少冗餘(keep it ******)

最近遇到的一些坑

c 邏輯判斷的順序是從左向右的。conditiona conditionb 與 conditionb conditiona並不一定等價。舉個例子 void insertsort vector arr,int length arr j 1 key 由於j是int型別,所以在key 5的那次迴圈裡,j最...

最近寫cpp遇到的一些問題

cmp中需要使用弱排序,對於單個元素排序 不能是a b bool cmp int a,int b 二維比較 bool cmp const vector int a,const vector int b 若想通過gprof看到程式各部分的效能,則在編譯命令中不能使用gcc優化 o2,o3 gcc優化會...

最近的一些感想

第一次出差,感覺就是客戶最急迫的事情就是解決他們的現場問題,經過qa的多次測試來發現其中可能存在的隱患,並解決他們,為量產做好準備。然後就是如果有經過測試的rom.bin最好儲存乙份,以免在更新軟體之後測試出問題,不知道什麼原因,然後又無法恢復到以前的測試版本,出差需要帶一些筆,紙之類的東西,記錄一...