穩定性保障,如何慢慢放量灰度

架構擺渡人發表於2021-12-05

大家好,我是架構擺渡人。這是實踐經驗系列的第二篇文章,這個系列會給大家分享很多在實際工作中有用的經驗,如果有收穫,還請分享給更多的朋友。

上篇文章給大家分享了開關的應用技巧,通過開關去保證上線時的穩定性。但是開關還是屬於一刀切的那種,如果流量特別大的情況下,影響面還是挺大的,所以今天就給大家再補充一種方式,灰度放量

舉個例子說明下:比如你在重構訂單詳情介面,這個介面之前是在A服務裡面,由於後續服務拆分更精細化,新拆了一個服務,需要將這個介面遷移到新服務裡面去。此時最簡單的做法就是把程式碼複製過去,然後讓客戶端用新的詳情介面。

但是這樣老版本的APP怎麼辦?這個方案只能新版本的APP可以使用。所以對外的介面是不能變的,內部需要去做路由動作,那麼最方便的肯定是在閘道器做了,所以閘道器是特別適合做灰度邏輯的地方,下面我們先來看閘道器如何做灰度。

閘道器統一灰度

閘道器預設是路由的/v1/order/detail介面,現在新加了/v2/order/detail介面,如果全部切過去,萬一有問題,所有使用者都會受到影響,所以需要灰度放量來將風險降到最低。

閘道器內部可以對指定的使用者路由到v2版本的介面,也可以根據地區路由,方式有很多種,常用的路由方式有哪些我會在下面進行講解。

應用內部自己灰度

除了在閘道器進行灰度,另一種方案就是應用內部自己灰度。也就是說APP請求到閘道器,閘道器到具體的服務,這個服務此時還是之前的老服務,需要在這個老服務呼叫新服務的介面,然後返回,這就是應用內部自己灰度的方式。

一旦灰度完成,老服務內部的程式碼就可以刪除,當請求過來的時候只需要路由到請服務即可。然後可以將閘道器路由的地址直接改成新服務的地址,此時老服務內的介面可以直接刪除,完成遷移動作。

灰度方式介紹

使用者白名單灰度

此方式較為簡單,就是構建一個使用者的白名單,可以用手機號或者使用者ID,白名單可以放在資料表裡面,也可以放在配置中心。從效能角度考慮放配置中心更合適,更新後也能實時生效。

也就是當前請求的使用者在你配置的白名單裡面,就讓他訪問新版本的介面,不在就預設還是舊介面。通過這種方式觀察一段時間,如果沒有問題,就可以加大灰度人數或者全量放開。

使用者百分比灰度

提取使用者ID的後兩位,然後產生一個隨機數,如果匹配上了,這個使用者就灰度中了。

百分比灰度

百分比灰度也是一種常用的灰度方式,此方式不會固定使用者,而是採用隨機的方式進行。如果設定了10%的灰度比例,也就是100次請求中有10次請求會被灰度中,會訪問新的介面。

當然為了影響降到最低,也可以實現千分比,萬分比,慢慢調高比例,一點點往上灰度,這種方式非常穩妥。

虛擬碼如下:

public static void main(String[] args) {
    // 灰度比例,配在配置中心
    int grayScale = 10;
    int probability = new Random().nextInt(100);
    if (probability < grayScale) {
        // 呼叫 /v2/order/detail
    } else {
        // 走本地老邏輯
    }
}

相關文章