Mark Ku's Blog

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

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

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

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

設計思路

一、首先,將伺服器分組

YARP 負載平衡器將使用者流量導向 A、B 兩組伺
在 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 服務用戶 )

滾動式佈署架構:YARP導向Batch B,Gitlab佈署Batch
滾動式佈署架構:YARP導向Batch B,Gitlab佈署Batch

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

2.佈署應用程式

3.內部測試

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

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

YARP滾動式佈署架構,用戶透過YARP連接Batch A/B
YARP滾動式佈署架構,用戶透過YARP連接Batch A/B

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

作者

Mark Ku

擁有 10+ 年經驗的資深軟體工程師,現為 AI 應用 Builder,專注於大型平台架構與簡化複雜系統設計,從電商系統到訂閱與收費平台,結合 AI Agent、AI 整合與自動化開發,打造高效率且可持續演進的產品技術基礎。閱讀更多

覺得這篇有幫助?

作者做的免費工具、每日 Podcast 與電子報,都在這裡。

Mark Ku · 本文採用 CC BY 4.0 授權,轉載請註明作者並附上原文連結。

留言

訂閱電子報

訂閱後即時收到新文章通知,不錯過任何技術分享。

提交即表示同意接收電子報,隨時可

熱門文章

View all
Mark Ku
··603

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案

Oracle Cloud 永久免費方案 Linux 主機及固定 IP :0 元打造雲端解決方案
Mark Ku
··440

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南

告別 Postman 收費陷阱!開源 Git 原生 API 測試神器 Bruno 實戰指南
Mark Ku
··323

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略

一款免費開源類似於 Notion 類知識庫系統 — Outline Wiki 佈署與備份全攻略
Mark Ku
··239

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1

打造高效 API 管理平台:從 0 開始部署 Kong Gateway - Part 1
Mark Ku
··222

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取

在 Ubuntu 上設置 Samba 來共享資料夾,讓 Windows 11 用戶可以存取
Mark Ku
··199

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調

訓練自己的 AI 語音:硬體門檻、開源模型比較與 LoRA 微調