Pernah ragu menekan tombol deploy karena takut merusak produksi? Dengan feature flag, Anda bisa merilis perubahan secara bertahap, menguji di sebagian kecil pengguna, lalu memperluas cakupan ketika metrik aman. Inilah cara modern untuk menekan risiko rilis tanpa memperlambat kecepatan tim.
Apa itu Feature Flag dan Kapan Dipakai
Feature flag (atau feature toggle) adalah saklar runtime untuk mengaktifkan/menonaktifkan perilaku aplikasi tanpa redeploy. Alih-alih mengikat perilaku pada waktu kompilasi, Anda mengontrolnya secara dinamis melalui konfigurasi terpusat atau layanan remote config.
Kapan berguna:
- Rilis bertahap: canary release, rolling out berbasis persentase, atau terbatas pada segmen pengguna/tenant tertentu.
- Kill switch: Mematikan integrasi eksternal yang sedang bermasalah untuk melindungi stabilitas.
- Eksperimen: A/B test dan multivariat untuk memvalidasi hipotesis produk.
- Refactoring besar: branch by abstraction agar migrasi aman tanpa feature branch berumur panjang.
Jenis-jenis flag
- Release flags: Mengendalikan peluncuran fitur baru.
- Experiment flags: Mengatur varian untuk uji A/B.
- Ops flags: Kill switch, mode degradasi, dan pengendali beban.
- Permission flags: Mengaktifkan kemampuan berdasarkan peran/segmentasi pelanggan.
Kapan sebaiknya tidak dipakai
- Untuk keamanan inti (mis. autentikasi) yang tak boleh bergantung pada jaringan/konfigurasi eksternal.
- Untuk kondisi permanen yang sebetulnya harus diubah menjadi config statis atau logika bisnis yang jelas.
Desain Arsitektur Feature Flag
Arsitektur umum mencakup flag store (layanan terpusat), SDK/klien untuk evaluasi, dan mekanisme caching serta polling/streaming untuk sinkronisasi. Tujuannya: evaluasi cepat, deterministik, dan aman terhadap kegagalan jaringan.
Server-side vs Client-side
- Server-side: Privasi lebih baik, aturan kompleks mudah (berbasis atribut server). Tambahan latensi kecil, tetapi bisa diatasi dengan cache lokal.
- Client-side: Respons instan di UI, tetapi perlu hati-hati agar aturan sensitif tidak terekspos. Cocok untuk aplikasi mobile/web dengan bootstrap awal yang hemat data.
Evaluasi, target, dan keadilan
- Targeting berdasarkan atribut (tenant, peran, wilayah) dan rollout bertahap berbasis persentase.
- Hashing deterministik (sticky bucketing) memastikan pengguna tetap di varian yang sama.
- Prioritas aturan: allowlist lebih tinggi dari persentase; default harus aman (fail-closed atau fail-open sesuai risiko).
Reliabilitas dan performa
- Pertahankan cache lokal dan fallback saat layanan flag tidak tersedia.
- Batasi waktu evaluasi ke sub-milidetik melalui struktur data sederhana (map setara O(1)).
- Gunakan audit log untuk setiap perubahan agar mudah ditelusuri jika metrik menurun.
Praktik Terbaik & Antipola
Untuk menjaga kecepatan sekaligus kualitas, terapkan panduan berikut.
Praktik terbaik
- Default aman: Kondisi gagal jaringan harus mengarah ke status yang meminimalkan risiko bisnis.
- Waktu kedaluwarsa: Setiap flag punya “tanggal cabut”. Bersihkan kode setelah peluncuran matang untuk mencegah utang teknis.
- Penamaan dan kepemilikan: Nama deskriptif dan jelas. Tetapkan owner dan tujuan sehingga tidak ada flag “tak bertuan”.
- Pengujian: Uji kedua jalur (on/off) di unit test, dan rekam coverage untuk jalur alternatif.
- Progresif, terukur: Mulai dari 1–5%, amati SLO, lalu tingkatkan ke 25%, 50%, 100% bila metrik aman.
- Observabilitas: Korelasikan status flag dengan metrik latensi, error rate, konversi, serta log user journey.
- Kontrol perubahan: Gunakan persetujuan berlapis untuk flag yang berdampak besar; aktifkan two-person rule jika perlu.
Antipola yang perlu dihindari
- Flag bersarang: Logika bercabang di dalam cabang membuat perilaku sulit diprediksi.
- Ledakan jumlah flag: Terlalu banyak flag tanpa pembersihan mengaburkan niat kode dan memperlambat pengambilan keputusan.
- Lingkungan-only flag: Mengandalkan env var yang butuh redeploy menghilangkan manfaat runtime toggle.
- “Sementara” yang abadi: Menggunakan flag sebagai tambalan permanen alih-alih memperbaiki akar masalah.
Contoh Implementasi Sederhana
Berikut contoh minimal untuk memahami alur. Anggap kita memiliki layanan remote config yang mengirim JSON berikut:
{
"flags": {
"checkout_new_flow": {
"percent": 25,
"allow": ["tenant_enterprise_a"],
"deny": ["tenant_blocked_z"],
"rules": [
{"attr": "country", "op": "eq", "value": "ID"}
]
}
}
}
Fungsi evaluasi deterministik (pseudocode):
function isEnabled(flagKey, userContext, config) {
const flag = config.flags[flagKey];
if (!flag) return false; // default aman
if (flag.deny.includes(userContext.tenant)) return false;
if (flag.allow.includes(userContext.tenant)) return true;
// Cek aturan sederhana
for (const r of flag.rules) {
if (r.op === 'eq' && userContext[r.attr] !== r.value) return false;
}
// Sticky bucketing: hash(tenant+flag) -> 0..99
const bucket = hash(userContext.tenant + ':' + flagKey) % 100;
return bucket < flag.percent;
}
Integrasi di middleware (Node.js contoh ringkas):
app.get('/checkout', (req, res) => {
const ctx = { tenant: req.headers['x-tenant'], country: req.headers['x-country'] };
const useNew = isEnabled('checkout_new_flow', ctx, currentConfig);
if (useNew) return checkoutNew(req, res);
return checkoutLegacy(req, res);
});
Poin penting dari implementasi di atas:
- Fallback aman saat flag tidak ditemukan.
- Deterministik sehingga pengguna tidak “lompat” varian.
- Konfigurasi terpisah dari kode untuk memungkinkan perubahan instan tanpa redeploy.
Pengamatan dan pengendalian
- Log nilai flag pada permintaan penting agar bisa ditelusuri ketika terjadi regresi.
- Tambahkan dashboard untuk memetakan status flag ke metrik bisnis.
- Siapkan hotkey atau endpoint aman sebagai kill switch darurat.
Keamanan dan kepatuhan
- Sembunyikan aturan sensitif dari klien; evaluasi di server bila menyangkut data privat.
- Audit trail dan role-based access untuk siapa yang boleh mengubah flag.
- Enkripsi penyimpanan konfigurasi dan transportnya.
Dengan pola ini, Anda bisa menggabungkan kecepatan pengembangan (trunk-based) dan kualitas rilis (progressive delivery). Setelah fitur stabil, hapus flag dan rapikan jalur lama untuk menjaga codebase tetap ramping.
Kesimpulannya, feature flag memberi kendali granular atas perilaku aplikasi di produksi. Gunakan untuk rilis bertahap, validasi eksperimen, dan mitigasi risiko—namun disiplinlah dengan praktik terbaik, observabilitas, serta pembersihan berkala. Hasilnya: deploy lebih aman, keputusan produk lebih berbasis data, dan tim bergerak lebih cepat.



