天天看點

一次線上優化引發生産問題的思考

前言

在程式員的系統開發中,有些開發是從0到1的系統開發,有些開發是從1到100的系統開發,有些開發是為了保證系統更好、更穩定運作的優化。

從0到1的開發和從1到100的開發,是為了系統更好的實作功能,需要快速疊代,可以不斷的優化、上線、再優化、再上線。

優化需求,是為了更好的使用系統,讓系統更好、更穩定的運作,但是優化不能夠影響到原有線上的功能,但是我們需要優化。為了防止優化過程中影響到其他代碼,這裡有幾個總結的方案可供參考。

使用開關配置

目前我們項目中配置中心使用的是Apollo,其他配置中心或者配置檔案也是同樣的道理。

  • 優點:①可配置化,②可以直接防止優化代碼報異常影響到原來的邏輯
  • 缺點:開關是一刀切,要麼走優化邏輯,要麼不走優化邏輯
public static void main(String[] args) {
        // 這裡可以使用開關配置,如果有問題可以使用開關及時關掉
        String switchKey = ApolloUtil.getProperty("business_key", "false");
        if (Boolean.TRUE.toString().equalsIgnoreCase(switchKey)){
           // 優化邏輯
        }
        // 原來業務邏輯
    }      

使用 try-catch

  • 優點:即使優化代碼出現異常也會直接出現的異常吞掉
public static void main(String[] args) {
        try {
            // 優化邏輯
        }catch (Throwable e){
            // 這裡可以把優化邏輯代碼出現的異常吞下,防止系統異常之類的
            log.error("the exception is {}", e.getMessage(), e);
        }
        // 原來業務邏輯
    }      

随機調整

  • 優點:①類似于灰階釋出,②可配置化,可以靈活調整比例
  • 缺點:影響部分使用者的使用
public static void main(String[] args) {
        int limitNum = Integer.parseInt(ApolloUtil.getProperty("limitNum", "10"));
        // 10%, 90% 類似于灰階釋出,可以逐漸放開
        if (limitNum > Math.random() * 100){
            // 優化邏輯
        }
        // 原來業務邏輯
    }      

聯合使用

  • 核心:結合 try-catch 和可配置化
public static void main(String[] args) {
        String str = "";
        boolean flag = optimizationLogic(str);
        if (flag){
            // 根據 flag 為 true 情況下的邏輯
        }else {
            // 根據 flag 為 false 情況下的邏輯
        }
        // 原來的邏輯
    }
    /**
     * 優化邏輯,false 表示不走,true 表示走
     * @param code
     * @return
     */
    private static boolean optimizationLogic(String code){
        try {
            if (null == code || code.isEmpty()){
                return false;
            }
            String switchKey = ApolloUtil.getProperty("business_key", "false");
            if (Boolean.FALSE.toString().equalsIgnoreCase(switchKey)){
                return false;
            }
            // 優化邏輯
            return true;
        }catch (Throwable e){
            // 這裡可以把優化邏輯代碼出現的異常吞下,防止系統異常之類的
            log.error("the exception is {}", e.getMessage(), e);
        }
       
        return false;
    }      

繼續閱讀