ในโลกของการพัฒนาเว็บแอปพลิเคชันที่ต้องการความเสถียรและประสิทธิภาพสูง การประมวลผลแบบ Synchronous (การทำงานแบบเรียงลำดับ) มักเป็นคอขวดที่ทำให้ผู้ใช้ต้องรอการตอบกลับที่นานเกินไป การแก้ปัญหานี้คือการใช้ Message Queue System เช่น RabbitMQ ซึ่งทำงานบนโปรโตคอล AMQP (Advanced Message Queuing Protocol) เพื่อให้ระบบสามารถทำงานแบบ Asynchronous ได้
สำหรับนักพัฒนาที่ใช้ CodeIgniter (CI) การเชื่อมต่อกับ RabbitMQ โดยตรงผ่านไลบรารีอย่าง php-amqplib นั้นเป็นวิธีที่ทรงพลัง แต่การจัดการการเชื่อมต่อและการตั้งค่าควรถูกห่อหุ้มไว้ใน Custom Library เพื่อให้โค้ดสะอาดและสามารถนำกลับมาใช้ใหม่ได้ (Reusability) บทความนี้จะแนะนำวิธีการสร้าง Custom Driver ใน CI เพื่อจัดการการสื่อสารกับ RabbitMQ อย่างเป็นระบบ โดยเน้นการใช้ PostgreSQL ในการจัดการข้อมูลสถานะและ Configuration เพื่อเพิ่มความสมบูรณ์ของระบบ
⚙️ สถาปัตยกรรม: CI, AMQP และ PostgreSQL
หลักการคือ CI จะทำหน้าที่เป็น Producer (ผู้ส่งข้อความ) โดยส่งข้อความไปยัง Queue ผ่าน AMQP ส่วน PostgreSQL จะทำหน้าที่เป็นแหล่งข้อมูลความจริง (Source of Truth) สำหรับการเก็บค่า Configuration ของการเชื่อมต่อ (Connection Details) และบันทึกสถานะของข้อความ (Message Status) ที่ถูกส่งออกไป เพื่อให้ระบบ Worker (Consumer) สามารถตรวจสอบสถานะได้
1. การตั้งค่า Connection Parameters ใน PostgreSQL
ก่อนเริ่มการเชื่อมต่อ เราควรเก็บค่า Host, Port, Username และ Password ของ RabbitMQ ไว้ในตารางที่เหมาะสมใน PostgreSQL เพื่อให้ CI สามารถดึงค่าเหล่านี้มาใช้ได้ แทนการ Hardcode ค่าไว้ในไฟล์ Config
SQL
-- สร้างตารางสำหรับเก็บรายละเอียดการเชื่อมต่อ RabbitMQ
CREATE TABLE rabbitmq_config (
config_key VARCHAR(50) PRIMARY KEY,
config_value TEXT NOT NULL,
description VARCHAR(255)
);
-- ใส่ค่า Host และ Port
INSERT INTO rabbitmq_config (config_key, config_value, description) VALUES
('amqp_host', '127.0.0.1', 'RabbitMQ Host Address');
INSERT INTO rabbitmq_config (config_key, config_value, description) VALUES
('amqp_port', '5672', 'RabbitMQ Port Number');
2. การสร้าง Custom Driver ใน CodeIgniter
ใน CI Library ของเรา เราจะเขียนโค้ดเพื่อดึงค่าจาก PostgreSQL มาประกอบการสร้าง AMQPStreamConnection และจัดการการส่งข้อความ (Publishing) โดยใช้โครงสร้างของ Custom Library เพื่อให้การจัดการทรัพยากรเป็นไปอย่างมีระเบียบ
SQL
-- ตัวอย่างการใช้ PostgreSQL เพื่อบันทึกสถานะของ Message ที่ส่งออกไป
-- สมมติว่าเราส่ง Message ID: 'ORDER_12345' ไปยัง Queue: 'order_processing'
INSERT INTO message_queue_log (message_id, queue_name, status, sent_at)
VALUES ('ORDER_12345', 'order_processing', 'PENDING', NOW());
-- เมื่อส่งสำเร็จแล้ว อัปเดตสถานะ
UPDATE message_queue_log SET status = 'SENT', sent_at = NOW()
WHERE message_id = 'ORDER_12345';
✅ บทสรุป: ประโยชน์ของการแยกส่วนงาน
การใช้ Custom Driver ร่วมกับ PostgreSQL ในการจัดการ AMQP ทำให้ระบบของเรามีความยืดหยุ่นสูง (Decoupling) เมื่อเกิดปัญหาที่ระบบใดระบบหนึ่ง (เช่น RabbitMQ ล่มชั่วคราว) CI ยังสามารถบันทึกสถานะลงใน PostgreSQL เพื่อให้ Worker ทราบว่าต้องพยายามส่งข้อความนี้ใหม่ (Retry Logic) ได้อย่างแม่นยำ การออกแบบเช่นนี้ไม่เพียงแต่เพิ่มความเร็วในการตอบสนองของแอปพลิเคชันเท่านั้น แต่ยังเพิ่มความทนทาน (Resilience) ให้กับสถาปัตยกรรมโดยรวมด้วย