- Son dönemde PHP monolitik yapısı içinde Go ve Rust'ı uzantı dili olarak entegre eden hibrit yaklaşım dikkat çekiyor
- Önceden Go mikroservisleri ile PHP 8.3 monolitik yapısının birleşimiyle üretkenlik ve yüksek performans dengeli biçimde sağlanıyordu
- Pareto ilkesi (%80 trafiğin %20 API'ye yoğunlaşması) uyarınca hotspot endpoint'leri optimize etmek şarttı; geçmişte buna cache'leme ve Go servislerini ayırma ile yanıt veriliyordu, ancak bu da karmaşıklığı artırıyordu
- Son dönemde PHP ekosistemindeki gelişmelerle FFI, Rust uzantıları, Go uzantıları (FrankenPHP) gibi teknikler ortaya çıktı ve monolitik yapı içinde performansı büyük ölçüde artırmak mümkün hale geldi
- Rust uzantıları bellek güvenliği ile hızı aynı anda sunarken, FrankenPHP worker mode ve Go tabanlı uzantılarla 4 katın üzerinde performans artışı gösteriyor
- Her şeyi Go/Rust ile yeniden yazmanın maliyet ve riskinden kaçınırken, hibrit PHP yaklaşımıyla hem üretkenlik hem de hız elde edilebiliyor
Arka plan ve mevcut mimari
- Mevcut yapıda, DDD monolitik uygulama (mother) merkeze alınıyor ve belirli işlevleri optimize etmek için Go tabanlı mikroservisler (children) ayrı olarak geliştiriliyordu
- Go mikroservisleri yüksek performanslı trafik işleme görevini üstlenirken, PHP 8.3 monolitik yapı küçük backend ekiplerinde hızlı özellik geliştirme ve güvenilir dağıtım sağlıyordu
- Bu yapı, hız, istikrar ve üretkenliği aynı anda sağlamak için dengeli bir nokta sunuyordu
Performans darboğazları ve önceki yaklaşım
- Trafiğin %80'inin API endpoint'lerinin %20'sinde yoğunlaştığı Pareto ilkesi sıkça gözlemleniyordu
- Performansın en kritik olduğu bu %20'lik bölüm için optimize kod yazma, cache katmanı ekleme, Go mikroservislerine ayırma gibi çeşitli yöntemler kullanıldı
- Ancak karmaşıklık ve operasyon yükü açısından bunların sınırları vardı
Güncel PHP ekosistemindeki hibrit seçenekler
- Son dönemde performansı doğrudan PHP monolitik yapısının içinde iyileştirebilen teknolojilerin sayısı arttı
-
1. FFI (Foreign Function Interface)
- PHP'nin FFI özelliği sayesinde PHP içinden C kodu doğrudan çağrılabiliyor
- Sistem seviyesi ya da performans açısından kritik mantık da PHP projesi içinde uygulanabiliyor
- Ancak context switching maliyeti dikkate alınmalı; bu yüzden yalnızca uygun senaryolarda kullanılması öneriliyor
-
2. Rust tabanlı uzantılar
- Rust (veya Zig) ile PHP uzantıları geliştirilebiliyor
- Yüksek yük altındaki bölümler, bellek güvenliği ve derlenmiş performans sunan Rust uzantılarına offload edilerek hem güvenilirlik hem de yüksek hız elde edilebiliyor
-
3. Go tabanlı uzantılar: FrankenPHP
- Yakın zamanda FrankenPHP'ye geçildikten sonra worker mode'da çalıştırıldığında önceye kıyasla 4 katın üzerinde daha hızlı performans görüldü
- Son sürümlerle birlikte Go ile PHP uzantısı yazmak da mümkün hale geldi
- Böylece Go'nun API performansı doğrudan PHP monolitik yapısı içinde kullanılabiliyor; dili bölmeden üretkenlik ve hızı birleştirmek mümkün oluyor
Neden tamamen Go veya Rust'a geçilmiyor?
- Tam yeniden yazımın maliyeti ve risk yükü yüksek
- Zaten büyük ve kararlı bir uygulamayı tamamen Go veya Rust'a geçirmek ciddi risk ve kaynak tüketimi yaratıyor
- PHP'nin hâlâ güçlü yanları var
- Çoğu iş yükünde PHP'nin hızlı geliştirme yapısı, erişilebilir ekosistemi ve yeterince hızlı performansı hâlâ rekabetçi
- Gerçek performans sınırlarının gerektiği bazı alanlarda yalnızca Go ve Rust ile hibrit yapı kurmak, tüm sistemi taşıma gereğini ortadan kaldırabiliyor
Sonuç: Hibrit PHP'nin değeri
- Modern PHP ekosistemi, hızlı geliştirme üretkenliğiyle birlikte yüksek performanslı (C, Rust, Go) uzantı entegrasyonu seçeneklerinin tümünü sunuyor
- Bu hibrit yapı sayesinde hem hız hem de üretkenlik elde edilebiliyor
- PHP merkezli geliştirme korunurken, gerektiğinde dillere göre seçici genişleme yapılabilen yeni bir mimari paradigma ortaya konuyor
Henüz yorum yok.