Memuat...
👋 Selamat Pagi!

Cara Membangun Feature Flag System untuk Deployment Aman Tanpa Ribet

Feature flag bisa selamatkan produksi dari bug fatal. Pelajari cara membangun sistem feature toggle sederhana tapi powerful untuk kontrol deployment yang lebih...

Cara Membangun Feature Flag System untuk Deployment Aman Tanpa Ribet

Pernahkah kamu deploy fitur baru ke production, lalu tiba-tiba ada bug critical yang bikin panik?

Atau mungkin kamu ingin release fitur secara bertahap ke user tertentu dulu sebelum diluncurkan ke semua orang?

Feature flag atau feature toggle adalah solusinya.

Sistem ini memungkinkan kamu mengontrol fitur aplikasi secara real-time tanpa harus deploy ulang atau rollback code.

Di artikel ini, kita akan membahas cara membangun feature flag system yang simpel tapi powerful untuk meningkatkan keamanan deployment dan fleksibilitas release management.

Apa Itu Feature Flag dan Kenapa Penting?

Feature flag adalah teknik development yang memisahkan code deployment dari feature release.

Dengan feature flag, kamu bisa deploy code ke production dalam kondisi "mati" atau hidden, lalu mengaktifkannya kapan saja tanpa deploy ulang.

Bayangkan seperti saklar lampu di rumah.

Instalasi kabel listriknya sudah selesai (code sudah di-deploy), tapi lampunya baru menyala ketika kamu menekan saklar (flag diaktifkan).

Manfaat Utama Feature Flag

Ada beberapa alasan kenapa tim development modern menggunakan feature flag:

  • Deployment lebih aman karena fitur baru bisa dimatikan instant jika ada masalah
  • Progressive rollout memungkinkan release bertahap ke persentase user tertentu
  • A/B testing jadi lebih mudah dengan mengaktifkan variasi fitur untuk user berbeda
  • Trunk-based development bisa diterapkan tanpa takut code belum siap masuk ke main branch
  • Kill switch untuk mematikan fitur yang bermasalah tanpa rollback deployment
  • Canary deployment untuk test fitur di production environment dengan traffic terbatas

Feature flag sudah digunakan oleh perusahaan tech besar seperti Facebook, Netflix, dan Google untuk mengelola ribuan fitur secara bersamaan.

Arsitektur Dasar Feature Flag System

Sebelum mulai coding, kita perlu memahami komponen-komponen dalam feature flag system.

Ada tiga layer utama yang perlu dibangun:

1. Storage Layer

Layer ini menyimpan konfigurasi feature flag.

Bisa menggunakan database, Redis, atau file konfigurasi tergantung kebutuhan performance dan skalabilitas.

Struktur data minimal yang diperlukan:

{
  "feature_key": "new_checkout_flow",
  "enabled": true,
  "description": "Checkout flow dengan one-click payment",
  "created_at": "2026-07-01T10:00:00Z",
  "updated_at": "2026-07-05T15:30:00Z",
  "rollout_percentage": 25,
  "user_whitelist": ["user_123", "user_456"],
  "environment": "production"
}

2. Evaluation Layer

Layer ini menentukan apakah sebuah flag harus aktif atau tidak untuk user tertentu.

Di sini logika targeting dan rollout percentage dievaluasi.

Misalnya, jika rollout_percentage adalah 25%, maka sistem akan mengaktifkan fitur hanya untuk 25% user secara random tapi konsisten.

3. SDK/Client Layer

Layer ini adalah interface yang digunakan developer untuk mengecek status flag di dalam code.

API-nya harus sederhana dan mudah diintegrasikan ke berbagai bagian aplikasi.

Implementasi Feature Flag System dengan PHP

Mari kita bangun feature flag system sederhana menggunakan PHP dan MySQL.

Implementasi ini bisa digunakan di project Laravel, CodeIgniter, atau PHP native.

Step 1: Buat Database Schema

Pertama, kita buat tabel untuk menyimpan konfigurasi feature flag.

CREATE TABLE feature_flags (
    id INT AUTO_INCREMENT PRIMARY KEY,
    feature_key VARCHAR(100) UNIQUE NOT NULL,
    enabled BOOLEAN DEFAULT FALSE,
    description TEXT,
    rollout_percentage INT DEFAULT 0,
    user_whitelist JSON,
    environment VARCHAR(50) DEFAULT 'production',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_feature_key (feature_key),
    INDEX idx_enabled (enabled)
);

Untuk logging perubahan flag, kita juga buat tabel audit:

CREATE TABLE feature_flag_logs (
    id INT AUTO_INCREMENT PRIMARY KEY,
    feature_key VARCHAR(100) NOT NULL,
    action VARCHAR(50) NOT NULL,
    old_value JSON,
    new_value JSON,
    changed_by VARCHAR(100),
    changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_feature_key (feature_key)
);

Step 2: Buat Feature Flag Manager Class

Sekarang kita buat class utama untuk mengelola feature flag.

<?php

class FeatureFlagManager {
    private $db;
    private $cache = [];
    private $cacheTTL = 300; // 5 minutes
    
    public function __construct($dbConnection) {
        $this->db = $dbConnection;
    }
    
    public function isEnabled($featureKey, $userId = null, $context = []) {
        // Check cache first
        $cacheKey = $this->getCacheKey($featureKey, $userId);
        if (isset($this->cache[$cacheKey])) {
            return $this->cache[$cacheKey];
        }
        
        // Fetch flag configuration
        $flag = $this->getFlag($featureKey);
        
        if (!$flag || !$flag['enabled']) {
            $this->cache[$cacheKey] = false;
            return false;
        }
        
        // Check user whitelist
        if ($userId && $this->isUserWhitelisted($flag, $userId)) {
            $this->cache[$cacheKey] = true;
            return true;
        }
        
        // Check rollout percentage
        if ($this->shouldEnableByRollout($flag, $userId)) {
            $this->cache[$cacheKey] = true;
            return true;
        }
        
        $this->cache[$cacheKey] = false;
        return false;
    }
    
    private function getFlag($featureKey) {
        $stmt = $this->db->prepare(
            "SELECT * FROM feature_flags WHERE feature_key = ? LIMIT 1"
        );
        $stmt->execute([$featureKey]);
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
    
    private function isUserWhitelisted($flag, $userId) {
        if (empty($flag['user_whitelist'])) {
            return false;
        }
        
        $whitelist = json_decode($flag['user_whitelist'], true);
        return in_array($userId, $whitelist);
    }
    
    private function shouldEnableByRollout($flag, $userId) {
        $percentage = $flag['rollout_percentage'];
        
        if ($percentage >= 100) {
            return true;
        }
        
        if ($percentage db->prepare(
            "UPDATE feature_flags SET enabled = TRUE, 
             rollout_percentage = ? WHERE feature_key = ?"
        );
        $stmt->execute([$percentage, $featureKey]);
        $this->clearCache();
        $this->logChange($featureKey, 'enable', ['percentage' => $percentage]);
    }
    
    public function disable($featureKey) {
        $stmt = $this->db->prepare(
            "UPDATE feature_flags SET enabled = FALSE WHERE feature_key = ?"
        );
        $stmt->execute([$featureKey]);
        $this->clearCache();
        $this->logChange($featureKey, 'disable');
    }
    
    private function clearCache() {
        $this->cache = [];
    }
    
    private function logChange($featureKey, $action, $data = []) {
        $stmt = $this->db->prepare(
            "INSERT INTO feature_flag_logs (feature_key, action, new_value, changed_by) 
             VALUES (?, ?, ?, ?)"
        );
        $stmt->execute([
            $featureKey, 
            $action, 
            json_encode($data),
            $_SERVER['REMOTE_USER'] ?? 'system'
        ]);
    }
}

Class ini sudah include caching sederhana untuk menghindari query database yang berlebihan.

Kesulitan dengan tugas programming atau butuh bantuan coding? KerjaKode siap membantu menyelesaikan tugas IT dan teknik informatika Anda. Dapatkan bantuan profesional di jasa tugas IT KerjaKode.

Step 3: Integrasikan ke Aplikasi

Sekarang kita bisa menggunakan feature flag di berbagai bagian aplikasi.

<?php

// Inisialisasi
$flagManager = new FeatureFlagManager($pdoConnection);

// Check flag di controller atau business logic
if ($flagManager->isEnabled('new_checkout_flow', $currentUserId)) {
    // Gunakan checkout flow yang baru
    return $this->newCheckoutProcess($cart);
} else {
    // Gunakan checkout flow yang lama
    return $this->legacyCheckoutProcess($cart);
}

// Contoh untuk A/B testing
if ($flagManager->isEnabled('dark_mode_ui', $currentUserId)) {
    $theme = 'dark';
} else {
    $theme = 'light';
}

// Feature flag untuk toggle fitur premium
if ($flagManager->isEnabled('premium_analytics', $currentUserId)) {
    $data['analytics'] = $this->getPremiumAnalytics();
}

Best Practices Feature Flag Management

Membangun sistem feature flag hanyalah langkah pertama.

Yang lebih penting adalah bagaimana mengelolanya dengan baik agar tidak jadi technical debt.

1. Gunakan Naming Convention yang Jelas

Berikan nama flag yang deskriptif dan mudah dipahami.

Hindari nama seperti flag_1 atau new_feature.

Contoh naming yang baik:

  • checkout_one_click_payment
  • analytics_realtime_dashboard
  • ui_dark_mode
  • api_v2_endpoints

2. Dokumentasikan Setiap Flag

Setiap feature flag harus punya dokumentasi minimal:

  • Tujuan flag dibuat
  • Siapa yang bertanggung jawab
  • Kapan flag akan dihapus
  • Dependencies dengan flag lain

Buat simple dashboard atau spreadsheet untuk tracking ini.

3. Set Expiration Date untuk Flag

Flag yang sudah tidak terpakai harus segera dihapus.

Tambahkan kolom expires_at di database dan buat automated alert ketika flag sudah kadaluarsa.

ALTER TABLE feature_flags ADD COLUMN expires_at DATE;

Buat cron job untuk notifikasi flag yang sudah expired:

SELECT feature_key, description, expires_at 
FROM feature_flags 
WHERE expires_at 

4. Hindari Feature Flag Bersarang

Jangan membuat kondisi flag di dalam flag lain karena akan sulit di-maintain.

// JANGAN seperti ini
if ($flagManager->isEnabled('feature_a')) {
    if ($flagManager->isEnabled('feature_b')) {
        if ($flagManager->isEnabled('feature_c')) {
            // Code disini jadi sangat kompleks
        }
    }
}

Lebih baik buat flag kombinasi atau refactor logic-nya.

5. Monitor Performa Flag Evaluation

Checking flag tidak boleh jadi bottleneck performance.

Gunakan caching layer seperti Redis atau Memcached untuk production environment.

<?php

class CachedFeatureFlagManager extends FeatureFlagManager {
    private $redis;
    
    public function __construct($dbConnection, $redisConnection) {
        parent::__construct($dbConnection);
        $this->redis = $redisConnection;
    }
    
    public function isEnabled($featureKey, $userId = null, $context = []) {
        $cacheKey = "flag:{$featureKey}:" . ($userId ?? 'all');
        
        // Check Redis first
        $cached = $this->redis->get($cacheKey);
        if ($cached !== false) {
            return (bool) $cached;
        }
        
        // Fallback to parent method
        $result = parent::isEnabled($featureKey, $userId, $context);
        
        // Cache for 5 minutes
        $this->redis->setex($cacheKey, 300, (int) $result);
        
        return $result;
    }
}

Progressive Rollout Strategy

Salah satu kekuatan feature flag adalah kemampuan untuk rollout bertahap.

Ini sangat berguna untuk mengurangi risk ketika release fitur besar.

Phase 1: Internal Testing (0-5%)

Aktifkan flag hanya untuk internal team dan beta tester.

$flagManager->enable('new_search_algorithm', 5);
// Hanya 5% user yang akan melihat fitur ini

Phase 2: Canary Release (5-25%)

Jika tidak ada masalah, tingkatkan ke 25% user.

Monitor metrics seperti error rate, response time, dan user behavior.

Phase 3: Gradual Rollout (25-75%)

Tingkatkan secara bertahap sambil monitoring.

Jika ada issue, kamu bisa rollback percentage atau disable flag sepenuhnya.

Phase 4: Full Release (100%)

Setelah yakin fitur stable, aktifkan untuk semua user.

Tunggu beberapa hari untuk memastikan tidak ada edge case.

Phase 5: Cleanup

Setelah 100% rollout berhasil dan fitur sudah stable, hapus flag dari codebase.

Ini penting untuk menghindari code yang penuh dengan flag yang sudah tidak terpakai.

Feature Flag untuk A/B Testing

Feature flag juga bisa digunakan untuk A/B testing sederhana.

Kamu bisa membuat dua variasi fitur dan mengalokasikan user secara random.

<?php

class ABTestingFlag extends FeatureFlagManager {
    public function getVariant($featureKey, $userId) {
        // Gunakan hash konsisten untuk assign variant
        $hash = crc32($featureKey . $userId);
        $variant = $hash % 2 == 0 ? 'A' : 'B';
        
        // Log variant assignment untuk analytics
        $this->logVariantAssignment($featureKey, $userId, $variant);
        
        return $variant;
    }
    
    private function logVariantAssignment($feature, $user, $variant) {
        // Simpan ke analytics database
        // Untuk tracking conversion rate per variant
    }
}

Dengan ini, kamu bisa test dua versi fitur secara bersamaan dan measure mana yang lebih baik berdasarkan metrics.

Dashboard Untuk Non-Technical Team

Feature flag akan lebih powerful jika team non-technical (Product Manager, Marketing) juga bisa mengontrolnya.

Buat dashboard sederhana dengan fitur:

  • List semua flag dengan status enabled/disabled
  • Toggle switch untuk enable/disable flag
  • Slider untuk adjust rollout percentage
  • History log siapa yang mengubah flag
  • Search dan filter berdasarkan environment

Dashboard ini bisa dibuat dengan framework frontend favorit kamu atau bahkan plain HTML + JavaScript dengan AJAX untuk update flag secara real-time.

Kesalahan Umum yang Harus Dihindari

Berdasarkan pengalaman tim development yang sudah menggunakan feature flag, ada beberapa pitfall yang sering terjadi:

1. Lupa Menghapus Flag yang Sudah Tidak Terpakai

Ini adalah masalah paling umum.

Flag yang dibiarkan bertahun-tahun akan membuat codebase sulit dibaca dan di-maintain.

Set reminder atau automated task untuk cleanup flag secara berkala.

2. Terlalu Banyak Flag

Tidak semua fitur perlu flag.

Gunakan feature flag hanya untuk:

  • Fitur besar yang risky
  • Eksperimen atau A/B test
  • Fitur yang butuh gradual rollout
  • Feature yang mungkin perlu di-kill switch

Fitur kecil yang sudah pasti stable tidak perlu flag.

3. Tidak Ada Monitoring Flag Performance

Flag evaluation yang lambat bisa bikin aplikasi lemot.

Selalu monitor berapa lama waktu yang dibutuhkan untuk evaluate flag dan pastikan ada caching layer yang proper.

4. Flag Configuration Tidak Ter-version

Simpan history perubahan flag configuration.

Ini berguna untuk debugging ketika ada issue setelah flag diubah.

Tool dan Library Feature Flag yang Bisa Digunakan

Jika tidak ingin build dari scratch, ada beberapa tool yang bisa digunakan:

Self-Hosted Solutions

  • Unleash: Open source feature flag platform dengan dashboard dan SDK untuk berbagai bahasa
  • Flagsmith: Feature flag dan remote config management dengan UI yang user-friendly
  • GrowthBook: Open source platform untuk feature flag dan A/B testing dengan analytics built-in

SaaS Solutions

  • LaunchDarkly: Platform feature flag enterprise dengan advanced targeting dan analytics
  • Split.io: Feature delivery platform dengan fokus pada A/B testing dan experimentation
  • ConfigCat: Simple feature flag service dengan pricing yang affordable

Pilih solution berdasarkan budget, scale, dan requirement tim kamu.

Kesimpulan

Feature flag adalah teknik yang powerful untuk meningkatkan deployment safety dan flexibility dalam release management.

Dengan implementasi yang tepat, kamu bisa:

  • Deploy code dengan lebih percaya diri
  • Rollback fitur bermasalah tanpa deploy ulang
  • Test fitur di production dengan controlled exposure
  • Melakukan A/B testing dengan mudah
  • Memberikan kontrol release kepada non-technical team

Yang paling penting, jangan lupa untuk cleanup flag yang sudah tidak terpakai.

Feature flag yang menumpuk akan jadi technical debt yang memperlambat development di masa depan.

Mulai dari implementasi sederhana seperti yang kita bahas di artikel ini, lalu improve seiring bertambahnya kebutuhan.

Happy coding dan deployment yang lebih aman!

Ajie Kusumadhany
Written by

Ajie Kusumadhany

Founder & Lead Developer KerjaKode. Berpengalaman dalam pengembangan web modern dengan Laravel, React.js, Vue.js, dan teknologi terkini. Passionate tentang coding, teknologi, dan berbagi pengetahuan melalui artikel.

Promo Spesial Hari Ini!

10% DISKON

Promo berakhir dalam:

00 Jam
:
00 Menit
:
00 Detik
Klaim Promo Sekarang!

*Promo berlaku untuk order hari ini

0
User Online
Halo! 👋
Kerjakode Support Online
×

👋 Hai! Pilih layanan yang kamu butuhkan:

Chat WhatsApp Sekarang