Progressive Delivery Cho Developer: Rollout An Toàn Hơn

Karify98 & Amy 🌸·
Cover Image for Progressive Delivery Cho Developer: Rollout An Toàn Hơn

Deploy Toàn Bộ = Cược Toàn Bộ

Một startup deploy bản update cho production vào thứ Sáu. 15 phút sau, 40% user gặp lỗi. rollback mất 20 phút. Doanh thu mất, reputation sụp.

Vấn đề không nằm ở code. Vấn đề nằm ở cách deploy.

Progressive Delivery giải quyết bài toán đó — thay vì push một lần cho tất cả, rollout từng phần, quan sát, rồi quyết định tiếp hay dừng lại.

Progressive Delivery Là Gì?

TL;DR: Deploy từng bước nhỏ, có kiểm soát. Nếu có vấn đề → dừng ngay, không ảnh hưởng toàn bộ hệ thống.

Progressive Delivery mở rộng ý tưởng của CI/CD. Nếu CI/CD giúp code đến production nhanh, Progressive Delivery giúp code đến production an toàn. Có 3 chiến lược chính:

  • Canary Release: Deploy cho 5% user trước. Nếu ổn → thêm 10%, 25%, 100%. Nếu lỗi → rollback tức thì.
  • Blue-Green Deployment: Chạy 2 phiên bản song song. Switch traffic từ blue sang green khi sẵn sàng. Rollback = switch lại.
  • Feature Flag: Deploy code lên production nhưng tắt tính năng mới. Bật dần dần theo user segment, thời gian, hoặc % traffic.

Mỗi chiến lược phù hợp với một scenario. Không có cái nào tốt nhất — chỉ có cái phù hợp nhất.

Tại Sao Developer Cần Quan Tâm?

1. Giảm blast radius

Khi deploy 100% production cùng lúc, mọi lỗi đều ảnh hưởng toàn bộ user. Progressive Delivery giới hạn thiệt hại trong phạm vi nhỏ.

2. Rollback nhanh

Với blue-green, rollback chỉ là switch traffic. Không cần redeploy, không cần rollback code. 30 giây thay vì 30 phút.

3. Data-driven decisions

Rollout 5% trước cho phép quan sát metric — error rate, latency, business metric — trước khi commit toàn bộ. Không cần đoán, có data.

4. Team confidence

Developer sợ deploy vì sợ lỗi. Progressive Delivery giảm rủi ro → giảm sợ → deploy thường xuyên hơn → release cycle ngắn hơn.

Hands-on: Canary Release với GitHub Actions

Ví dụ thực tế — canary deploy 10% traffic lên Kubernetes, rồi gradual rollout.

Bước 1: Deploy với Replica Fraction

# canary-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-canary
  labels:
    app: myapp
    track: canary
spec:
  replicas: 1  # 10% của 10 replicas
  selector:
    matchLabels:
      app: myapp
      track: canary
  template:
    metadata:
      labels:
        app: myapp
        track: canary
    spec:
      containers:
      - name: myapp
        image: myapp:v2.0.0
        ports:
        - containerPort: 3000

Bước 2: Service Split Traffic

# service.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp
spec:
  selector:
    app: myapp  # Match cả stable và canary
  ports:
  - port: 80
    targetPort: 3000

Kubernetes Service match cả hai pods (stable + canary). 9 replicas stable, 1 replica canary → khoảng 10% traffic vào canary.

Bước 3: Monitor và Rollout

# Kiểm tra error rate trên canary
kubectl logs -l track=canary --tail=100 | grep ERROR

# Nếu ổn → scale up canary
kubectl scale deployment myapp-canary --replicas=3

# Nếu có vấn đề → xóa canary
kubectl delete deployment myapp-canary

Bước 4: Promote hoặc Rollback

# Promote: update stable deployment
kubectl set image deployment/myapp-stable myapp=myapp:v2.0.0

# Rollback: giữ nguyên stable, xóa canary
kubectl delete deployment myapp-canary

Feature Flag — Triển Khai Dễ Dàng

Feature Flag là cách đơn giản nhất để implement progressive delivery mà không cần thay đổi infrastructure.

// Ví dụ: LaunchDarkly hoặc custom feature flag
const showNewDashboard = featureFlag.isEnabled('new-dashboard', {
  userId: currentUser.id,
  percentage: 25,  // 25% user thấy dashboard mới
});

if (showNewDashboard) {
  return <NewDashboard />;
} else {
  return <OldDashboard />;
}

Ưu điểm:

  • Deploy code bất cứ lúc nào, bật feature theo schedule
  • A/B testing tích hợp sẵn
  • Kill switch tức thì khi có vấn đề

Nhược điểm:

  • Technical debt nếu không dọn feature flag cũ
  • Thêm complexity vào codebase

Blue-Green — Switch Instant

Blue-Green đơn giản nhưng cần resource gấp đôi. Phù hợp khi downtime = zero tolerance.

# Deploy green version
kubectl apply -f green-deployment.yaml

# Test green
kubectl port-forward svc/myapp-green 8080:80

# Switch traffic
kubectl patch svc myapp -p '{"spec":{"selector":{"track":"green"}}}'

# Rollback = switch lại
kubectl patch svc myapp -p '{"spec":{"selector":{"track":"blue"}}}'

Traffic switch tức thì. Không có deployment window, không có downtime.

Chọn Chiến Lược Nào?

Canary: Phù hợp khi muốn có data trước khi commit toàn bộ. Thêm 1-2 replica, rollback nhanh bằng cách xóa canary.

Blue-Green: Phù hợp khi zero downtime là bắt buộc. Cần resource gấp đôi, nhưng rollback tức thì bằng cách switch traffic.

Feature Flag: Phù hợp khi muốn toggles tính năng hoặc A/B test. Không thêm resource, rollback tức thì bằng cách tắt flag.

Góc nhìn thực tế: Bắt đầu với Feature Flag — ít overhead nhất, hiệu quả cao nhất cho hầu hết use case. Khi cần zero downtime → thêm Blue-Green. Canary phù hợp khi có observability stack tốt (metric, alert).


Bài viết được hỗ trợ bởi AI (Amy 🌸). Nội dung đã được kiểm duyệt bởi tác giả.