- ช่วงหลังมานี้ แนวทางแบบไฮบริดที่ผสาน Go และ Rust เป็นภาษาส่วนขยายภายใน สถาปัตยกรรม PHP monolith กำลังได้รับความสนใจ
- ก่อนหน้านี้ การผสานระหว่าง Go microservices กับ PHP 8.3 monolith ช่วยสร้างสมดุลระหว่าง ประสิทธิภาพการพัฒนา และ สมรรถนะสูง ได้อย่างลงตัว
- ตาม กฎของพาเรโต (80% ของทราฟฟิกกระจุกอยู่ที่ 20% ของ API) การปรับแต่ง endpoint จุดร้อนเป็นสิ่งจำเป็น และในอดีตมักรับมือด้วย caching หรือ แยกบริการ Go ออกไป แต่สิ่งนี้ก็เพิ่มความซับซ้อน
- ช่วงหลัง การเติบโตของ ecosystem ของ PHP ทำให้เกิดเทคนิคอย่าง FFI, Rust extension และ Go extension (FrankenPHP) ซึ่งช่วยยกระดับประสิทธิภาพภายใน monolith ได้อย่างมาก
- Rust extension มอบทั้งความปลอดภัยด้านหน่วยความจำและความเร็ว ขณะที่ FrankenPHP แสดงให้เห็นถึง ประสิทธิภาพที่เพิ่มขึ้นมากกว่า 4 เท่า ผ่าน worker mode และส่วนขยายที่อิงกับ Go
- โดยไม่ต้องแบกรับ ต้นทุนและความเสี่ยงของการเขียนใหม่ทั้งหมด เป็น Go/Rust แนวทาง Hybrid PHP ช่วยให้ได้ทั้ง ประสิทธิภาพการพัฒนาและความเร็ว
ภูมิหลังและสถาปัตยกรรมเดิม
- เดิมทีใช้ แอปพลิเคชัน DDD monolith (mother) เป็นศูนย์กลาง และพัฒนา microservice ที่อิงกับ Go (children) แยกออกมาต่างหากเพื่อปรับแต่งฟังก์ชันเฉพาะบางส่วน
- Go microservices รับหน้าที่ ประมวลผลทราฟฟิกสมรรถนะสูง ขณะที่ PHP 8.3 monolith มอบ การพัฒนาฟีเจอร์ที่รวดเร็วและความเชื่อถือได้ในการ deploy ในบริบทของทีม backend ขนาดเล็ก
- โครงสร้างเช่นนี้เป็นจุดสมดุลที่ช่วยให้ได้ทั้ง ความเร็ว เสถียรภาพ และผลิตภาพ
คอขวดด้านประสิทธิภาพและวิธีรับมือแบบเดิม
- มักพบ หลักการพาเรโต ที่ว่า 80% ของทราฟฟิกกระจุกตัวอยู่ที่ 20% ของ API endpoint
- สำหรับช่วง 20% ที่มีความสำคัญด้านประสิทธิภาพสูงสุด จึงมีการใช้หลายวิธี เช่น การเขียนโค้ดปรับแต่ง, เพิ่มชั้น caching, และ แยกเป็น Go microservice
- แต่ก็มีข้อจำกัดในด้านความซับซ้อนและภาระการดูแลระบบ
ตัวเลือกแบบไฮบริดใน ecosystem PHP ยุคใหม่
- ปัจจุบันมีเทคโนโลยีที่ช่วย ปรับปรุงประสิทธิภาพได้โดยตรงภายใน PHP monolith เพิ่มขึ้น
-
1. FFI (Foreign Function Interface)
- ความสามารถ FFI ของ PHP ทำให้สามารถเรียก โค้ด C ได้โดยตรงจาก PHP
- จึงสามารถนำ logic ระดับระบบหรือส่วนที่ performance-critical มาใช้งานภายในโปรเจกต์ PHP ได้
- อย่างไรก็ตาม ควรใช้เฉพาะในสถานการณ์ที่เหมาะสม โดยคำนึงถึง ต้นทุนของ context switching
-
2. ส่วนขยายที่อิงกับ Rust
- สามารถพัฒนา PHP extension ด้วย Rust (หรือ Zig) ได้
- การ offload ส่วนที่มีภาระงานสูงไปยัง Rust extension ซึ่งมีทั้ง ความปลอดภัยของหน่วยความจำ และ สมรรถนะจากการคอมไพล์ ช่วยให้ได้ทั้ง ความน่าเชื่อถือและความเร็วสูง
-
3. ส่วนขยายที่อิงกับ Go: FrankenPHP
- หลังเปลี่ยนมาใช้ FrankenPHP เมื่อทำงานใน worker mode พบว่า เร็วขึ้นมากกว่า 4 เท่า เมื่อเทียบกับเดิม
- ในรีลีสล่าสุด ยังสามารถ เขียน PHP extension ด้วย Go ได้อีกด้วย
- ทำให้สามารถใช้ สมรรถนะด้าน API ของ Go ได้โดยตรงภายใน PHP monolith และ ผสานผลิตภาพกับความเร็วได้โดยไม่ต้องแยกภาษาออกจากกัน
เหตุผลที่ไม่ย้ายทั้งหมดไปเป็น Go หรือ Rust
- ต้นทุนและความเสี่ยงของการเขียนใหม่ทั้งระบบ สูง
- การเปลี่ยนแอปพลิเคชันที่มีขนาดใหญ่และเสถียรอยู่แล้วทั้งหมดไปเป็น Go หรือ Rust มีทั้งความเสี่ยงและการใช้ทรัพยากรสูง
- PHP เองก็ยังมีจุดแข็งอยู่
- สำหรับงานส่วนใหญ่ ความรวดเร็วในการพัฒนา ecosystem ที่เป็นมิตร และความเร็วที่เพียงพอของ PHP ยังถือว่าแข่งขันได้
- หากนำ Go หรือ Rust มาใช้แบบไฮบริดเฉพาะในบางส่วนที่ต้องการ ขีดจำกัดด้านประสิทธิภาพอย่างแท้จริง ก็สามารถลดความจำเป็นในการย้ายทั้งระบบได้
บทสรุป: คุณค่าของ Hybrid PHP
- ecosystem PHP ยุคใหม่ มอบทั้ง ผลิตภาพในการพัฒนาที่รวดเร็ว และตัวเลือกในการเชื่อมต่อส่วนขยายสมรรถนะสูงอย่าง C, Rust และ Go
- โครงสร้างแบบไฮบริดเช่นนี้ช่วยให้ได้ทั้ง ความเร็วและผลิตภาพ
- เป็นการนำเสนอ paradigm สถาปัตยกรรมแบบใหม่ที่ยังคงการพัฒนาโดยมี PHP เป็นศูนย์กลาง พร้อม ขยายด้วยภาษาอื่นแบบเลือกใช้ตามความจำเป็น ได้
ยังไม่มีความคิดเห็น