Strangler Pattern Nedir?
Yazılım dünyasında “yeniden yazmak” genellikle cazip ama riskli bir çözümdür. Büyük ve yıllardır çalışan bir sisteminiz varsa, bir anda her şeyi sıfırdan inşa etmek çoğu zaman felaketle sonuçlanır. Veri kaybı, kullanıcı hataları, kesintiler, maliyet artışı…
İşte Strangler Fig Pattern (ya da kısaca Strangler Pattern) bu problemi çözmek için kullanılan akıllı bir yaklaşımdır.

Bu modelin ismi doğadan gelir: Avustralya’daki “boğucu incir ağacı (strangler fig)” başka bir ağacın etrafında büyür, zamanla onun yerini alır.
Yani yeni sistem, eski sistemin etrafında büyür — ama onu bir anda değil, adım adım değiştirir. Böylece sisteminiz çalışmaya devam ederken dönüşümünü de tamamlarsınız.
1. Strangler Pattern’in Amacı
Strangler Pattern şu sorunlara çözüm sunar:
| Problem | Çözüm |
|---|---|
| Tüm sistemi sıfırdan yazmak çok riskli | Eski sistemi kademeli olarak değiştir |
| Kullanıcılar sistemi kesintisiz kullanmalı | Trafiği yavaşça yeni koda yönlendir |
| Yeni teknolojilere geçmek istiyorsun | Yeni bileşenleri yanına inşa et |
| Hataları hızlı izole etmek istiyorsun | Yeni kodu bağımsız modüller halinde geliştir |
2. Strangler Pattern Nasıl Uygulanır?
Strangler Pattern dört temel adımda uygulanır:
- Eski sistemi analiz et: Hangi bölümler artık güncel değil, nerede teknik borç var, neleri taşıyabilirsin?
- Yeni sistemi yanına inşa et: Eski kodun yanına yeni modülleri (örneğin mikroservisler) ekle. Henüz tüm sistemi değil, sadece bir bölümü taşı.
- Yönlendirme katmanı (Proxy) ekle: Trafiği eski veya yeni sisteme yönlendiren bir middleware ya da gateway oluştur.
- Eski kodu yavaşça kaldır: Her bölüm taşındıkça, eski kodu sil ve yeni sistemi üretim ortamına geçir.
3. C# ile Strangler Pattern Uygulaması (Adım Adım)
Senaryo
Elimizde eski bir monolitik kullanıcı sistemi var: GET /api/users endpoint’i eski veri tabanından geliyor. Biz bunu yeni bir mikroservis yapısına taşımak istiyoruz.
Adım 1 — Eski Kod (Legacy Controller)
[ApiController]
[Route("api/[controller]")]
public class UsersController : ControllerBase
{
[HttpGet]
public IActionResult GetUsers()
{
var users = LegacyUserRepository.GetAll();
return Ok(users);
}
}
Bu kod, eski bir ORM veya doğrudan SQL erişimi kullanıyor olabilir.Her şey tek bir monolit içinde yer alıyor.
Adım 2 — Yeni Kod (Modern Service Layer)
public class ModernUserService
{
private readonly INewUserRepository _repository;
public ModernUserService(INewUserRepository repository)
{
_repository = repository;
}
public IEnumerable<UserDto> GetUsers()
{
return _repository.GetAll()
.Select(u => new UserDto
{
Id = u.Id,
FullName = $"{u.FirstName} {u.LastName}",
Email = u.Email
});
}
}
Burada:
- Yeni sistem daha temiz ve test edilebilir.
- DTO yapısı kullanılarak dışa bağımlılıklar azaltılmış.
- Yeni repository pattern yapısı kullanılmış.
Adım 3 — Trafik Yönlendirme (Strangler Middleware)
Eski sistem çalışmaya devam ederken, yeni endpoint’leri kademeli olarak devreye almak istiyoruz.
public class StranglerMiddleware
{
private readonly RequestDelegate _next;
private readonly ModernUserService _modernService;
public StranglerMiddleware(RequestDelegate next, ModernUserService modernService)
{
_next = next;
_modernService = modernService;
}
public async Task InvokeAsync(HttpContext context)
{
if (context.Request.Path.StartsWithSegments("/api/users"))
{
var users = _modernService.GetUsers();
await context.Response.WriteAsJsonAsync(users);
}
else
{
await _next(context);
}
}
}
Bu middleware, belirli endpoint’leri yeni sisteme yönlendiriyor. Henüz taşınmayan endpoint’ler eski sistemde çalışmaya devam ediyor.
Adım 4 — Middleware’i Uygulamaya Ekle
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<ModernUserService>();
var app = builder.Build();
app.UseMiddleware<StranglerMiddleware>();
app.MapControllers();
app.Run();
Artık /api/users istekleri yeni yapıya giderken, diğerleri eski kodda kalır.
4. Strangler Pattern ile Trafik Yönlendirme Stratejileri
Strangler Pattern’i uygularken trafiği nasıl yöneteceğin çok önemlidir.
İşte bazı yaygın stratejiler:
| Strateji | Açıklama |
|---|---|
| URL Bazlı | Belirli endpoint’leri (ör. /api/users) yeni sisteme yönlendir. |
| Versiyon Bazlı | /v2/ istekleri yeni API’ye yönlendir. |
| Feature Flag | Belirli kullanıcılar yeni sistemi deneyebilir. |
| Reverse Proxy | Nginx veya API Gateway üzerinden yönlendirme yap. |
5. Gerçek Dünya Kullanım Alanları
Netflix : Monolitik yapısını mikroservislere dönüştürürken Strangler Pattern’i temel aldı. Yeni servisler eklendikçe, eski kodlar devre dışı bırakıldı.
BBC : Eski içerik yönetim sistemini (CMS) modern web API yapısına taşırken bu modeli kullandı. Sonuç: Kesintisiz geçiş, sıfır veri kaybı.
6. Strangler Pattern Ne Zaman Kullanılmalı?
Kullan:
- Uygulaman çok eski ama hâlâ çalışıyor.
- Yeni teknolojilere geçmek istiyorsun (.NET Framework → .NET 8).
- Canlı sistemi kesintiye uğratmak istemiyorsun.
- Ekip olarak kademeli geçiş yapmak istiyorsunuz.
Kullanma:
- Proje çok küçükse.
- Baştan yazmak daha az maliyetliyse.
- Eski sistemde test altyapısı yoksa (risk artar).
7. Avantajlar ve Dezavantajlar
| Avantaj | Dezavantaj |
|---|---|
| Kesintisiz geçiş | Süreç uzun sürebilir |
| Küçük adımlarla dönüşüm | Karmaşık yönlendirmeler olabilir |
| Risk azaltma | İki sistem paralel çalıştığı için bakım zorlaşabilir |
| Kolay rollback | Performans yönetimi dikkat ister |
8. Sonuç
Strangler Pattern, bir sistemi “öldürmeden” yenisiyle değiştirme sanatıdır. C# ile bu modeli uygulamak hem kolay hem de güçlü bir geçiş stratejisi sunar.
Bu yaklaşım sayesinde:
- Eski sisteminizi tamamen kapatmadan yenisini geliştirebilir,
- Kullanıcı deneyimini koruyabilir,
- Ve modern .NET ekosistemine adım atabilirsiniz.