AllianceProject Handbook
← Knowledge

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.

Cập nhật 12/09/2026releasefeature flagrủi ro

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ầnRelease từng phần
Người dùng dính lỗi100%0,5% rồi 2% rồi 10%
Thời gian rút lui1–3 ngày (chờ duyệt)30 giây (tắt cờ)
Biết được lỗi từ đâuKhó, nhiều thay đổi cùng lúcDễ, đ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ạiDùng đểVòng đờiAi bật tắt
Cờ releaseGiấu tính năng chưa xongXoá ngay sau khi bật 100%Chủ sản phẩm
Cờ thử nghiệmChia nhóm để so sánhHết thí nghiệm là xoáChủ sản phẩm
Cờ vận hànhTắt tính năng nặng khi quá tảiSống lâuTrực vận hành
Cờ quyềnMở tính năng cho nhóm khách nhất địnhSống lâuChủ 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ờ

  1. 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ờ.
  2. 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.
  3. 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.
  4. 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ử.
  5. 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ử.
  6. 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ấcTỷ lệ người dùngỞ quy mô 500.000Chờ tối thiểuĐiều kiện đi tiếp
0Nội bộ đội~50 người1 ngàyĐội dùng thật, không thấy lỗi chặn
10,5%2.500 người1 ngàyChỉ số sức khoẻ không xấu đi
22%10.000 người1 ngàyKhông có lỗi mới đáng kể
310%50.000 người2 ngàyChỉ số nghiệp vụ không xấu đi
450%250.000 người2 ngàyNhư trên, và hệ thống chịu được tải
5100%500.000 ngườiXoá 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%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ậtTỷ lệ phiên không crash, tỷ lệ lỗi mạng, thời gian phản hồi
Hành viTỷ 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ùngSố 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ố:

  1. 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.
  2. Giảm tỷ lệ về nấc trước đó, nếu lỗi chỉ ảnh hưởng một phần.
  3. Chặn phiên bản từ phía server, nếu lỗi nằm ngoài phạm vi cờ.
  4. Đẩ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

ModuleVí dụ cờ thường dùng
ChatBật cách đồng bộ offline mới; tắt xem trước liên kết khi server quá tải
TaskBật bộ quy tắc phân quyền mới; tắt thông báo hàng loạt
Bán hàngBậ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.