Phát hành
Release từng phần và feature flag
Cách đưa thay đổi ra người dùng theo tỷ lệ tăng dần, tách việc merge code khỏi việc bật tính năng, và rút lui trong vài giây thay vì vài ngày.
Nội dung bài
Vấn đề của release một phát ăn ngay
Bật một tính năng mới cho 100% người dùng cùng lúc nghĩa là: nếu có lỗi, mọi người dùng đều dính, và cách sửa duy nhất là đẩy một bản mới qua cửa hàng ứng dụng — mất một tới ba ngày chờ duyệt. Trong ba ngày đó, không làm được gì cả.
Release từng phần đổi tình huống đó thành: lỗi dính 0,5% người dùng, tắt trong 30 giây.
| Bật hết một lần | Release từng phần | |
|---|---|---|
| Người dùng dính lỗi | 100% | 0,5% rồi 2% rồi 10% |
| Thời gian rút lui | 1–3 ngày (chờ duyệt) | 30 giây (tắt cờ) |
| Biết được lỗi từ đâu | Khó, nhiều thay đổi cùng lúc | Dễ, đang bật đúng một thứ |
Tách merge khỏi bật
Nguyên tắc nền tảng: merge code và bật tính năng là hai việc khác nhau, ở hai thời điểm khác nhau.
Code mới merge vào main sớm, nằm sau một feature flag đang tắt. Người dùng không thấy
gì. Đội vẫn tích hợp liên tục, không có branch nào sống lâu, không có lần merge khổng lồ
cuối dự án.
Đây là điều kiện để giữ được luật branch tối đa 2 ngày ở quản lý branch và commit.
Bốn loại cờ
| Loại | Dùng để | Vòng đời | Ai bật tắt |
|---|---|---|---|
| Cờ release | Giấu tính năng chưa xong | Xoá ngay sau khi bật 100% | Chủ sản phẩm |
| Cờ thử nghiệm | Chia nhóm để so sánh | Hết thí nghiệm là xoá | Chủ sản phẩm |
| Cờ vận hành | Tắt tính năng nặng khi quá tải | Sống lâu | Trực vận hành |
| Cờ quyền | Mở tính năng cho nhóm khách nhất định | Sống lâu | Chủ sản phẩm |
Ba loại đầu có hạn sử dụng. Loại đầu tiên là loại hay bị bỏ quên nhất.
Luật về cờ
- Mỗi cờ có một chủ và một ngày hết hạn ghi ngay lúc tạo. Không có hai thứ đó thì không được tạo cờ.
- Cờ release phải bị xoá trong 2 sprint sau khi bật 100%. Quá hạn thì nó thành một hạng mục nợ kỹ thuật có người nhận.
- Không lồng cờ vào nhau. Hai cờ lồng nhau tạo ra 4 nhánh, ba cờ tạo ra 8 — không ai test hết được.
- Trạng thái mặc định khi không đọc được cấu hình là trạng thái an toàn, tức là tắt. App mất mạng không được tự bật tính năng đang thử.
- Cả hai nhánh của cờ đều phải chạy được. Nhánh cũ không được mục nát trong lúc nhánh mới đang thử.
- Danh sách cờ đang sống được soát hằng tháng. Trên 15 cờ cùng lúc là dấu hiệu đội đang mất kiểm soát.
Luật 2 quan trọng hơn vẻ ngoài của nó: cờ không xoá sẽ tích lại, và mỗi cờ nhân đôi số đường đi trong code. Sau một năm không dọn, không ai còn biết app thật sự đang chạy nhánh nào.
Nấc tăng dần
Lịch mặc định cho một tính năng có rủi ro trung bình:
| Nấc | Tỷ lệ người dùng | Ở quy mô 500.000 | Chờ tối thiểu | Điều kiện đi tiếp |
|---|---|---|---|---|
| 0 | Nội bộ đội | ~50 người | 1 ngày | Đội dùng thật, không thấy lỗi chặn |
| 1 | 0,5% | 2.500 người | 1 ngày | Chỉ số sức khoẻ không xấu đi |
| 2 | 2% | 10.000 người | 1 ngày | Không có lỗi mới đáng kể |
| 3 | 10% | 50.000 người | 2 ngày | Chỉ số nghiệp vụ không xấu đi |
| 4 | 50% | 250.000 người | 2 ngày | Như trên, và hệ thống chịu được tải |
| 5 | 100% | 500.000 người | — | Xoá cờ trong 2 sprint |
Tính năng chạm tới tiền, quyền hoặc dữ liệu cá nhân thì bắt đầu ở 0,1% và gấp đôi thời gian chờ ở mỗi nấc.
Cột thứ ba là cột phải đọc. Ở quy mô mục tiêu, "chỉ 2%" vẫn là mười nghìn người thật — đủ lớn để số liệu có ý nghĩa thống kê, và cũng đủ lớn để một lỗi nghiêm trọng thành chuyện lớn. Xem chất lượng ở quy mô 500.000 người dùng.
Chỉ số phải nhìn ở mỗi nấc
Trước khi mở rộng, so sánh nhóm đang bật với nhóm chưa bật:
| Nhóm chỉ số | Cụ thể |
|---|---|
| Sức khoẻ kỹ thuật | Tỷ lệ phiên không crash, tỷ lệ lỗi mạng, thời gian phản hồi |
| Hành vi | Tỷ lệ hoàn thành luồng chính, số lần thử lại |
| Nghiệp vụ | Số tin nhắn gửi, số task tạo, số đơn chốt — tuỳ module |
| Tiếng nói người dùng | Số phiếu hỗ trợ, đánh giá trên cửa hàng |
Luật dừng: bất kỳ chỉ số nào xấu đi rõ rệt ở nhóm đang bật thì tắt cờ ngay, rồi mới điều tra. Không thương lượng, không chờ họp. Tắt trước, hiểu sau.
Rút lui
Thứ tự ưu tiên khi có sự cố:
- Tắt cờ. Vài giây, không cần duyệt cửa hàng. Luôn thử cách này trước.
- Giảm tỷ lệ về nấc trước đó, nếu lỗi chỉ ảnh hưởng một phần.
- Chặn phiên bản từ phía server, nếu lỗi nằm ngoài phạm vi cờ.
- Đẩy bản vá qua cửa hàng. Chậm nhất, để cuối cùng.
Điều kiện để cách 1 luôn dùng được: mọi tính năng đáng kể đều phải nằm sau một cờ ngay từ đầu, không phải thêm cờ vào lúc đã có sự cố.
Ai được bật tắt
- Bật lên nấc cao hơn: chủ sản phẩm, sau khi xem chỉ số.
- Tắt khẩn cấp: bất kỳ ai đang trực, không cần xin phép, không cần họp.
- Mọi lần bật tắt đều được ghi lại: ai, lúc nào, tỷ lệ nào, vì sao.
Quyền tắt khẩn cấp không cần xin phép là quyền quan trọng nhất ở đây. Người thấy sự cố lúc 2 giờ sáng phải dừng được nó ngay, không phải đi tìm người duyệt.
Cờ trong ba module
| Module | Ví dụ cờ thường dùng |
|---|---|
| Chat | Bật cách đồng bộ offline mới; tắt xem trước liên kết khi server quá tải |
| Task | Bật bộ quy tắc phân quyền mới; tắt thông báo hàng loạt |
| Bán hàng | Bật cổng thanh toán mới theo tỷ lệ; tắt khuyến mại khi tính sai |
Riêng Bán hàng: cờ chạm tới tính tiền phải chạy đối chiếu song song — tính bằng cả cách cũ và cách mới, so sánh kết quả, ghi log khi lệch — trước khi cho cách mới thật sự quyết định số tiền.

