PlusMagi's Blog By Pitt Phunsanit Backend,Database จัดคิวยังไงดี Redis / RabbitMQ

จัดคิวยังไงดี Redis / RabbitMQ

ในสถาปัตยกรรมแบบ Microservices ที่ใช้ PostgreSQL เป็นแหล่งข้อมูลหลัก (Source of Truth) การจัดการงานเบื้องหลัง (Background Job) และการสื่อสารระหว่างเซอร์วิสอย่างมีประสิทธิภาพจึงเป็นหัวใจสำคัญของระบบ การเลือกระบบคิว (Queue System) ที่เหมาะสมระหว่าง Redis และ RabbitMQ จึงเป็นคำถามที่นักพัฒนาต้องตอบให้ได้

แม้ว่าทั้งสองเครื่องมือจะทำหน้าที่เป็นกลไกการส่งข้อความ (Messaging) ได้ แต่จุดเด่นทางสถาปัตยกรรมและกรณีการใช้งานที่เหมาะสมนั้นแตกต่างกันอย่างชัดเจน บทความนี้จะเจาะลึกว่าเมื่อคุณใช้ PostgreSQL เป็นแกนหลัก คุณควรเลือกใช้เครื่องมือใดเพื่อเพิ่มความเสถียรและความเร็วให้กับระบบของคุณ

Redis: ความเร็วสูงสำหรับงานคิวที่เน้น Throughput

Redis ถูกออกแบบมาให้เป็น In-memory Data Store ที่เร็วที่สุดตัวหนึ่ง การใช้ Redis ในการทำคิวงาน (Queue) มักจะใช้โครงสร้างข้อมูลประเภท List หรือ Streams ซึ่งทำให้การเพิ่ม (Push) และการดึง (Pop) ข้อมูลทำได้อย่างรวดเร็วมาก เหมาะสำหรับสถานการณ์ที่ความเร็วในการประมวลผลงาน (Throughput) เป็นสิ่งสำคัญที่สุด

กรณีที่ควรใช้ Redis กับ PostgreSQL:

  • Simple Task Queue: งานที่ไม่ซับซ้อนและไม่ต้องการการรับประกันการส่งข้อความแบบเข้มงวด (e.g., การส่ง Notification ทั่วไป).
  • Rate Limiting/Counter: การนับจำนวนครั้งที่เรียกใช้ API หรือการทำระบบจำกัดอัตราการใช้งาน.
  • Cache & Session: ใช้เป็นชั้นแคชที่อยู่หน้า PostgreSQL เพื่อลดภาระการ Query ข้อมูลซ้ำซ้อน.

ตัวอย่างการสร้างงานคิวใน PostgreSQL (ใช้ Redis เป็นตัวรับ):

ในทางปฏิบัติ PostgreSQL จะบันทึกสถานะงานลงในตารางก่อน จากนั้น Worker จะอ่านจาก Redis:

SQL

-- 1. สร้างตารางบันทึกงานใน PostgreSQL<br>CREATE TABLE job_queue (id SERIAL PRIMARY KEY, job_type VARCHAR(50), payload TEXT, status VARCHAR(20), created_at TIMESTAMP DEFAULT NOW());<br><br>-- 2. บันทึกงานใหม่ที่ต้องประมวลผล (Payload: '1,2,3')<br>INSERT INTO job_queue (job_type, payload, status) VALUES ('process_order', '1,2,3', 'PENDING');<br><br>-- 3. Worker จะอ่านจาก Redis List: LPUSH job:queue '1,2,3'

RabbitMQ: ความน่าเชื่อถือสำหรับระบบที่ต้องการการรับประกัน (Guaranteed Delivery)

RabbitMQ คือ Message Broker ที่ถูกสร้างมาเพื่อการสื่อสารระหว่างเซอร์วิสโดยเฉพาะ มันรองรับโปรโตคอลมาตรฐานอย่าง AMQP ทำให้มีระบบการจัดเส้นทาง (Routing) ที่ซับซ้อน และที่สำคัญที่สุดคือ การรับประกันการส่งข้อความ (Guaranteed Delivery) หากเซอร์วิสปลายทางล่ม ข้อความจะไม่หายไป แต่จะถูกเก็บไว้ในคิวจนกว่าเซอร์วิสจะกลับมาทำงานได้

กรณีที่ควรใช้ RabbitMQ กับ PostgreSQL:

  • Financial Transactions: งานที่เกี่ยวข้องกับการเงิน การชำระเงิน หรือการเปลี่ยนแปลงข้อมูลสำคัญที่ห้ามสูญหายเด็ดขาด.
  • Complex Workflow: ระบบที่ต้องมีการส่งข้อความหลายขั้นตอน (Multi-step workflow) เช่น การสั่งซื้อสินค้าที่ต้องผ่านการตรวจสอบสต็อก -> การชำระเงิน -> การแจ้งเตือน.
  • Decoupling Services: เมื่อคุณต้องการให้เซอร์วิสต่างๆ ทำงานแยกจากกันโดยไม่รู้ถึงสถานะการทำงานของกันและกัน.

ตัวอย่างการบันทึกงานใน PostgreSQL (ก่อนส่งเข้า RabbitMQ):

SQL

-- บันทึกงานที่พร้อมส่งเข้าคิว<br>INSERT INTO job_queue (job_type, payload, status) VALUES ('process_payment', '1,2,3', 'READY_TO_SEND');

สรุป: เมื่อไหร่ควรใช้อะไร?

การตัดสินใจขึ้นอยู่กับความต้องการหลักของระบบคุณ:

  1. เลือก Redis: หากระบบของคุณเน้น ความเร็ว (Speed) และ ปริมาณงานสูง (High Throughput) และสามารถยอมรับความเสี่ยงที่ข้อความอาจสูญหายได้เล็กน้อย (เช่น การแจ้งเตือนที่ไม่สำคัญ).
  2. เลือก RabbitMQ: หากระบบของคุณเน้น ความน่าเชื่อถือ (Reliability) และ การรับประกันการส่งข้อความ (Guaranteed Delivery) ซึ่งสำคัญต่อความสมบูรณ์ของข้อมูลทางการเงินหรือข้อมูลสำคัญอื่นๆ.

ในทางปฏิบัติที่ดีที่สุดคือการใช้ PostgreSQL เป็นแหล่งข้อมูลหลัก และใช้ Redis สำหรับคิวงานที่เน้นความเร็ว และใช้ RabbitMQ สำหรับคิวงานที่ต้องการความมั่นคงและ Transactional Integrity สูงสุด