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.

strangler_middleware_flow

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:

  1. Eski sistemi analiz et: Hangi bölümler artık güncel değil, nerede teknik borç var, neleri taşıyabilirsin?
  2. 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şı.
  3. Yönlendirme katmanı (Proxy) ekle: Trafiği eski veya yeni sisteme yönlendiren bir middleware ya da gateway oluştur.
  4. 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.

By tanju.bozok

Software Architect, Developer, and Entrepreneur

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir