PlusMagi's Blog By Pitt Phunsanit Backend,Database Event-Driven Architecture (EDA)

Event-Driven Architecture (EDA)

ในโลกของสถาปัตยกรรมซอฟต์แวร์ที่ซับซ้อน การสื่อสารระหว่างส่วนประกอบ (Components) อย่างมีประสิทธิภาพเป็นสิ่งสำคัญอย่างยิ่ง Event-Driven Architecture (EDA) คือรูปแบบสถาปัตยกรรมที่ระบบจะตอบสนองต่อเหตุการณ์ (Events) ที่เกิดขึ้น แทนที่จะรอให้ส่วนประกอบอื่นเรียกใช้ (Request/Response) ซึ่งทำให้ระบบมีความยืดหยุ่น (Decoupling) สูงมาก

สำหรับนักพัฒนาที่ใช้ PostgreSQL เป็นระบบฐานข้อมูลหลัก การนำแนวคิด EDA มาใช้โดยไม่พึ่งพา Message Broker ภายนอก (เช่น Kafka) สามารถทำได้โดยการใช้คุณสมบัติในตัวของ PostgreSQL เอง โดยเฉพาะอย่างยิ่งการใช้กลไก LISTEN และ NOTIFY ร่วมกับ Triggers เพื่อสร้าง Event Bus อย่างง่ายแต่ทรงพลัง

หลักการทำงานของ EDA ด้วย PostgreSQL

หัวใจสำคัญของการทำ EDA ใน PostgreSQL คือการเปลี่ยนการกระทำ (Action) ให้เป็นเหตุการณ์ (Event) เมื่อมีการเปลี่ยนแปลงข้อมูลในตารางหลัก (เช่น การสร้างผู้ใช้ใหม่) เราจะใช้ Trigger เพื่อตรวจจับการเปลี่ยนแปลงนั้น และใช้คำสั่ง NOTIFY เพื่อเผยแพร่เหตุการณ์ดังกล่าวออกไปบนช่องสัญญาณ (Channel) ที่กำหนด

ส่วนบริการอื่น ๆ ที่ต้องการรับทราบเหตุการณ์นี้ จะทำหน้าที่เป็น Subscriber โดยการใช้คำสั่ง LISTEN เพื่อรอรับข้อความบนช่องสัญญาณนั้น เมื่อมีเหตุการณ์เกิดขึ้น ข้อมูลที่ถูกส่งผ่าน NOTIFY จะถูกรับไปประมวลผลต่อได้ทันที

ตัวอย่างการสร้าง Event Bus ด้วย LISTEN/NOTIFY

สมมติว่าเรามีตาราง user_accounts และต้องการให้ทุกบริการที่เกี่ยวข้องรู้เมื่อมีการสร้างบัญชีผู้ใช้ใหม่:

SQL

-- 1. สร้างตารางหลักที่เกิดเหตุการณ์ (Event Source Table) </code>
CREATE TABLE user_accounts (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL
);

-- 2. สร้างฟังก์ชัน Trigger ที่จะส่ง Notification เมื่อมีการ INSERT
CREATE OR REPLACE FUNCTION notify_user_created() RETURNS TRIGGER AS $$
BEGIN
    PERFORM pg_notify('user_events', row_to_json(NEW)::text);
    RETURN NEW;
END;$$ LANGUAGE plpgsql;

-- 3. ผูก Trigger เข้ากับตาราง
CREATE TRIGGER user_insert_trigger
AFTER INSERT ON user_accounts
FOR EACH ROW
EXECUTE FUNCTION notify_user_created();

-- 4. การจำลองการเกิดเหตุการณ์ (Publisher Action)
INSERT INTO user_accounts (username, email) VALUES ('alice', '[email protected]');

-- 5. การจำลองการเป็น Subscriber (Service Listener)
LISTEN user_events;
-- (ในแอปพลิเคชันภายนอกจะใช้ NOTIFY/LISTEN เพื่อรอรับข้อความนี้)

ข้อดีและข้อพิจารณาในการออกแบบ

การใช้ LISTEN/NOTIFY ทำให้เกิดการแยกส่วนประกอบ (Decoupling) ที่ยอดเยี่ยม เพราะบริการที่ 1 ไม่จำเป็นต้องรู้ว่าบริการที่ 2 มีอยู่จริง เพียงแค่รู้ว่าต้องส่งเหตุการณ์ไปยังช่องสัญญาณที่ถูกต้อง

  • ความยืดหยุ่น (Decoupling): ส่วนประกอบไม่ขึ้นต่อกัน ทำให้ง่ายต่อการเพิ่มบริการใหม่
  • ประสิทธิภาพ: เหมาะสำหรับเหตุการณ์ที่ไม่ต้องการการรับประกันการส่งมอบ (At-most-once delivery) ซึ่งเป็นกรณีที่ต้องการความรวดเร็ว
  • ข้อจำกัด: กลไกนี้เหมาะสำหรับการส่งข้อมูลแบบ Real-time และมีข้อจำกัดด้านความทนทานต่อความล้มเหลว (Fault Tolerance) หากระบบล่มระหว่างการส่งข้อมูล อาจต้องพิจารณาใช้ Event Log Table ร่วมด้วยเพื่อความสมบูรณ์ของข้อมูล

บทสรุป

EDA ด้วย PostgreSQL เป็นการพิสูจน์ให้เห็นว่าฐานข้อมูลเชิงสัมพันธ์ที่ทรงพลังอย่าง PostgreSQL สามารถทำหน้าที่เป็น Event Bus ได้อย่างมีประสิทธิภาพ ด้วยการใช้ Trigger และ LISTEN/NOTIFY นักพัฒนาสามารถสร้างระบบที่ตอบสนองต่อเหตุการณ์ได้อย่างรวดเร็วและยืดหยุ่น ซึ่งเป็นรากฐานสำคัญในการออกแบบสถาปัตยกรรมระดับ Senior Architect ที่ทันสมัย

Exit mobile version