Mark Ku's Blog
首頁 關於我
淺談使用 Dotnet 開源 Yarp Revert Proxy 實現滾動式佈署 ( Rolling-update ) - Part's 1 設計思路
DevOps
淺談使用 Dotnet 開源 Yarp Revert Proxy 實現滾動式佈署 ( Rolling-update ) - Part's 1 設計思路
Mark Ku
Mark Ku
July 02, 2022
1 min

為何要使用滾動式更新應用程式( Rolling-update )

現今的電子商務網站,近乎 365天 * 24小時在運營,隨時隨地都有可能有會員正在使用系統,在傳統佈署網站的過程中,網站是不能運營的,也可能給用戶帶了不好的體驗,如: 用戶可能出現錯誤畫面或被強制登出,若維護停機時間太久,用戶也可能轉向其他的平台去下單,進而流失用戶。

而滾動式佈署,減少了佈署的停機時間,也給用戶更好的體驗,增加系統可以運營的時間。

參考六大步署策略,滾動式佈署,是相對容易建置的,此篇採用的微軟 dotnet 開源的 YARP 做軟體的負載平衡,設計滾動式佈署。

設計思路

一、首先,將伺服器分組


在 LTM 中,中將伺服器分成三個群組: All Server 、Batch A 、Batch B,
依據佈署階段的不同,將 LTM 切換不同的在線伺服器群組。

All Server 群組
192.168.0.1
192.168.0.2
192.168.0.3
192.168.0.4

Batch A 群組
192.168.0.1
192.168.0.3

Batch B 群組
192.168.0.2
192.168.0.4

二、佈署 Batch A 伺服器群組流程 ( 由 Batch B 服務用戶 )

1.Call LTM Api ,將伺服器群組,切到 Batch B 群組

2.佈署應用程式

3.內部測試

4.Call LTM Api,將伺服器群組,切到 Batch A 群組

三、佈署 Batch B 伺服器群組流程 ( 由 Batch A 服務用戶 )

1.佈署應用程式

2.內部測試

3.Call LTM Api,將伺服器群組,切到 All Server 群組

四、驗證生產環境網站

五、完成應用程式佈署

需要特別留意的部份

  • 後端 API 如果有異動,後端 API 得佈署完,再佈署前端
  • 後端的部份,API一定得下向相容幾個版本後,才可以移除不需要的功能。

如何實作

最後參考微軟官方 yarp的官方文件的範例程式,我們可以很輕易透過 ReassignProxyRequest 指定伺服器群組 (Cluster),並透過 API 修改目前的伺服器的群組,達到 AB test 及 滾動式佈署, 但因為暫時沒時間實作,先將設計概念撰寫下來。

public void Configure(IApplicationBuilder app, IProxyStateLookup lookup)
    {
        app.UseRouting();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapReverseProxy(proxyPipeline =>
            {
                // Custom cluster selection
                proxyPipeline.Use((context, next) =>
                {
                    if (lookup.TryGetCluster(ChooseCluster(context), out var cluster))
                    {
                        context.ReassignProxyRequest(cluster);
                    }

                    return next();
                });
                proxyPipeline.UseSessionAffinity();
                proxyPipeline.UseLoadBalancing();
            });
        });
    }

private string ChooseCluster(HttpContext context)
{
        // Decide which cluster to use. This could be random, weighted, based on headers, etc.
        return Random.Shared.Next(2) == 1 ? "cluster1" : "cluster2";
}

參考資料

先前撰寫 YARP 的相關文章

Yarp 官方文件 - ab testing

应用不停机发布的思考与初识

Six Strategies for Application Deployment


Tags

Mark Ku

Mark Ku

Software Developer

9年以上豐富網站開發經驗,開發過各種網站,電子商務、平台網站、直播系統、POS系統、SEO 優化、金流串接、AI 串接,Infra 出身,帶過幾次團隊,也加入過大團隊一起開發。

Expertise

前端(React)
後端(C#)
網路管理
DevOps
溝通
領導

Social Media

facebook github website

Related Posts

輕量化且免費,適用小團隊的 CICD - 使用 Gitlab Pipeline 及 地端 Gitlab Runner
輕量化且免費,適用小團隊的 CICD - 使用 Gitlab Pipeline 及 地端 Gitlab Runner
May 22, 2022
1 min

Quick Links

關於我

Social Media