İçeriğe geç
Çılgın Yazılım

Yazılım Geliştirme kod örnekli

Özellik Bayrakları (Feature Flag) ile Yayını Dağıtımdan Ayırmak

Kodu dağıtmak ile özelliği açmak aynı an olmak zorunda değil. Bu ayrım, riskin büyük kısmını ortadan kaldırır.

Çılgın Yazılım 3 dk okuma

Özellik Bayrakları (Feature Flag) ile Yayını Dağıtımdan Ayırmak
İçindekiler
  1. Dağıtım ve yayın aynı şey değildir
  2. Basit ama yeterli bir uygulama
  3. Kullanımı okunur tutmak
  4. Bayrak borcu: en gerçek maliyet
  5. Bayrak türlerini karıştırmayın
  6. Sonuç

Bir özellik bayrağı, kodun içindeki bir anahtardır: özellik dağıtılmıştır ama açık olup olmadığına çalışma zamanında karar verilir. Bu ayrım kulağa küçük gelir, ancak yazılım tesliminin en riskli anını — "her şey aynı anda canlıya çıkıyor" anını — ortadan kaldırır.

Özellik bayraklarının kullanım türleri
Bayrağı eklemek kolaydır; asıl disiplin onu zamanında kaldırmaktır.

Dağıtım ve yayın aynı şey değildir

Klasik akışta kodu dağıtmak ile özelliği kullanıcılara açmak tek bir olaydır. Sorun çıkarsa tek çare geri almaktır ve bu, o dağıtımdaki diğer düzeltmeleri de geri alır. Bayrak kullandığınızda özelliği kapatmak yeterlidir; kalan değişiklikler yerinde durur. Geri alma stratejisini geri alma planı yazımızda ele almıştık — bayraklar bu planın en ucuz biçimidir.

Basit ama yeterli bir uygulama

PHP
final class Bayraklar
{
    /** @var array<string, array> */
    private array $tanimlar;

    public function __construct(private ?int $kullaniciId = null)
    {
        // Kaynak: veritabanı veya yapılandırma. Önbelleğe alınmalı.
        $this->tanimlar = cache()->remember('bayraklar', 60, static fn() =>
            array_column(db_connect()->table('ozellik_bayraklari')->get()->getResultArray(), null, 'anahtar')
        );
    }

    public function acik(string $anahtar): bool
    {
        $b = $this->tanimlar[$anahtar] ?? null;

        // Tanımsız bayrak KAPALI sayılır: yazım hatası özelliği kazara açmasın
        if ($b === null || (int) $b['aktif'] !== 1) {
            return false;
        }

        // Belirli kullanıcılar (iç ekip, pilot müşteri)
        $liste = array_filter(array_map('intval', explode(',', (string) $b['kullanicilar'])));
        if ($this->kullaniciId && in_array($this->kullaniciId, $liste, true)) {
            return true;
        }

        $oran = (int) $b['yuzde'];
        if ($oran >= 100) { return true; }
        if ($oran <= 0)   { return false; }

        // Kullanıcı yoksa oranı uygulama: anonim ziyaretçide kararlılık sağlanamaz
        if (! $this->kullaniciId) {
            return false;
        }

        // KARARLI dağıtım: aynı kullanıcı her istekte aynı sonucu alır
        return (crc32($anahtar . ':' . $this->kullaniciId) % 100) < $oran;
    }
}

Oran hesabında rand() kullanmayın. Rastgele karar, aynı kullanıcının bir istekte yeni arayüzü, sonraki istekte eskisini görmesine yol açar — bu, hata olarak bildirilmesi neredeyse imkânsız bir kullanıcı deneyimi üretir.

Kullanımı okunur tutmak

PHP
$bayraklar = new Bayraklar(session()->get('user_id'));

if ($bayraklar->acik('yeni_siparis_akisi')) {
    return $this->yeniSiparisAkisi();
}

return $this->eskiSiparisAkisi();

Bayrak kontrolünü dağıtmayın. Aynı bayrağı on farklı yerde sorgulamak, temizlik zamanı geldiğinde hepsini bulmayı zorlaştırır. Mümkünse kontrolü giriş noktasında yapıp aşağıya karar sonucunu geçirin.

Bayrak durumlarının kim tarafından ne zaman değiştirildiğini görmek isterseniz bu değişiklikleri olay günlüğüne yazmak en sade çözümdür.

Bayrak borcu: en gerçek maliyet

Bayrakların bilinen ve kaçınılmaz sorunu birikmeleridir. Her bayrak kodda bir dallanma, testte iki senaryo demektir. On bayrak teorik olarak 1024 kombinasyon üretir; pratikte kimse bunu test etmez ve beklenmedik etkileşimler ortaya çıkar.

Disiplin basittir: yayın bayrakları geçicidir. Bayrağı eklerken kaldırma tarihini de tanımlayın ve bu tarihi görünür kılın.

SQL
-- Süresi geçmiş bayrakları raporlayan sorgu (haftalık çalıştırın)
SELECT anahtar, aciklama, yuzde, kaldirma_tarihi,
       DATEDIFF(CURDATE(), kaldirma_tarihi) AS gun_gecikme
FROM ozellik_bayraklari
WHERE tur = 'yayin'
  AND kaldirma_tarihi < CURDATE()
ORDER BY gun_gecikme DESC;

Bu sorgunun çıktısını sprint planlamaya girdi yapmak, bayrak borcunu teknik borcun görünür bir kalemi hâline getirir. Kapsamın sessizce büyümesini önlemek içinse kapsam kayması yönetimi yazımızdaki çerçeve tamamlayıcıdır.

Bayrakla yayına alınan işin süresi ve maliyeti sorulduğunda maliyet ve süre SSS sayfamız ortak bir dil kurmayı kolaylaştırır.

Bayrak türlerini karıştırmayın

Yayın bayrağı haftalar yaşar ve silinir. Deney bayrağı testin süresi kadar yaşar; sonucu erken durdurma tuzağına düşmeden okunmalıdır. İşletme bayrağı (müşteri paketine göre özellik açma) ise kalıcıdır ve aslında bir yetkilendirme kuralıdır — onu bayrak sistemine değil, izin modeline koymak daha doğrudur. Bu ayrımın yapılmaması, "temizlenemeyen bayrak" yığınının en yaygın sebebidir.

Trunk-based geliştirme ile bayraklar birbirini tamamlar: uzun ömürlü dal açmadan, yarım özelliği kapalı bayrak arkasında ana dala birleştirebilirsiniz. Bu ilişki için dallanma stratejisi yazımıza ve Martin Fowler'ın feature toggle makalesine bakabilirsiniz.

Sonuç

Özellik bayrakları, yazılım tesliminde riski zamana yayan en basit araçtır: kodu dağıtırsınız, özelliği hazır olduğunuzda açarsınız, sorun çıkarsa saniyeler içinde kapatırsınız. Kurarken üç kurala uyun — tanımsız bayrak kapalı sayılsın, oran dağıtımı kullanıcı bazında kararlı olsun, her yayın bayrağının bir kaldırma tarihi bulunsun. Bayrak eklemek bir günlük iştir; onu zamanında kaldırmak ise sistemin uzun vadeli sağlığını belirler. Bir sonraki riskli özelliğinizi bayrak arkasında dağıtmayı deneyin, ilk kapatma anında getirisini göreceksiniz.

Beğeniniz benzer içerikleri öne çıkarmamıza yardımcı olur.

Sık sorulan sorular

Kaç bayrak fazla sayılır?

Mutlak bir sayı yok, ama aynı anda açık on yayın bayrağı çoğu ekip için yönetilemez hâle gelir. Daha iyi ölçüt yaştır: üç aydan eski bir yayın bayrağı varsa, süreç değil disiplin sorunu vardır.

Bayrakların test edilmesi gerekir mi?

Kritik bayrakların iki durumu da test edilmelidir; ancak tüm kombinasyonları test etmek pratik değildir. Yaygın yaklaşım, üretimde açık olan yapılandırmayı ve bayrağın kapalı hâlini test etmek, gerisini kabul edilebilir risk saymaktır.

Bayrak durumunu nerede saklamalıyım?

Veritabanı ya da yapılandırma servisi uygundur; önemli olan değişikliğin yeni dağıtım gerektirmemesidir. Bayrağı .env dosyasında tutmak, "anında kapatabilme" faydasını ortadan kaldırır çünkü değişiklik için dağıtım gerekir.

Bayrak kontrolü performansı etkiler mi?

Her istekte veritabanına gitmek etkiler; bu yüzden bayrak tanımları kısa süreli önbellekte tutulmalıdır. Bir dakikalık önbellek, hem yükü kaldırır hem de acil kapatmanın makul sürede yayılmasını sağlar.

Yazan

Çılgın Yazılım

Ben Evren Çılgın; yazılım geliştirme, web teknolojileri ve sistem tasarımı alanlarında uzmanlaşmış bir geliştiriciyim. Uzun yıllardır hem frontend hem de backend tarafında üretken, ölçeklenebilir ve kullanıcı dostu çözümler üretiyorum.

Hakkımızda Bize ulaşın

Bu konuda bir projeniz mi var?

İhtiyacınızı birkaç cümleyle anlatın; uygun yaklaşımı birlikte belirleyelim.

Projenizi Anlatın

İlgili yazılar

Yorumlar

Henüz yorum yok. Sorunuzu ya da deneyiminizi ilk siz yazın.

Yorum yazın

Yorumunuz onaylandıktan sonra yayınlanır. Ekibimiz gerekirse konuyla ilgili bir yanıt da paylaşır.

Yayınlanmaz; yalnızca gerektiğinde size ulaşmak için.

En az 10 karakter.

Tüm yazılar