PHP monolitten ödeme modülünü Strangler Fig ile nasıl koparırım?
Soru
Büyük bir PHP monolitim var. "Ödeme" modülünü koparıp Go ile bağımsız bir mikroservise dönüştürmek istiyorum. Kullanıcılar ve mevcut kod fark etmeden trafiği kademeli (%5, %20, %100) yeni servise yönlendirmek istiyorum. API Gateway (Envoy/Nginx) düzeyinde bunu nasıl kurarım? Veritabanlarını ayırırken tutarlılığı nasıl sağlarım?
Cevap
Kısa cevap: Önüne bir facade/gateway (Nginx/Envoy) koy, trafiği ağırlıkla kaydır (5/20/100), monolit fallback kalsın. Ama zor kısım routing değil — veri.
Strangler Fig’in mantığı şu: eski modülü bir anda öldürmezsin, etrafını sarıp trafiği yavaşça yeni servise kaydırırsın. Sıra şöyle:
- Gateway’de ağırlıklı yönlendirme kur. Nginx/Envoy önde dursun, ödeme trafiğini
%5 → %20 → %100ağırlıkla yeni Go servisine yolla, geri kalanı monolite. Bir şey patlarsa monolit fallback’in hazır; geri dönüş tek satır config. - Önce SHADOW çalıştır. Gerçek para işlemeden önce yeni servisi gölge modda koştur: trafiği aynala, çıktıları monolitinkiyle karşılaştır, hiçbir gerçek aksiyon alma. Hesaplar tutuyorsa canlıya al. Para söz konusuyken “umarım doğrudur” yok.
- Tabloları ASLA paylaşma. Asıl zorluk burada. Ödeme servisine kendi store’unu ver; monolitin tablolarına ortak yazma. Aralarına bir anti-corruption layer koy ki monolitin modeli yeni servise sızmasın.
- Tutarlılığı outbox + events ile sağla. Distributed transaction’a girme; değişikliği kendi DB’ne yaz, aynı transaction’da bir outbox kaydı bırak, event olarak yayınla. Veriyi taşırken dual-write + backfill, sonra reconcile, sonra cutover.
- Sadece sınırı temiz modülü kopar. Ödeme modülü monolitin tablolarına dolanmışsa, önce o dikişi (seam) düzelt. Sınır zaten net değilse Strangler Fig’i başlatmak felaketi hızlandırır.
Sonuç: Ben olsam gateway’de ağırlıklı routing + monolit fallback kurar, yeni Go servisini önce shadow’da gerçek parayla değil aynalanmış trafikle doğrular, sonra kademeli açardım. Asıl işin routing değil veri ayrımı olduğunu unutma: paylaşılan tablo yok, anti-corruption layer var, tutarlılık outbox/event ile geliyor. Mimari derinliği sade.dev’de açıyorum — sınırı temiz olmayan modülü koparmaya kalkma.
İlgili Yazılar
Yorumlar
Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.