- Gần đây, cách tiếp cận hybrid tích hợp Go và Rust như các ngôn ngữ mở rộng bên trong kiến trúc monolithic PHP đang thu hút sự chú ý
- Trước đây, sự kết hợp giữa microservice Go và monolith PHP 8.3 giúp đạt được sự cân bằng giữa năng suất và hiệu năng cao
- Theo nguyên lý Pareto (80% lưu lượng tập trung vào 20% API), việc tối ưu các endpoint hotspot là điều bắt buộc; trước đây người ta xử lý bằng cache·tách dịch vụ Go, nhưng độ phức tạp lại tăng lên
- Gần đây, cùng với sự phát triển của hệ sinh thái PHP, các kỹ thuật như FFI, extension Rust, extension Go (FrankenPHP) đã xuất hiện, cho phép tăng mạnh hiệu năng ngay bên trong monolith
- Extension Rust đồng thời mang lại an toàn bộ nhớ và tốc độ, còn FrankenPHP cho thấy mức cải thiện hiệu năng hơn 4 lần với worker mode và extension dựa trên Go
- Có thể đảm bảo cả năng suất lẫn tốc độ bằng cách tiếp cận PHP hybrid, đồng thời tránh được chi phí·rủi ro khi viết lại toàn bộ bằng Go/Rust
Bối cảnh và kiến trúc hiện có
- Trước đây, xoay quanh ứng dụng monolithic DDD (mother), các microservice dựa trên Go (children) được phát triển riêng để tối ưu những chức năng cụ thể
- Microservice Go đảm nhiệm xử lý lưu lượng hiệu năng cao, còn monolith PHP 8.3 mang lại phát triển tính năng nhanh và độ tin cậy khi triển khai trong bối cảnh đội backend nhỏ
- Cấu trúc này mang đến một điểm cân bằng giúp đảm bảo cả tốc độ, độ ổn định và năng suất
Điểm nghẽn hiệu năng và cách ứng phó trước đây
- Thường quan sát thấy nguyên lý Pareto trong đó 80% lưu lượng tập trung vào 20% endpoint API
- Đối với 20% khu vực quan trọng nhất về hiệu năng này, nhiều cách đã được áp dụng như viết mã tối ưu, thêm lớp cache, tách microservice Go
- Tuy nhiên vẫn tồn tại giới hạn về độ phức tạp và gánh nặng vận hành
Các lựa chọn hybrid trong hệ sinh thái PHP hiện đại
- Gần đây ngày càng có nhiều công nghệ cho phép cải thiện hiệu năng trực tiếp bên trong monolith PHP
-
1. FFI (Foreign Function Interface)
- Với tính năng FFI của PHP, có thể gọi trực tiếp mã C từ PHP
- Ngay cả logic ở cấp hệ thống hoặc performance-critical cũng có thể được triển khai trong dự án PHP
- Tuy vậy, nên chỉ dùng trong trường hợp phù hợp do cần cân nhắc chi phí context switching
-
2. Extension dựa trên Rust
- Có thể phát triển extension PHP bằng Rust (hoặc Zig)
- Bằng cách offload các khu vực chịu tải cao sang extension Rust có an toàn bộ nhớ và hiệu năng biên dịch, có thể đảm bảo cả độ tin cậy lẫn tốc độ cao
-
3. Extension dựa trên Go: FrankenPHP
- Gần đây sau khi chuyển sang FrankenPHP và chạy ở worker mode, đã xác nhận hiệu năng nhanh hơn hơn 4 lần so với trước đây
- Các bản phát hành gần đây cũng cho phép viết extension PHP bằng Go
- Nhờ đó có thể tận dụng trực tiếp hiệu năng API của Go ngay trong monolith PHP, kết hợp năng suất và tốc độ mà không cần tách ngôn ngữ
Vì sao không chuyển hoàn toàn sang Go hoặc Rust
- Chi phí viết lại toàn bộ và rủi ro đều cao
- Việc thay thế hoàn toàn một ứng dụng đã lớn và ổn định bằng Go hay Rust đòi hỏi nhiều tài nguyên và mang rủi ro lớn
- Bản thân PHP vẫn có những thế mạnh riêng
- Trong phần lớn công việc, tốc độ phát triển nhanh, hệ sinh thái thân thiện và hiệu năng đủ nhanh của PHP vẫn rất cạnh tranh
- Chỉ cần cấu hình hybrid với Go, Rust cho một số khu vực thực sự cần giới hạn hiệu năng cao nhất là có thể loại bỏ sự cần thiết phải chuyển toàn bộ
Kết luận: giá trị của PHP hybrid
- Hệ sinh thái PHP hiện đại cung cấp cả năng suất phát triển nhanh lẫn các lựa chọn tích hợp extension hiệu năng cao (C, Rust, Go)
- Với cấu trúc hybrid này, có thể đảm bảo cả tốc độ lẫn năng suất
- Vẫn duy trì phát triển lấy PHP làm trung tâm, đồng thời mở ra một mô hình kiến trúc mới cho phép mở rộng chọn lọc theo ngôn ngữ khi cần
Chưa có bình luận nào.