ในการพัฒนาเว็บแอปพลิเคชัน คุณเคยเจอปัญหาผู้ใช้งานต้องรอหน้าจอนิ่งค้างนานหลายวินาทีเพียงเพื่อส่งอีเมลยืนยันตัวตนหรือประมวลผลรูปภาพหรือไม่? ปัญหานี้เกิดจากการที่ 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 ได้ง่าย ๆ ดังนี้ครับ
PHP
PHP
$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 "งานของคุณถูกส่งเข้าคิวเรียบร้อยแล้ว!";