- In letzter Zeit rückt ein hybrider Ansatz in den Fokus, bei dem Go und Rust innerhalb einer PHP-Monolith-Struktur als Erweiterungssprachen integriert werden
- Früher wurde mit der Kombination aus Go-Microservices und einem PHP-8.3-Monolithen ein ausgewogenes Verhältnis zwischen Produktivität und hoher Performance erreicht
- Gemäß dem Pareto-Prinzip (80 % des Traffics konzentrieren sich auf 20 % der APIs) war die Optimierung von Hotspot-Endpunkten unverzichtbar; früher wurde darauf mit Caching und der Auslagerung in Go-Services reagiert, was jedoch die Komplexität erhöhte
- Durch die jüngsten Fortschritte im PHP-Ökosystem sind Techniken wie FFI, Rust-Erweiterungen und Go-Erweiterungen (FrankenPHP) entstanden, mit denen sich die Performance innerhalb des Monolithen deutlich steigern lässt
- Rust-Erweiterungen bieten gleichzeitig Speichersicherheit und Geschwindigkeit, und FrankenPHP zeigt im Worker-Mode dank Go-basierter Erweiterungen eine mehr als vierfache Performance-Steigerung
- Ohne die Kosten und Risiken einer Neuschreibung in Go oder Rust in Kauf zu nehmen, lässt sich mit dem Ansatz Hybrid-PHP sowohl Produktivität als auch Geschwindigkeit sichern
Hintergrund und bisherige Architektur
- Bisher wurde rund um eine bestehende DDD-Monolith-Anwendung (mother) für die Optimierung bestimmter Funktionen separat Go-basierte Microservices (children) entwickelt
- Die Go-Microservices übernahmen die Verarbeitung von High-Performance-Traffic, während der PHP-8.3-Monolith in einem kleinen Backend-Team schnelle Feature-Entwicklung und zuverlässige Deployments ermöglichte
- Diese Struktur bot einen ausgewogenen Punkt, an dem sich Geschwindigkeit, Stabilität und Produktivität zugleich erreichen ließen
Performance-Engpässe und bisherige Gegenmaßnahmen
- Häufig wurde das Pareto-Prinzip beobachtet, nach dem sich 80 % des Traffics auf 20 % der API-Endpunkte konzentrieren
- Für diese performancekritischen 20 % wurden verschiedene Maßnahmen eingeführt, darunter optimierter Code, zusätzliche Caching-Schichten und die Auslagerung in Go-Microservices
- Allerdings stieß dieser Ansatz bei Komplexität und Betriebsaufwand an Grenzen
Hybride Optionen im modernen PHP-Ökosystem
- Inzwischen gibt es mehr Technologien, mit denen sich die Performance direkt innerhalb eines PHP-Monolithen verbessern lässt
-
1. FFI (Foreign Function Interface)
- Mit der FFI-Funktion von PHP kann C-Code direkt aus PHP heraus aufgerufen werden
- Auch systemnahe oder performancekritische Logik lässt sich so innerhalb eines PHP-Projekts umsetzen
- Wegen der Kosten für Context Switching wird der Einsatz jedoch nur in passenden Situationen empfohlen
-
2. Rust-basierte Erweiterungen
- PHP-Erweiterungen können in Rust (oder Zig) entwickelt werden
- Stark belastete Bereiche lassen sich an Rust-Erweiterungen mit Speichersicherheit und Compiler-Performance auslagern, wodurch sich Zuverlässigkeit und hohe Geschwindigkeit zugleich erreichen lassen
-
3. Go-basierte Erweiterungen: FrankenPHP
- Nach dem jüngsten Umstieg auf FrankenPHP zeigte sich im worker mode eine mehr als viermal höhere Performance als zuvor
- Mit einem aktuellen Release ist es nun auch möglich, PHP-Erweiterungen in Go zu schreiben
- Dadurch lässt sich die API-Performance von Go direkt innerhalb eines PHP-Monolithen nutzen, sodass sich Produktivität und Geschwindigkeit ohne sprachliche Aufteilung verbinden lassen
Warum keine vollständige Migration nach Go oder Rust?
- Kosten und Risiko einer vollständigen Neuschreibung sind hoch
- Eine bereits große und stabile Anwendung komplett auf Go oder Rust umzustellen, bedeutet erhebliches Risiko und hohen Ressourceneinsatz
- PHP hat weiterhin eigene Stärken
- Für die meisten Anforderungen bleiben die schnelle Entwicklung mit PHP, das zugängliche Ökosystem und die ausreichend hohe Geschwindigkeit wettbewerbsfähig
- Wenn nur die Bereiche mit echten Performance-Grenzen hybrid mit Go oder Rust aufgebaut werden, entfällt die Notwendigkeit einer vollständigen Migration
Fazit: der Wert von Hybrid-PHP
- Das moderne PHP-Ökosystem bietet neben schneller Entwicklungsproduktivität auch Anbindungsoptionen für High-Performance-Erweiterungen in C, Rust und Go
- Mit einer solchen hybriden Struktur lassen sich Geschwindigkeit und Produktivität zugleich sichern
- Damit entsteht ein neues Architekturparadigma, das eine PHP-zentrierte Entwicklung beibehält und bei Bedarf eine selektive sprachbasierte Erweiterung ermöglicht
Noch keine Kommentare.