ช่วงนี้ผมเจองานที่ต้องใช้เวลาประมวลผลนาน ไม่ก็มีปริมาณงานที่เยอะ ไม่สามารถ responses ได้ภายในระยะเวลาไม่กี่วินาที

โดยทั่วไปแล้ว เมื่อเจองานลักษณะนี้ การออกแบบระบบที่ใช้กันคือ การสร้าง Job Processing Background หน้าตามันก็จะประมาณนี้

Job Processing Background

อธิบายแบบ ง่ายๆ คือ เราจะมี api service หนึ่งตัว ที่จะยิงไปบอกว่าต้องการทำงานอะไร แล้ว api service จะสร้าง Job ID ส่งกลับมา

หลังจากนั้น ทาง client จะวนเช็คสถานะการทำงานว่า งานให้สั่งไปเสร็จแล้วหรือยัง โดยการยิง request แนบ job id ไปถามสถานะ เพื่อแสดง progress การทำงาน

ซึ่งตรงนี้ เราสามารถออกแบบไปทางอื่นๆ ก็ได้ เช่น ต้องการแสดง notification บอกลูกค้า เราก็ไม่จำเป็นต้องคอยยิงเช็คซ้ำๆ ไปรอให้ service ยิง notification มาบอกเราเลยก็ได้เช่นกัน ขึ้นอยู่กับ requirements และการออกแบบ

กลับมาเข้าเรื่องของบทความนี้กันดีกว่า

การทำงานเบื้องหลัง (background job) เป็นอีกส่วนที่เราต้องพัฒนามันเพิ่ม ซึ่งเราอาจจะเขียนขึ้นมาเองก็ได้ แต่ในเมื่อมีคนทำให้แล้วเราจะเขียนเองทำไมละ บทความนี้เลยหยิบเอา Node Library ตัวนึงที่ใช้สำหรับทำงาน background job มาแชร์ ซึ่งก็คือ BullMQ


BullMQ

เป็น Node.js library ที่ใช้สำหรับจัดการ job queue และ background processing โดยใช้ Redis เป็น message broker และ storage backend

คุณสมบัติหลักของ BullMQ คือ

  • การจัดการ Queue ที่มีประสิทธิภาพ - รองรับการประมวลผล job แบบ asynchronous และ distributed
  • Job Scheduling - สามารถกำหนดเวลาให้ job ทำงานในอนาคตหรือทำซ้ำตามช่วงเวลา
  • Priority Queue - จัดลำดับความสำคัญของ job
  • Rate Limiting - ควบคุมอัตราการประมวลผล job
  • Retry Logic - ลองทำ job ใหม่ เมื่อเกิดข้อผิดพลาด
  • Progress Tracking - ติดตามความคืบหน้าของ job
  • Event System - รับฟังเหตุการณ์ต่างๆ ของ queue และ job

ตัวอย่างการใช้งานในสถานการณ์จริง:

  • Email Queue - ส่งอีเมลยืนยัน, newsletter, การแจ้งเตือน
  • Image Processing - resize, crop, optimize รูปภาพที่ user upload
  • Data Export - สร้างรายงาน CSV, PDF ที่ใช้เวลานาน
  • Payment Processing - ประมวลผลการชำระเงิน, webhook handling
  • Notification System - ส่ง push notification, SMS
  • File Upload - ประมวลผลไฟล์ที่ user upload เช่น video transcoding

วิธีการใช้งาน

สามารถเข้าไปดูใน repo นี้ได้เลย

GitHub - Thammasok/background-job-processing-bullmq: Background job processing using Node.JS with BullMQ
Background job processing using Node.JS with BullMQ - Thammasok/background-job-processing-bullmq

Documents ของ BullMQ

BullMQ - Background Jobs processing and message queue for NodeJS
BullMQ is a fast and robust background job processing library for Redis™