ป้ายกำกับ: JSON

PHP: การจัดการคิวงานเบื้องหลัง (Background Job/Queue) ด้วย Redis หรือ RabbitMQPHP: การจัดการคิวงานเบื้องหลัง (Background Job/Queue) ด้วย Redis หรือ RabbitMQ


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


อ่านเพิ่มเติม