Feature Flags / Toggles: Kod Dağıtımını Production'da Dinamik Olarak Yönetmek
Feature Flags (özellik anahtarları), uygulamanızı yeniden dağıtmadan, çalışma zamanında belirli özellikleri açıp kapatmanıza olanak tanıyan güçlü bir yazılım geliştirme tekniğidir. Bu teknik, kod dağıtımını (deployment) özellik yayınından (release) ayırarak ekiplerin tamamlanmamış özellikleri ana kod dalına (main/trunk) güvenle entegre etmelerini, üretim ortamında test etmelerini ve anında geri almalarını sağlar. Bu yazıda, Feature Flag türlerini, .NET'teki uygulama yöntemlerini, kullanım senaryolarını ve yönetilmesi gereken riskleri ele alıyoruz.
1. Feature Flag Nedir ve Neden Kullanılır?
Feature Flag, basitçe bir if koşulu ile çalışan bir konfigürasyon ayarıdır. Bu sayede, kodunuzun farklı dalları (branches) çalışma zamanında seçilir. Geleneksel uzun ömürlü özellik dallarının (feature branches) aksine, Feature Flags, Trunk-Based Development (ana dalda geliştirme) yapmanıza olanak tanır. Bu yaklaşımın sağladığı temel faydalar şunlardır:
-
Risk Azaltma: Yeni bir özellikte sorun çıkarsa, uygulamayı yeniden dağıtmadan anında kapatabilirsiniz (kill switch).
-
Sürekli Entegrasyon (CI): Tamamlanmamış özellikler production'a deploy edilebilir, ancak kullanıcılara gösterilmez.
-
Hedefli Yayın (Targeted Rollout): Özellikleri belirli kullanıcı gruplarına (ör. beta kullanıcılar, belirli bir bölge) açarak geri bildirim toplayabilirsiniz.
-
A/B Testi: Farklı kullanıcı gruplarına farklı özellik sürümleri göstererek veriye dayalı kararlar alabilirsiniz.
2. Feature Flag Türleri (Kullanım Amacına Göre)
Feature Flag'ler, ömürlerine ve kullanım amaçlarına göre sınıflandırılır:
-
Release Toggles (Sürüm Anahtarları): En yaygın türdür. Tamamlanmamış veya test edilmemiş özellikleri production'a almak için kullanılır. Özellik kararlı hale geldiğinde bu flag'ler kaldırılmalıdır.
-
Experiment Toggles (Deney Anahtarları): A/B testleri veya çok değişkenli testler (multivariate) için kullanılır. Kullanıcı deneyimini optimize etmek için kısa süreliğine aktiftirler.
-
Ops Toggles (Operasyon Anahtarları): Sistem performansını veya davranışını operasyonel olarak kontrol etmek için kullanılır. Örneğin, yoğun trafikte pahalı bir servisi (ör. AI/ML inference) kapatmak için bir "circuit breaker" olarak işlev görebilirler.
-
Permission Toggles (İzin Anahtarları): Belirli özellikleri yalnızca belirli kullanıcı rolleri (ör. admin, premium üye) için etkinleştirmek amacıyla kullanılır.
3. .NET'te Feature Flag Uygulama Yöntemleri
.NET ekosistemi, Feature Flag yönetimi için zengin bir araç seti sunar.
A. Microsoft.FeatureManagement Kütüphanesi
Microsoft'un resmi kütüphanesi olan Microsoft.FeatureManagement, .NET Core'un konfigürasyon sistemi üzerine inşa edilmiştir. appsettings.json dosyasından Azure App Configuration'e kadar birçok kaynaktan feature flag okuyabilir.
Kurulum ve Temel Kullanım:
-
NuGet paketini ekleyin:
dotnet add package Microsoft.FeatureManagement.AspNetCore. -
Program.cs'de servisleri kaydedin:
csharp
builder.Services.AddFeatureManagement();
-
appsettings.jsondosyasında flag'leri tanımlayın:
json
{
"FeatureManagement": {
"NewCheckout": true, // Basit bir aç/kapa flag'i
"BetaFeature": false
}
}
-
Kod içinde kontrol edin:
csharp
public class CheckoutController : ControllerBase
{
private readonly IFeatureManager _featureManager;
public CheckoutController(IFeatureManager featureManager)
{
_featureManager = featureManager;
}
public async Task<IActionResult> Index()
{
if (await _featureManager.IsEnabledAsync("NewCheckout"))
{
// Yeni ödeme akışını çalıştır
return View("NewCheckout");
}
// Eski ödeme akışını çalıştır
return View("LegacyCheckout");
}
}
B. Azure App Configuration ile Merkezi Yönetim
Büyük sistemlerde feature flag'leri merkezi bir yerde yönetmek isteyebilirsiniz. Azure App Configuration, bu ihtiyacı karşılayan bir hizmettir.
-
Dinamik Yenileme: Feature flag'ler App Configuration üzerinde değiştirildiğinde, uygulamanız yeniden başlatılmadan otomatik olarak yenilenebilir. Varsayılan yenileme aralığı 30 saniyedir.
-
Güvenli Bağlantı: App Configuration'a bağlanmak için Managed Identity veya Connection String kullanılabilir.
csharp
// Program.cs - Azure App Configuration ile entegrasyon
builder.Configuration.AddAzureAppConfiguration(options =>
{
options.Connect(new Uri(endpoint), new DefaultAzureCredential());
options.UseFeatureFlags(); // Tüm feature flag'leri yükle
});
builder.Services.AddFeatureManagement();
C. LaunchDarkly, ConfigCat, FeatBit Gibi Üçüncü Parti Hizmetler
Bu hizmetler, gelişmiş hedefleme (targeting), kullanıcı segmentasyonu, anlık flag değişiklikleri ve detaylı analizler sunar. Özellikle karmaşık ve dinamik flag yönetimi gerektiren projeler için idealdir.
4. İleri Seviye Kullanım: Feature Filters (Özellik Filtreleri)
Microsoft.FeatureManagement, basit aç/kapa'nın ötesine geçerek Feature Filters (Özellik Filtreleri) ile koşullu etkinleştirme sunar.
Örneğin, bir özelliği yalnızca belirli bir kullanıcı yüzdesine (canary release / kademeli yayın) açmak için:
json
{
"FeatureManagement": {
"NewCheckout": {
"EnabledFor": [
{
"Name": "Microsoft.Percentage",
"Parameters": {
"Value": 10 // Kullanıcıların %10'una aç
}
}
]
}
}
}
Bu özellik, kademeli yayın (gradual rollout), canary deployment ve A/B testi senaryoları için çok güçlüdür.
5. En İyi Pratikler ve Yönetim Stratejileri
Feature Flag'ler güçlü bir araçtır, ancak kontrolsüz kullanımı kod tabanınızda karmaşaya yol açabilir.
-
Merkezi Karar Noktaları (Decouple Decision Points): Flag kontrollerini kodun her yerine dağıtmayın. Flag karar mantığını merkezi bir servis veya policy üzerinden yönetin.
-
Yaşam Döngüsü Yönetimi (Lifecycle Management): Özellikle Release Toggle'lar için bir son kullanma tarihi (expiration date) belirleyin. Özellik kararlı hale geldiğinde flag'i ve ilgili eski kod dalını (dead code) temizleyin.
-
Envanter Yönetimi (Inventory Management): Feature flag'ler birer "envanter" gibidir ve taşıma maliyetleri vardır. Kullanılmayan flag'leri düzenli olarak denetleyin ve kaldırın.
-
Test Stratejisi: Feature flag'ler, test edilmesi gereken konfigürasyon sayısını artırır (flag açık/kapalı). Bu nedenle, otomatik testlerinizde farklı flag kombinasyonlarını kapsadığınızdan emin olun.
-
Güvenlik: Özellikle Permission Toggle'lar söz konusu olduğunda, flag'lerin yetkisiz erişime karşı korunduğundan emin olun.
6. Riskler ve Dikkat Edilmesi Gerekenler
-
Teknik Borç (Technical Debt): Kullanılmayan veya unutulan feature flag'ler zamanla kod karmaşasına ve bakım zorluğuna yol açar.
-
Performans Etkisi: Her istekte flag kontrolü yapmak (özellikle uzak bir servise bağlanılıyorsa) performansı etkileyebilir. Bu nedenle, önbellekleme (caching) stratejileri uygulanmalıdır.
-
Karmaşıklık: Çok sayıda flag, uygulamanın davranışını tahmin etmeyi zorlaştırabilir. Bu durum "toggle sprawl" (flag yayılımı) olarak adlandırılır.
Sonuç:
Feature Flags, modern yazılım geliştirme ve DevOps pratiklerinin vazgeçilmez bir parçasıdır. Kod dağıtımını özellik yayınından ayırarak ekiplere büyük bir esneklik ve güvenlik sağlar. .NET ekosisteminde, basit appsettings.json yapılandırmasından, güçlü Microsoft.FeatureManagement kütüphanesine ve merkezi Azure App Configuration veya üçüncü parti hizmetlere kadar birçok seçenek mevcuttur. Başarılı bir Feature Flag stratejisinin anahtarı, doğru türde flag kullanmak, bunları düzenli olarak temizlemek ve her zaman test edilebilirliği göz önünde bulundurmaktır.