Software Architecture

Monoliti Devre Dışı Bırakmak: Strangler Fig Desenine Pratik Bir Rehber

Her mühendislik ekibi nihayetinde aynı zorlayıcı gerçeğe şahit olur: miras monolitleri yeniliğin önündeki darboğaza dönüşür. Kod tabanı karmaşık, dağıtım döngüleri yavaştır ve yeni özellik eklemek bombayı etkisiz hale getirmeye benzer. Yıllar boyunca standart tavsiye "büyük patlama" yeniden yazmalarıydı—sıfırdan yeni bir sistem inşa edip anahtarı çevirmek. Ancak bu yaklaşım, aşırı maliyetler ve zaman çizelgesi kaymaları nedeniyle büyük risk taşır ve sıklıkla başarısız olur.

Strangler Fig Deseni'ne giriyoruz; Martin Fowler tarafından ortaya atılan bir taşıma stratejisi. Tıpkı Strangler Fig (boğucu incir) bitkisinin bir ana ağacın etrafında büyüdüğünde, onu yavaşça emerek ana ağacın ölmesine neden olduğu gibi, bu desen de miras sisteminin parçalarını yeni mikroservislere artımlı olarak değiştirmeyi içerir. Bugün, bu deseni nasıl etkili bir şekilde uygulayacağımızı, trafik yönlendirmesini nasıl yöneteceğimizi ve geçiş sırasında sıfır kesinti nasıl sağlayacağımızı keşfedeceğiz.

Artımlı Taşımanın Önemi

Strangler Fig Deseni'nin temel avantajı riskin azaltılmasıdır. İşlevselliği parça parça taşıyarak, her yeni servisi bağımsız olarak doğrulayabilirsiniz. Yeni bir hizmet başarısız olursa, uygulamanın geri kalanını etkilemeden trafiği miras sisteme geri döndürebilirsiniz. Bu iteratif yaklaşım, ekiplerin teorik bir "tamamlanma" tarihini yıllarca beklemek yerine, değeri sürekli olarak sunmasına olanak tanır.

Stratejinin Temel Bileşenleri

Deseni başarıyla uygulamak için trafik yönlendirmesine yönelik stratejik bir yaklaşıma ihtiyacınız vardır. En yaygın mekanizma, hem miras monoliti hem de yeni mikroservislerin önünde duran bir API Gateway veya proxy katmanıdır. Bu geçit, bir isteğin eski sistem mi yoksa yeni, modernleştirilmiş hizmet mi tarafından işleneceğine karar veren trafik polisi gibi davranır.

Node.js/Express kullanarak pratik bir uygulamaya bakalım. Bu senaryoda, daha büyük bir monolitten kullanıcı kimlik doğrulama hizmetini ayırıyoruz.

Geçit Mantığının Uygulanması

Geçidin, URL yollarına veya belirli kriterlere göre istekleri yönlendirmek için bir mekanizmaya ihtiyacı vardır. Aşağıda, bu yönlendirme mantığının bir ara yazılım işlevinde nasıl görünebileceğine dair basitleştirilmiş bir örnek bulunmaktadır.

const express = require('express');
const app = express();

// Özellik bayrakları veya yönlendirme kuralları için yapılandırma
const STRANGLER_CONFIG = {
  '/api/users': 'new_microservice',
  '/api/orders': 'legacy_monolith' // Hala monolitte
};

// İstekleri engellemek için ara yazılım
app.use((req, res, next) => {
  const path = req.path;
  const target = STRANGLER_CONFIG[path];

  if (target === 'new_microservice') {
    console.log(`${req.method} ${path} yeni mikroservise yönlendiriliyor`);
    // İsteği yeni mikroservis URL'sine proxy'le
    proxyService(req, res, 'http://localhost:3001');
  } else if (target === 'legacy_monolith') {
    console.log(`${req.method} ${path} miras monolitine yönlendiriliyor`);
    // İsteği miras monolit URL'sine proxy'le
    proxyService(req, res, 'http://localhost:8080');
  } else {
    // Varsayılan yedekleme
    next();
  }
});

function proxyService(req, res, targetUrl) {
  // Gösterim için basitleştirilmiş proxy mantığı
  // Üretimde http-proxy veya nginx gibi kütüphaneler kullanın
  const http = require('http');
  const options = {
    hostname: new URL(targetUrl).hostname,
    port: new URL(targetUrl).port,
    path: req.url,
    method: req.method,
    headers: req.headers
  };

  const proxyReq = http.request(options, (proxyRes) => {
    res.writeHead(proxyRes.statusCode, proxyRes.headers);
    proxyRes.pipe(res, { end: true });
  });

  req.pipe(proxyReq, { end: true });
}

Başarı İçin Kritik Hususlar

Yukarıdaki kod yönlendirme mekanizmasını gösterse de, başarılı bir taşıma için sadece trafik bölüşümü yeterli değildir. Veri tutarlılığını dikkatlice yönetmelisiniz. Sıklıkla yeni mikroservisin kendi veritabanı olur ve bu, geçiş döneminde miras sisteminin veritabanı ile senkronizasyon gerektirir. Veritabanı replikasyonu veya CDC (Değişiklik Verisi Yakalama) gibi araçlar, bu veri depolarının senkronize kalmasına yardımcı olabilir.

Ayrıca, izleme ve gözlemlenebilirlik araçlarınızın hem miras hem de yeni sistemleri kapsadığından emin olun. Tek bir kullanıcı isteği miras bir modül ve yeni bir mikroservis arasında yayıldığında dağıtılmış izleme (distributed tracing) hayati önem kazanır.

Sonuç

Strangler Fig Deseni sihirli bir değnek değildir, ancak karmaşık, monolitik mimarileri modernleştirmek için en etkili stratejilerden biridir. Odak noktasını riskli, yüksek temelli yeniden yazmalardan, yönetilebilir ve düşük riskli refaktörleme görevlerine kaydırır. Miras sistemi artımlı olarak boğarak, iş sürekliliğini korurken ölçeklenebilir, sürdürülebilir bir geleceğe doğru ilerlersiniz.

Küçük başlayın. Monolitinize bağlı tek bir, tutarlı sınırlı bağlamı belirleyin, bunun için yeni bir hizmet oluşturun ve trafiği bir geçit üzerinden yönlendirin. Güveniniz arttıkça, yeni mimarinizin çevresini genişletin ve miras sistemi bir anıya dönüşene kadar devam edin. Modernizasyon yolculuğu bir maraton, bir sprint değil; Strangler Fig öncülük etsin.

Share: