# PHP monolitten ödeme modülünü Strangler Fig ile nasıl koparırım?

> Ödemeyi gateway'de 5/20/100 ağırlıkla kaydırıp önce shadow'da doğrulayın; asıl iş tabloları ayırmak, arkasında anti-corruption layer ve outbox durur.

- Soruldu: 2026-05-09
- Yanıtlandı: 2026-05-12
- Soran: Onur
- Etiketler: mimari, mikroservis, go
- Kaynak: https://www.muhammetsafak.com.tr/sor-bakalim/monolitten-mikroservise-strangler-fig-ile-kademeli-gecis/
- Dil: tr-TR
- Yazar: Muhammet Şafak

---
**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?


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'sine 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

- [Mikroservise Ne Zaman Geçerim?](https://sade.dev/tr/journal/mikroservise-ne-zaman-gecerim) — sade.dev
- [Laravel ve Go servisleri arasında mesaj şeması için Protobuf mu, JSON Schema mı?](https://www.muhammetsafak.com.tr/sor-bakalim/laravel-ve-go-arasinda-mesaj-semasi-protobuf-mu-json-schema-mi/) — Sor Bakalım
- [Yeni bir projeye mikroservislerle mi başlamalıyım?](https://www.muhammetsafak.com.tr/sor-bakalim/yeni-projeye-mikroservisle-mi-baslamali/) — Sor Bakalım
- [Mikroservislerde dağıtık izlemeyi (OpenTelemetry) nasıl kurarım?](https://www.muhammetsafak.com.tr/sor-bakalim/mikroserviste-dagitik-izleme-opentelemetry-ile-nasil-kurulur/) — Sor Bakalım
