1. 程式人生 > 其它 >提高系統穩定性-灰度策略和容錯

提高系統穩定性-灰度策略和容錯

技術標籤:java

前言

構建穩定的系統, 特別在流量大的系統中, 一定的灰度策略和容錯性是很保證系統正常執行的必要條件

列印日誌被開除的這幾次

1. 影響監控指標和報警

之前別人已經列印了一行日誌:

log.info("info1 - a:{},b:{}", a, b);

我想打個 c

log.info("info1 - a:{},c:{},b:{},", a, c, b);

結果有 b 這個輸出到日誌參與了監控和報警, 配置的是包含 info1 關鍵詞, 第一個逗號和第二個逗號中的最大值大於 100 的時候報警, 我們的 c 最小值是 101, 導致釋出的時候出現了大量的報警

2. 佔位符格式與傳引數量不對

我就想列印一下 a 和 b, 結果寫成了

log.info("info1 - a:{},b:{}", a);

導致列印的時候報錯了, 整個介面都掛掉了

3. 引數異常導致程式崩掉

空指標:

log.info("info1 - a:{}", a.getAttribute1().getInnerAttribute2());

a.getAttribute1() 是空的時候就會這個空指標的錯了

io異常等:

log.info("info1 - a:{}", queryAFromRemote());

請問的時候報錯也會導致正常的程式碼終止

踩了 bugjson 的記憶體洩漏等:

log.info("info1 - a:{}", FastJson.toJsonString(a));

4. 列印日誌導致介面超時或系統過載

列印日誌本身分為同步和非同步, 但不管什麼配置都會有響應的時間消耗, 本身比如閘道器, 其他依賴自身系統設定的客戶端超時時間呀都是在長期磨合中配置的, 一行日誌可能會成為壓倒駱駝的最後一根稻草, 觸發服務之間連鎖重試等

灰度策略和容錯

我們釋出的時候可以採用灰度策略, 一般灰度策略是這樣的: 根據使用者 id 的後 x 位來做入參, 在微服務中的遠端配置中心配置灰度比例, 比如 1, 如果這 x 位小於灰度比例, 就走新的程式碼, 否則就走老的程式碼, 這大家有的時候發現微信有些新特性其他小夥伴有, 你卻沒有, 可能就是你的工號尾數比較靠後.

容錯呢, 其實就是加上 try-catch,

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-I5VenZq0-1607767140112)(/assets/2020121200.png)]

灰度和 try-catch 不僅僅是在這種新加的程式碼裡, 一些比較邊緣的功能(比如說一些營銷資訊或者標籤資訊等非必要資訊的查詢和展示)也可以在流量變大的時候用來降級或者在報錯的時候不影響主要功能, 在大流量的系統裡確實是很好用的功能

程式碼實現

先定義一個灰度弱依賴方法

public interface GrayWeakFunction<T, R> {

    default boolean isBusinessOpen() {
        return false;
    }

    R executeNew(T request);

    R executeOld(T request);
}

實現根據使用者工號灰度的抽象類:

public abstract class BaseUserIdGrayWeakFunction<T, R> implements GrayWeakFunction<T, R> {
    @Override
    public boolean isBusinessOpen() {
        return Constant.REQUEST_USER_ID.get() < queryFromConfigCenter();
    }

    protected abstract Integer queryFromConfigCenter();
}

編寫模板:

public class GrayWeakTemplate {
    private GrayWeakTemplate() {
    }

    public static <T, R> R doWeakFunction(
        GrayWeakFunction<T, R> weakFunction, T request, String tip) {
        try {
            return weakFunction.isBusinessOpen() ? weakFunction.executeNew(request) :
                weakFunction.executeOld(request);
        } catch (Exception e) {
            System.out.println(tip + e.getMessage());
            return null;
        }
    }
}

微信公眾號:
在這裡插入圖片描述

實現之前因為試著分享技術建立並寫了這個公眾號. 最近發現這個公眾號閱讀量很低, 所以這兩天我留心了下, 發現有一些同學經常在閱讀時間非常不專注, 雖然我不奢求大家一直閱讀關注這個號, 但是連續幾天都這麼忽視這個號, 我還是非常意外的. 今天早上 10 點開始到現在, 這個號的關注者還是沒有加, 好奇, 一直就不關注轉發點贊這個號的人是沒空麼, 這很常見嗎?