ในการพัฒนาเว็บแอปพลิเคชัน คุณเคยเจอปัญหาผู้ใช้งานต้องรอหน้าจอนิ่งค้างนานหลายวินาทีเพียงเพื่อส่งอีเมลยืนยันตัวตนหรือประมวลผลรูปภาพหรือไม่? ปัญหานี้เกิดจากการที่ PHP ประมวลผลแบบ Synchronous คือต้องรอให้งานหนึ่งเสร็จก่อนจึงจะไปงานถัดไปได้ วิธีแก้ปัญหาที่ได้ผลที่สุดคือการนำ Queue (คิว) มาจัดการงานเหล่านี้เบื้องหลังครับ
ทำไมต้องใช้ Queue?
หลักการของ Queue คือการแยกงานที่ใช้เวลานานออกจากการตอบสนองของผู้ใช้งาน (Request/Response Cycle) โดยแอปพลิเคชันจะส่งข้อมูลงานไปเก็บไว้ใน “ถังพัก” (Message Broker) แล้วให้โปรแกรมอีกชุดหนึ่ง (Worker) มาหยิบงานไปทำทีละอย่างจนเสร็จ ทำให้ผู้ใช้งานไม่ต้องรอผลลัพธ์ของงานนั้น ๆ ทันทีครับ
Redis vs RabbitMQ เลือกตัวไหนดี?
- Redis: เหมาะสำหรับงานทั่วไปที่ต้องการความเร็วสูงมาก ติดตั้งง่าย และมีฟีเจอร์พื้นฐานสำหรับทำ Queue ได้ดีเยี่ยม (นิยมใช้ในโปรเจกต์ Laravel)
- RabbitMQ: เหมาะสำหรับระบบขนาดใหญ่ (Enterprise) ที่ต้องการความน่าเชื่อถือสูง มีระบบการจัดการเส้นทางข้อมูล (Routing) ที่ซับซ้อน และรองรับงานที่ต้องรับประกันว่าข้อมูลจะไม่หายอย่างแน่นอน
ตัวอย่างการส่งงานเข้าคิวด้วย Redis (Producer)
หากคุณใช้ Library ยอดนิยมอย่าง Predis คุณสามารถส่งงานเข้าคิวในรูปแบบ JSON ได้ง่าย ๆ ดังนี้ครับ
$redis = new Predis\Client();
$jobData = [
'task' => 'send_email',
'user_id' => 1234,
'email' => '[email protected]',
'time' => time()
];
// ส่งข้อมูลงานเข้าคิวชื่อ 'default_queue'
$redis->lpush('default_queue', json_encode($jobData));
echo "งานของคุณถูกส่งเข้าคิวเรียบร้อยแล้ว!";
การสร้างตัวรันงาน (Worker)
ตัว Worker จะเป็นไฟล์ PHP ที่รันค้างไว้ใน Terminal เพื่อคอยตรวจสอบว่ามีงานใหม่ในคิวหรือไม่:
$redis = new Predis\Client();
while (true) {
// รอรับงานจากคิว (Block จนกว่าจะมีข้อมูล)
$job = $redis->brpop('default_queue', 0);
$data = json_decode($job[1], true);
echo "กำลังเริ่มงาน: " . $data['task'] . " สำหรับ " . $data['email'] . "\n";
// จำลองการทำงานที่ใช้เวลานาน
sleep(5);
echo "งานสำเร็จแล้ว!\n";
}
สรุปข้อดี
1. User Experience ดีขึ้น: ผู้ใช้งานได้รับคำตอบทันที ไม่ต้องรอประมวลผลงานหนัก ๆ
2. Scalability: เราสามารถเพิ่มจำนวน Worker ได้ตามปริมาณงานที่ค้างในคิว
3. Reliability: หากงานล้มเหลว เราสามารถสั่งให้ Retry งานนั้นใหม่ได้โดยไม่กระทบกับตัวแอปพลิเคชันหลัก
การจัดการ Queue เป็นทักษะสำคัญสำหรับนักพัฒนาสาย Backend ที่ต้องการสร้างระบบที่รองรับการขยายตัวและมีความเสถียรในระดับมืออาชีพครับ
อ่านเพิ่มเติม