İçeriğe geç
Muhammet Şafak
en
Soran: Onur Cevaplandı:

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:

  1. Gateway’de ağırlıklı yönlendirme kur. Nginx/Envoy önde dursun, ödeme trafiğini %5 → %20 → %100 ağırlıkla yeni Go servisine yolla, geri kalanı monolite. Bir şey patlarsa monolit fallback’in hazır; geri dönüş tek satır config.
  2. Ö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.
  3. 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.
  4. 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.
  5. 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

Etiketler: #mimari#mikroservis#go
Paylaş:

Yorumlar

Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.

Diğer Sorular

Tüm sorular

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi