現今的電子商務網站,近乎 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
最後參考微軟官方 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"; }