เคยบ่นไปถึงเรื่อง การนำเอา Message Queue System มาใช้ในระบบงานที่ผมพัฒนาอยู่ ซึ่งมองหาดูแล้ว MQ ที่มีอยู่ในปัจจุบัน ดูเหมือนว่า "จะดีเกินไป" คือ
1. ดูเหมือนว่า ผมจะใช้ไม่ถึง 10% จาก feature ทั้งหมด
2. ไม่อยากทำให้ระบบมันวุ่นวาย ซ้บซ้อน มากไปกว่านี้
... ก็เลยเขียน Scripts เองซะเลย
เรื่องของ Queue
ทำไมต้องใช้ Queue?
สาเหตุที่ต้องใช้ queue ยกตัวอย่างเช่น
- มีข้อมูลที่ต้องการส่งไปประมวลผล จำนวน 1 ล้าน records หากส่งพร้อมกัน จะทำให้ server แม่ข่ายทำงานอย่างหนักได้ จึงต้องส่งไปเรื่อยๆ
- สามารถรับประกันการส่งข้อมูลได้ จึงแน่ใจได้ว่า message จะต้องถึงผู้รับอย่างแน่นอน
- เลือกประมวลผลแบบ batch หรือตั้งเวลาการส่งข้อมูลได้
Requirement
ก่อนอื่น มาดูก่อนว่า Queue ของผม ต้องทำอะไรได้บ้าง?
1. ต้องรับประกันการส่งข้อมูลได้ หาก server ปลายทางล่ม ระบบต้องรอ หรือส่ออีกครั้ง จนกว่าจะสำเร็จ
2. รูปแบบการส่ง
มีสองแบบ linear, thread
- linear เมื่อ server ปลายทางล่ม ระบบต้องหยุด queue ทันที จากนั้นค่อยทดลองส่งอีกที
- thread เมื่อ server ปลายทางล่ม ระบบจะส่ง message ต่อไปทันที จากนั้นค่อยกลับมาทดลองส่ง message ที่ส่งไม่ได้อีกที
3. Verfication
ระบบสามารถตรวจสอบได้ว่า server ปลายทาง เมื่อได้รับข้อมูลไปแล้ว จะทำงานได้อย่างถูกต้อง โดยการที่ MQ จะดูว่า server ปลายทาง คืนค่าอะไรกลับมาให้ จากนั้นนำไปเปรียบเทียบกับเงือนไขในการตรวจสอบ ที่กำหนดให้ MQ นั้นอีกที เมื่อพบว่าไม่ตรงกัน (server ปลายทาง อาจไม่ล่ม แต่ไม่สามารถส่งข้อมูลหรือทำงานในระบบของตนเองได้อย่างปกติ) ก็จะกลับมาส่งอีกรอบหนึ่ง
4. Notification MQ ต้องแจ้งให้ ผู้ส่ง ทราบว่า server ปลายทางได้รับข้อมูลเรียบร้อยแล้ว
5. Schedule, Datetime trigger MQ ต้องสามารถกำหนดเวลาที่ต้องการส่งข้อมูลได้
6. Priority สามารถกำหนดความสำคัญให้กับ Message ได้
ในระบบ MQ ใหญ่ๆ นั้น สามารถส่งข้อมูลไม่ต่ำกว่า 5000 Message ต่อนาที (ขึ้นอยู่กับ network & server ) และมีการนำเอาเรื่องของ Load balancing, Clustering, Routing มาใช้งานด้วย
อย่างไรก็ตาม ผมก็ไม่อยากใช้ JMS, MsMQ เลย ไม่ใช่เพราะไม่ดี แต่ไม่อยากเพิ่มความยุ่งยากในการ intregate ระบบงานเดิม แค่ปรับมาใช้ PHP 5.x ก็หวังว่าจะไม่มีความยุ่งยากใน scripts เดิมๆ ก็พอแล้ว แต่อย่างไรก็ตาม หลังจากระบบทุกอย่างทำงานเข้าที่ จะมามองเรื่อง MQ อีกทีหนึ่ง...
ปัญหา ที่อาจเกิดขึ้นตอนนี้คือ ระบบไม่สามารถทำงานได้เร็วพอ เนื่องการส่ง message แต่ล่ะอัน ก็เป็น process ของ PHP ซึ่งทำงานเพียง process เดียว และ PHP ก็ไม่สามารถทำงานแบบ multithread บน Windows เสียด้วย
โชคดีว่า PHP 5.1.x มี function กลุ่ม cURL (หรือ libcurl พัฒนาโดยคุณ Daniel Stenberg) ซึ่งเป็น Wrapper Library สำหรับติดต่อกับ Server ผ่าน protocal ต่างๆ เช่น http, https, ftp, gopher, telnet, dict, file, and ldap protocols ซึ่งมี function
int curl_multi_exec ( resource mh, int &still_running )
ซึ่งสามารถทำงานแบบ multithread ได้ ซึ่งจะเขียนในตอนต่อไป