• ช่วงหลังมานี้ แนวทางแบบไฮบริดที่ผสาน 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 เป็นศูนย์กลาง พร้อม ขยายด้วยภาษาอื่นแบบเลือกใช้ตามความจำเป็น ได้

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น