1. 08:01 06/08/2026
Trong phát triển web/app, không phải lúc nào “deploy xong” cũng đồng nghĩa với “mở tính năng cho tất cả người dùng”. Có những tính năng cần thử nghiệm nội bộ, mở dần cho một nhóm nhỏ, hoặc cần tắt nhanh nếu phát sinh lỗi. Đây là lúc feature flag trở nên rất hữu ích.
Feature flag là gì?
Feature flag, hay feature toggle, là một cơ chế cho phép bật/tắt một phần chức năng của hệ thống thông qua cấu hình thay vì phải sửa code và deploy lại. Nói đơn giản: code đã có trên production, nhưng tính năng có thể chưa hiển thị hoặc chưa hoạt động với toàn bộ người dùng.
Ví dụ thực tế:
Một ứng dụng thương mại điện tử đang phát triển giao diện thanh toán mới. Thay vì thay thế ngay giao diện cũ cho 100% người dùng, đội phát triển có thể:
- Bật giao diện mới cho nhân viên nội bộ.
- Sau đó mở cho 5% người dùng thật.
- Theo dõi lỗi, phản hồi, tỷ lệ hoàn tất thanh toán.
- Nếu ổn định, tăng dần lên 25%, 50%, rồi 100%.
- Nếu có lỗi nghiêm trọng, tắt flag để quay lại giao diện cũ mà không cần rollback toàn bộ hệ thống.
Lợi ích chính của feature flag
1. Giảm rủi ro khi phát hành
Một thay đổi lớn thường có nhiều rủi ro: lỗi giao diện, sai logic nghiệp vụ, ảnh hưởng hiệu năng hoặc gây khó hiểu cho người dùng. Feature flag giúp phát hành theo từng bước nhỏ, dễ kiểm soát hơn.
2. Tách deploy khỏi release
Deploy là đưa code lên môi trường chạy thật. Release là cho người dùng sử dụng tính năng. Khi dùng feature flag, hai việc này không còn bắt buộc xảy ra cùng lúc. Backend và frontend có thể được deploy trước, nhưng tính năng chỉ mở khi đội sản phẩm, QA hoặc vận hành đã sẵn sàng.
3. Hỗ trợ A/B testing và phân nhóm người dùng
Feature flag có thể dùng để bật tính năng theo nhóm: người dùng mới, người dùng trả phí, một quốc gia cụ thể, một phiên bản app cụ thể hoặc một nhóm thử nghiệm. Điều này đặc biệt hữu ích khi cần so sánh hai luồng trải nghiệm khác nhau.
4. Tắt nhanh tính năng lỗi
Nếu một tính năng mới gây lỗi production, tắt flag thường nhanh và ít rủi ro hơn rollback code. Tuy nhiên, điều này chỉ hiệu quả nếu code đã được thiết kế để hoạt động ổn cả khi flag bật lẫn khi flag tắt.
Một ví dụ triển khai đơn giản
Giả sử backend trả về cấu hình:
- new_checkout_enabled: true
- max_upload_size_mb: 20
- show_referral_banner: false
Frontend có thể dựa vào các giá trị này để quyết định hiển thị giao diện thanh toán mới, giới hạn dung lượng upload hoặc ẩn banner giới thiệu bạn bè.
Ở backend, feature flag cũng có thể kiểm soát logic xử lý. Ví dụ, nếu flag “use_new_pricing_rule” đang bật, hệ thống dùng công thức tính giá mới; nếu tắt, dùng công thức cũ.
Những lưu ý quan trọng khi dùng feature flag
- Đừng để flag sống mãi: Sau khi tính năng đã ổn định và mở cho toàn bộ người dùng, nên dọn flag cũ. Quá nhiều flag tồn đọng sẽ làm code khó đọc và khó kiểm thử.
- Đặt tên rõ nghĩa: Tên như “flag1” hoặc “new_feature” rất dễ gây nhầm lẫn. Nên dùng tên cụ thể như “enable_new_checkout_flow”.
- Có giá trị mặc định an toàn: Nếu hệ thống cấu hình flag bị lỗi, ứng dụng nên rơi về trạng thái an toàn, thường là tắt tính năng mới.
- Ghi log khi cần thiết: Với các tính năng quan trọng như thanh toán, định giá, phân quyền, nên log trạng thái flag để dễ điều tra khi có sự cố.
- Kiểm thử cả hai nhánh: Nếu chỉ test khi flag bật mà quên test khi flag tắt, bạn vẫn có thể gặp lỗi với người dùng chưa được mở tính năng.
Khi nào không nên lạm dụng feature flag?
Feature flag không phải giải pháp thay thế cho thiết kế tốt hoặc kiểm thử đầy đủ. Nếu mọi đoạn code đều bị bao quanh bởi nhiều điều kiện bật/tắt, hệ thống sẽ trở nên rối rắm. Hãy dùng flag cho các trường hợp thật sự cần kiểm soát phát hành, thử nghiệm, rollback nhanh hoặc phân nhóm người dùng.
Kết luận
Feature flag là một kỹ thuật đơn giản nhưng rất thực tế trong phát triển web/app hiện đại. Nó giúp đội phát triển phát hành tính năng an toàn hơn, giảm áp lực khi deploy và phản ứng nhanh khi có lỗi. Tuy nhiên, để dùng hiệu quả, cần có quy ước đặt tên, cơ chế dọn dẹp flag cũ, kiểm thử đầy đủ và luôn nghĩ đến trạng thái an toàn khi cấu hình gặp vấn đề.