ป้ายกำกับ: Blowfish

การสร้าง Sequence Diagram ด้วย Mermaid.js: เทคนิคเขียนเจาะลึกการสื่อสารระหว่าง Microservices พร้อมตัวอย่างการสร้าง Sequence Diagram ด้วย Mermaid.js: เทคนิคเขียนเจาะลึกการสื่อสารระหว่าง Microservices พร้อมตัวอย่าง

ในโลกของการพัฒนาซอฟต์แวร์ยุคใหม่ ระบบที่ถูกออกแบบให้ทำงานแบบกระจายตัว (Distributed Systems) โดยเฉพาะสถาปัตยกรรม Microservices ได้กลายเป็นมาตรฐานหลัก การทำความเข้าใจว่าส่วนประกอบย่อย ๆ เหล่านี้สื่อสารและพึ่งพาอาศัยกันอย่างไร จึงเป็นหัวใจสำคัญของการออกแบบระบบที่มีเสถียรภาพและขยายขนาดได้

แม้ว่าเครื่องมืออย่าง Mermaid.js จะยอดเยี่ยมในการสร้างแผนภาพลำดับเวลา (Sequence Diagram) เพื่อแสดงการโต้ตอบระหว่าง Service ต่าง ๆ แต่ในระดับ Senior Architect เราต้องสามารถพิสูจน์ความถูกต้องของ Data Flow และ State Transition ได้ด้วยโค้ดจริง การใช้ PostgreSQL ที่มีคุณสมบัติขั้นสูง เช่น Recursive CTEs, JSONB และฟังก์ชัน Windowing ทำให้เราสามารถจำลองและตรวจสอบลำดับการทำงาน (Workflow) ของ Microservices ทั้งหมดได้ภายในฐานข้อมูลเดียว ซึ่งเป็นแนวทางที่ทรงพลังในการทำ Documentation และ Validation ทางสถาปัตยกรรม

💡 การใช้ PostgreSQL จำลอง Workflow: จาก Diagram สู่ Data

แทนที่จะมองว่า Sequence Diagram เป็นเพียงภาพวาด เราควรพิจารณาให้มันเป็น ‘ลำดับของสถานะข้อมูล’ (Sequence of Data States) ที่ถูกบันทึกและเปลี่ยนแปลงในฐานข้อมูลหลัก การจำลองกระบวนการที่ซับซ้อน เช่น การสั่งซื้อสินค้า (Order Placement) ซึ่งต้องผ่านหลายขั้นตอน (สร้างคำสั่งซื้อ -> ตรวจสอบสต็อก -> ชำระเงิน -> อัปเดตสถานะ) สามารถทำได้โดยใช้ PostgreSQL เพื่อติดตามทุกการเปลี่ยนสถานะอย่างแม่นยำ

ตัวอย่าง: การจำลอง Order Fulfillment Workflow ด้วย Recursive CTE

เราจะใช้ Common Table Expression (CTE) แบบเรียกซ้ำ (Recursive CTE) ใน PostgreSQL เพื่อจำลองขั้นตอนที่ Service ต่าง ๆ ต้องทำงานตามลำดับเวลา โดยแต่ละ ‘รอบ’ ของการทำซ้ำคือหนึ่งขั้นตอนของการสื่อสาร:

SQL

WITH RECURSIVE order_flow AS (
    -- Anchor Member: เริ่มต้นกระบวนการ (Client calls Order Service)
    SELECT 
        1 AS step, 
        'INITIATE_ORDER' AS event, 
        'Pending'::text AS status, 
        jsonb('{"user_id": 123}') AS payload, 
        0 AS sequence_step
    UNION ALL
    -- Recursive Member: จำลองการเรียกใช้ Service ถัดไป (Payment Service)
    SELECT 
        o.step + 1, 
        'PROCESS_PAYMENT', 
        CASE WHEN o.status = 'Pending' THEN 'Processing' ELSE o.status END, 
        jsonb('{"order_id": 456, "amount": 99.00}'), 
        o.sequence_step + 1
    FROM order_flow o 
    WHERE o.step < 3 -- จำกัดการทำซ้ำเพื่อจำลองขั้นตอนที่ 3 (Confirmation)
)
SELECT * FROM order_flow;

คำอธิบายโค้ด: โค้ดนี้ใช้ Recursive CTE เพื่อสร้างชุดข้อมูลที่แสดงลำดับของเหตุการณ์ (step) และสถานะ (status) ที่เปลี่ยนไปอย่างเป็นระบบ ซึ่งจำลองการไหลของข้อมูลจาก Service หนึ่งไปยังอีก Service หนึ่งได้อย่างชัดเจนกว่าการวาดแผนภาพเพียงอย่างเดียว

🚀 ประโยชน์เชิงสถาปัตยกรรม: Single Source of Truth

  • ความแม่นยำสูงสุด (Accuracy): การใช้ SQL ในการจำลอง Workflow ทำให้เรามั่นใจได้ว่าทุกขั้นตอนที่ระบุในเอกสารนั้นสามารถถูกตรวจสอบและรันซ้ำได้จริง
  • Living Documentation: แทนที่จะเป็นแผนภาพที่ล้าสมัยเมื่อโค้ดเปลี่ยนไป เราสามารถฝัง Logic ของ Flow ไว้ใน Schema หรือ Stored Procedure ซึ่งถือเป็น ‘Single Source of Truth’ ที่อัปเดตพร้อมกับระบบเสมอ
  • การจัดการ State (State Management): PostgreSQL โดยเฉพาะฟีเจอร์ JSONB ช่วยให้เราสามารถเก็บ Payload ข้อมูลที่เปลี่ยนแปลงไปตามขั้นตอนได้อย่างยืดหยุ่น ทำให้เห็นภาพรวมของข้อมูลทั้งหมดตลอดวงจรชีวิตของคำสั่งซื้อ

✅ บทสรุป

การออกแบบระบบ Microservices ที่สมบูรณ์แบบไม่ได้จบลงแค่การวาด Sequence Diagram เท่านั้น แต่ต้องอาศัยความสามารถในการ ‘พิสูจน์’ ลำดับการทำงานเหล่านั้นด้วยเครื่องมือที่ทรงพลังอย่าง PostgreSQL การผสานรวมแนวคิดเชิงสถาปัตยกรรม (Mermaid.js) เข้ากับการจำลองข้อมูลระดับลึก (PostgreSQL CTEs) จะช่วยให้ทีมพัฒนาทุกคนเห็นภาพรวมของการทำงานตั้งแต่ต้นจนจบ ลดช่องว่างของการตีความ และเร่งวงจรการพัฒนาซอฟต์แวร์ได้อย่างมีประสิทธิภาพสูงสุด