- 近年、PHPモノリシック構造の中でGoとRustを拡張言語として統合するハイブリッドな手法が注目されている
- 以前から、GoマイクロサービスとPHP 8.3モノリシックの組み合わせにより、生産性と高性能をバランスよく実現してきた
- パレートの法則(トラフィックの80%が20%のAPIに集中)に従い、ホットスポットとなるエンドポイントの最適化が必須であり、過去にはキャッシュやGoサービスの分離で対応していたが、複雑性が増していた
- 近年はPHPエコシステムの発展により、FFI、Rust拡張、**Go拡張(FrankenPHP)**といった手法が登場し、モノリシック内部で性能を大幅に高められるようになった
- Rust拡張はメモリ安全性と速度を同時に提供し、FrankenPHPはワーカーモードとGoベース拡張によって最大4倍以上の性能向上を示している
- 全体をGo/Rustで書き直すコストとリスクを避けつつ、ハイブリッドPHPというアプローチによって生産性と速度の両立が可能になる
背景と従来のアーキテクチャ
- 従来は、DDDモノリシックアプリケーション(mother)を中心に、特定機能の最適化のためGoベースのマイクロサービス(children)を別途開発していた
- Goマイクロサービスは高性能なトラフィック処理を担い、PHP 8.3モノリシックは小規模なバックエンドチーム環境で迅速な機能開発とデプロイの信頼性を提供していた
- この構成は、速度・安定性・生産性をすべて確保できるバランスポイントを提供していた
性能ボトルネックと従来の対応方法
- トラフィックの80%が20%のAPIエンドポイントに集中するというパレート原則がしばしば観測される
- 最も性能が重要なこの20%の領域に対して、最適化コードの作成、キャッシュ層の追加、Goマイクロサービスへの分離など、さまざまな方法が導入されてきた
- しかし、複雑性と運用負荷の面で限界があった
最新のPHPエコシステムにおけるハイブリッドオプション
- 最近では、PHPモノリシック内部で直接性能を改善できる技術が増えている
-
1. FFI (Foreign Function Interface)
- PHPのFFI機能により、PHPからCコードを直接呼び出せる
- システムレベルや性能クリティカルなロジックもPHPプロジェクト内で実装可能
- ただし、コンテキストスイッチのコストを考慮し、適切な場面に限って使うことが推奨される
-
2. Rustベース拡張
- Rust(またはZig)でPHP拡張を開発できる
- 高負荷な処理領域を、メモリ安全性とコンパイル性能を備えたRust拡張にオフロードすることで、信頼性と高速性の両方を確保できる
-
3. Goベース拡張: FrankenPHP
- 最近FrankenPHPへ移行し、worker modeで動作させたところ、従来比で4倍以上高速な性能が確認された
- 最近のリリースにより、GoでPHP拡張を書くことも可能になった
- これにより、GoのAPI性能をPHPモノリシック内でそのまま活用でき、言語分割なしに生産性と速度を結び付けることが可能になった
全面GoまたはRustへの完全移行ではない理由
- 全面的な書き直しコストとリスク負担が大きい
- すでに大規模で安定したアプリケーションを完全にGoやRustへ置き換えるのは、リスクもリソース消費も大きい
- PHP自体に依然として強みがある
- 大半の業務では、PHPの素早い開発、親しみやすいエコシステム、十分に速い性能が依然として競争力になる
- 真に性能限界が求められる一部の領域だけをGoやRustでハイブリッド構成にすれば、全面移行の必要性を解消できる
結論: ハイブリッドPHPの価値
- 現代のPHPエコシステムは、高速な開発生産性に加えて、高性能なC、Rust、Go拡張との連携オプションをすべて提供している
- このようなハイブリッド構造により、速度と生産性の両立が可能になる
- PHP中心の開発を維持しながら、必要に応じて言語を選択的に拡張できる新しいアーキテクチャパラダイムを提示している
まだコメントはありません。