1. 15:25 12/10/2026
1. Tại sao cần Feature Flag?
- Cho phép bật/tắt tính năng mà không cần triển khai lại mã.
- Hỗ trợ thử nghiệm A/B, phát hành dần (canary) và rollback nhanh khi gặp sự cố.
- Giảm rủi ro khi hợp nhất nhánh dài (long‑lived branch) vào main.
2. Kiến trúc đề xuất
- **Flag Service**: một dịch vụ nhỏ (Node/Go) lưu trữ cờ trong cơ sở dữ liệu hoặc Redis, cung cấp API REST/GraphQL.
- **Client SDK**: gói npm/@react-native-community/hooks dùng React Context để phân phối cờ đến toàn bộ ứng dụng.
- **Cache cục bộ**: lưu cờ trong AsyncStorage (RN) hoặc localStorage (web) để hoạt động offline‑first.
- **Realtime updates**: dùng WebSocket hoặc Server‑Sent Events để đẩy thay đổi cờ mà không cần reload.
3. Triển khai SDK mẫu (TypeScript)
```ts
export const FlagContext = createContext<Record<string, boolean>>({});
export function FlagProvider({children, initialFlags}) {
const [flags, setFlags] = useState(initialFlags);
useEffect(() => {
const ws = new WebSocket(`wss://flags.example.com/stream`);
ws.onmessage = e => setFlags(JSON.parse(e.data));
return () => ws.close();
}, []);
return <FlagContext.Provider value={flags}>{children}</FlagContext.Provider>;
}
export function useFlag(key: string) {
const flags = useContext(FlagContext);
return flags[key] ?? false;
}
```
4. Sử dụng trong component
```tsx
function NewDashboard() {
const enableNewUI = useFlag('new_dashboard');
return enableNewUI ? <DashboardV2 /> : <DashboardV1 />;
}
```
5. Quy trình vận hành
- **Tạo cờ**: qua trang admin, đặt tên, mô tả, mặc định tắt.
- **Phân đoạn**: gán cờ cho nhóm người dùng (beta, internal, all).
- **Giám sát**: log việc bật/tắt kèm userId để phân tích sau này.
- **Dọn dẹp**: định kỳ xóa cờ đã ổn định > 30 ngày để tránh rối code.
6. Mẹo thực tế
- Luôn cung cấp giá trị mặc định an toàn (false) để tránh lỗi khi service недоступна.
- Viết test unit cho hook `useFlag` với mock context.
- Kết hợp với feature branch strategy: mỗi PR tạo cờ riêng, merge sau khi QA pass.
- Sử dụng TypeScript interface cho danh sách cờ để IDE gợi ý và tránh typo.
Với cách tiếp cận này, đội ngũ có thể phát hành tính năng nhanh chóng, an toàn và dễ dàngrollback khi cần, đồng thời giữ cho codebase sạch sẽ và dễ bảo trì.