服務器掛了可能引發的問題

今天遇到三個測試提過來的問題 
1、測試新上傳的圖片獲取不到,返回的圖片名稱也是null  -----圖片服務器掛了
    原因開發環境的圖片服務器掛了
2、測試新建模板的時候失敗----服務器沒有啓動相關服務
     經過排查原因測試環境的mongo服務器沒有啓動我們項目mongo表對應的服務
    我的處理辦法:先切換到測試環境進行測試確實存在這個問題,後來啓動我本地進行測試,我本地是好的,說明是測試的環境某個環節出問題了,打測試的包,切換host在本地進行測試,程序報錯,鏈接不到某臺服務器,即測試環境的服務器的我們庫所在端口的服務沒有啓動。
3、測試新建活動失敗  ---redis 緩存的問題
在解決這個問題的時候就比較坑了,因爲剛剛剛找測試啓動了斷了連接的mongo表所在的服務器,
所以排除了是環境問題,但是經過跟蹤調試確實是程序裏面的某個該去mongo表裏面取值的地方沒有獲取到值,導致後面出現的異常問題,
這時控制檯報錯有異常拋錯,過了一會又出現mongo連接不上的異常,再次詢問測試的環境搭建人員查找原因,得到的原因如下:
剛剛啓動命令少加了後臺運行的參數。
好了解決完了這個問題應該都OK了吧,但是還沒結束。。。
控制檯雖然沒有再報連接不上mongo所在那臺服務器的錯誤,但是異常信息仍然存在,依然一個值獲取爲空導致的異常:
哈哈下面來看看這個值獲取的代碼吧:
    public PagePrototype findPagePrototypeCached(Long id) {
        String key = CacheConstants.getPagePrototypeCacheKey(id);
        PagePrototype prototype = redisUtil.getObject(key, PagePrototype.class);

        if(prototype != null){
            return prototype;
        }
        prototype = pagePrototypeDao.queryById(id);
        if (prototype != null) {
            String contentPath = prototype.getContentPath();
            prototype.setContent(fileEntryManager.getFileContent(contentPath,MongoTable.TABLE_PAGE_PROTOTYPE));
            String demoPath = prototype.getDemoPath();
            prototype.setDemo(fileEntryManager.getFileContent(demoPath,MongoTable.TABLE_PAGE_PROTOTYPE));
            redisUtil.setObjectByExpire(key, prototype,CacheConstants.CACHE_ONE_WEEK);
        }
        return prototype;
    }    

這裏呢某個重要值就是Demo啦,跟據我們的代碼可以看到Demo值是不可能爲空的,因爲在初始化進來的時候就會
prototype.setDemo(fileEntryManager.getFileContent(demoPath,MongoTable.TABLE_PAGE_PROTOTYPE));
通過這句去mongo裏面取值set進去。

好了巧合來了:
剛剛我們的mongo掛了,所以第一次進來的時候當然沒走緩存,因爲還沒有這個key值,然後就去我們的mongo表裏面查找唄,剛好mongo也掛了,所以就沒有從我們mongo表裏面獲取到數據,fileEntryManager.getFileContent(demoPath,MongoTable.TABLE_PAGE_PROTOTYPE)
程序繼續向下執行就把沒有獲取到數據的這個對象放到了我們的緩存裏面,方便下次用。。。。

所以就造成了我們後面修復了mongo,對象裏面的值還是沒有獲取到,
原因是後面程序都是從緩存取值,緩存剛好存的是之前沒有獲取到值的時候的對象。

像這種原因只有看代碼才找的到的!!

前面確實是環境掛了的問題,後面說說我們程序的問題吧,像這種問題我們可以在程序裏面處理一下那個可能爲空的值,當爲空的時候應該把錯誤打出來,這樣才方便查找定位問題的所在,不至於浪費一下午的時間排除問題!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章