部署策略(Deployment Strategies)

是什麼?

部署策略定義如何將新版本的應用程式發佈到生產環境,同時最小化停機時間和風險。核心目標是零停機(Zero Downtime)快速回滾(Rollback)

ℹ️為什麼需要部署策略

最原始的部署方式是「停機 → 換版本 → 重啟」。但現代系統要求 24/7 可用,任何停機都可能造成營收損失和使用者流失。部署策略讓你在不停機的情況下安全更新。

核心觀念

常見誤區

⚠️常見誤區

  • Blue-Green 不需要額外資源:Blue-Green 需要雙倍的基礎設施(兩套完整環境同時運行),成本最高
  • Canary 只看錯誤率:除了 Error Rate,還要監控延遲(Latency)、CPU/Memory、業務指標(如轉換率)。單看錯誤率可能漏掉效能退化
  • Rolling 不會有版本不一致問題:Rolling 過程中新舊版本同時在線,API 必須向後相容(Backward Compatible)

流程/步驟

1

準備新版本

Build 並測試新版本的 Artifact / Image

2

部署到目標環境

Blue-Green: 部署到 Green;Canary: 部署到 Canary 群組

3

健康檢查

確認新版本的 Health Endpoint 回傳 200

4

切換流量

Blue-Green: 切 LB;Canary: 逐步增加流量比例

5

監控指標

觀察 Error Rate、Latency、業務指標

6

確認或回滾

指標正常則完成部署,異常則自動回滾

流程解讀:新版本 Build 後部署到隔離環境。健康檢查確認基本功能正常後開始切換流量。持續監控關鍵指標,異常時自動觸發回滾。整個流程自動化後,部署從「緊張事件」變成「日常操作」。

程式碼範例

C# 版本

csharp
// ASP.NET Core — Health Check 端點(部署策略的基礎)
builder.Services.AddHealthChecks()
    .AddDbContextCheck<AppDbContext>()        // 檢查資料庫連線
    .AddRedis(config["Redis:Connection"]!)    // 檢查 Redis
    .AddCheck("startup", () =>
    {
        // 應用程式初始化完成才回傳 Healthy
        return _isReady
            ? HealthCheckResult.Healthy()
            : HealthCheckResult.Unhealthy("Still warming up");
    });
 
app.MapHealthChecks("/health/live", new HealthCheckOptions
{
    Predicate = _ => false  // Liveness: 只檢查程序存活
});
 
app.MapHealthChecks("/health/ready", new HealthCheckOptions
{
    Predicate = _ => true   // Readiness: 檢查所有依賴
});

TypeScript 版本

typescript
// Kubernetes Deployment — Rolling Update
// deployment.yaml
yaml
# Kubernetes Rolling Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 4
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 1    # 最多 1 個 Pod 不可用
      maxSurge: 1           # 最多多出 1 個 Pod
  template:
    spec:
      containers:
        - name: myapp
          image: myapp:v2
          ports:
            - containerPort: 3000
          # 健康檢查
          livenessProbe:
            httpGet:
              path: /health/live
              port: 3000
            initialDelaySeconds: 10
            periodSeconds: 5
          readinessProbe:
            httpGet:
              path: /health/ready
              port: 3000
            initialDelaySeconds: 5
            periodSeconds: 3

Python 版本

python
# FastAPI — Health Check 端點
from fastapi import FastAPI
import asyncpg
 
app = FastAPI()
db_pool = None
 
@app.get("/health/live")
async def liveness():
    """程序存活檢查"""
    return {"status": "alive"}
 
@app.get("/health/ready")
async def readiness():
    """就緒檢查 — 所有依賴都正常才回傳 200"""
    checks = {}
 
    # 檢查資料庫
    try:
        async with db_pool.acquire() as conn:
            await conn.fetchval("SELECT 1")
        checks["database"] = "healthy"
    except Exception:
        checks["database"] = "unhealthy"
        return JSONResponse(status_code=503, content={"status": "not ready", "checks": checks})
 
    return {"status": "ready", "checks": checks}
 
# Canary 部署的 Feature Flag 搭配
@app.get("/api/feature")
async def feature(request: Request):
    """用 Feature Flag 控制新功能的曝光比例"""
    user_id = get_user_id(request)
    if feature_flag.is_enabled("new-feature", user_id, percentage=10):
        return new_feature_response()
    return old_feature_response()

架構圖/概念圖

Load Balancer
95% traffic
Blue (v1 - Current)
Green (v2 - New)
metrics
Canary (5% traffic)
metrics
Monitoring

Load Balancer 是流量切換的樞紐。Blue-Green 策略在 Blue 和 Green 之間一次切換所有流量。Canary 策略先導入少量流量到新版本,搭配 Monitoring 觀察指標後再逐步擴大。

實戰補充

Q: 三種策略怎麼選?

A: Blue-Green:需要最快回滾速度、可以承擔雙倍資源成本。Canary:想要最低風險、有良好的監控基礎設施。Rolling:資源有限、願意接受短暫的新舊版本共存。大多數 Kubernetes 環境預設用 Rolling。

Q: 資料庫 Schema 變更怎麼配合部署?

A: 資料庫變更必須向後相容。先加新欄位(不刪舊的),部署新版本確認穩定後,再用另一次部署刪除舊欄位。這叫 Expand and Contract 模式。

Q: 如何實現自動回滾?

A: 在 Canary 或 Rolling 部署中,設定自動化的指標檢查(Error Rate 超過 1%、P99 延遲超過 500ms)。一旦觸發閾值,自動執行回滾腳本。Kubernetes 的 kubectl rollout undo 可以一鍵回滾。

理解測驗

🤔 Blue-Green 部署的最大優點和最大缺點分別是什麼?

🤔 Canary 部署為什麼叫 Canary(金絲雀)?

🤔 Rolling 部署過程中為什麼 API 必須向後相容?

重點整理

💡一句話記住

部署策略 = 不停機換版本的藝術,核心是流量控制和快速回滾。 口訣:「Blue-Green 切、Canary 試、Rolling 滾」

| 策略 | 回滾速度 | 資源需求 | 風險 | 適用場景 | |------|---------|---------|------|---------| | Blue-Green | 極快 | 雙倍 | 低 | 關鍵服務 | | Canary | 快 | 少量額外 | 最低 | 大流量服務 | | Rolling | 慢 | 最少 | 中 | K8s 預設 |

你可能也想看

Docker 容器化Infrastructure as Code

按 ← → 鍵切換課程