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ả.