n8n Thai
by n8n Thai

5 Design Patterns สำหรับ n8n Workflow ที่ดี

เรียนรู้ 5 Design Patterns ที่ผู้ใช้ n8n ขั้นสูงนำมาใช้ สร้าง Workflow ที่อ่านง่าย บำรุงรักษาง่าย และขยายได้โดยไม่พัง

5 Design Patterns สำหรับ n8n Workflow ที่ดี

Workflow สองอันที่ทำงานได้ผลลัพธ์เดียวกันอาจมีคุณภาพต่างกันอย่างมหาศาล อันหนึ่งอ่านเข้าใจใน 5 นาที แก้ได้ง่าย ขยายได้โดยไม่กลัวพัง อีกอันใช้เวลาครึ่งวันถึงจะเข้าใจ และทุกครั้งที่แก้ก็มีโอกาสพัง Design Patterns คือสิ่งที่ทำให้ Workflow ดีกว่า ไม่ใช่แค่ทำงานได้

Pattern 1: Orchestrator-Worker

ปัญหา: Workflow หลักยาวมาก มีทั้ง Logic การรับข้อมูล, Logic การประมวลผล, และ Logic การส่งผล รวมกันใน Workflow เดียว

วิธีแก้: แยก Workflow ออกเป็นสองระดับ — Orchestrator จัดการ Flow โดยรวม และ Worker ทำงานจริง

Orchestrator มีหน้าที่:

  • รับ Trigger
  • ดึงข้อมูลที่ต้องประมวลผล
  • แบ่ง Items และส่งต่อให้ Worker
  • รวบรวมผลลัพธ์
  • รายงาน/แจ้งเตือน

Worker มีหน้าที่:

  • รับ Item เดียว
  • ประมวลผลจนเสร็จ
  • ส่งผลกลับ

ตัวอย่าง:

[Orchestrator] Daily Order Sync
  → Schedule Trigger (ทุกคืน 23:00)
  → Get All Pending Orders (ดึง Order ที่ยังไม่ sync)
  → Loop Over Items
      → Execute Sub-Workflow: [Worker] Process Single Order
  → Summarize Results
  → Send Report to Slack

[Worker] Process Single Order
  → When Executed by Another Workflow
  → Validate Order Data
  → Update Database
  → Send Customer Confirmation
  → Update Inventory
  → Return { success, orderId }

ข้อดี: Worker ทดสอบได้อิสระ, Orchestrator อ่านได้ใน 1 นาที, แก้ Worker Logic โดยไม่กระทบ Orchestrator

Pattern 2: Dead Letter Queue

ปัญหา: เมื่อ Process Item ล้มเหลว ข้อมูลนั้นหายไปเลย ต้องหาและรันใหม่ด้วยตนเอง

วิธีแก้: บันทึก Item ที่ล้มเหลวลงใน “คิว” (Google Sheets, Database หรือ Queue Service) แทนการทิ้ง แล้วมี Workflow แยกที่ retry ข้อมูลเหล่านี้

โครงสร้าง:

[Main Workflow]
  → HTTP Request Node (เรียก API)
      ├── Success → ประมวลผลปกติ
      └── Error → Google Sheets "Failed Items" (บันทึก: item data, error, retry count, timestamp)

[Retry Workflow] (รันทุก 30 นาที)
  → Google Sheets (ดึง items ที่ failed และ retry_count < 3)
  → Loop
      → Execute Sub-Workflow: Process Item
          ├── Success → อัปเดต status เป็น "completed"
          └── Error → เพิ่ม retry_count, ถ้า >= 3 → เปลี่ยน status เป็น "manual_review"

Columns ใน Failed Items Sheet:

  • item_data — JSON ของ item ที่ล้มเหลว
  • error_message — ข้อความ error
  • retry_count — จำนวนครั้งที่ลองซ้ำ
  • statusfailed, retrying, completed, manual_review
  • first_failed_at — วันเวลาที่ล้มเหลวครั้งแรก
  • last_retry_at — วันเวลาที่ลองซ้ำล่าสุด

Pattern 3: Idempotent Processing

ปัญหา: Workflow รันซ้ำสองครั้ง (เพราะ Trigger ซ้ำหรือ Retry) ทำให้ข้อมูลซ้ำ เช่น ส่งอีเมลสองฉบับ หรือ insert record สองครั้ง

วิธีแก้: ทำให้ทุก operation เป็น “Idempotent” — รันกี่ครั้งก็ได้ผลเดียวกัน

เทคนิค:

  1. ตรวจสอบก่อนทำ (Check-then-Act)
ได้รับ Order ID 12345
  → ตรวจสอบใน DB ว่า ID 12345 เคย process แล้วหรือยัง
  → IF ยังไม่เคย → Process และบันทึกว่าเสร็จแล้ว
  → IF เคยแล้ว → Skip (ส่ง log ว่า duplicate)
  1. Upsert แทน Insert แทนที่จะ INSERT (ซึ่งจะ error ถ้า record ซ้ำ) ให้ใช้ Upsert (INSERT … ON CONFLICT UPDATE) ที่อัปเดตถ้ามีอยู่แล้ว หรือสร้างใหม่ถ้าไม่มี

  2. Idempotency Key เก็บ idempotency_key ใน Header ของ HTTP Request และ verify ที่ปลายทางว่า Key นี้ถูกประมวลผลไปแล้วหรือยัง

Pattern 4: Event-Driven Pipeline

ปัญหา: Workflow ทำหลายอย่างในครั้งเดียว ทั้ง process ข้อมูล, ส่งอีเมล, อัปเดต inventory, โพสต์ Slack ทุกอย่างใน Workflow เดียว ทำให้แก้ยากและ performance ช้า

วิธีแก้: แยก Workflow ออกตาม “Event” แล้วใช้ Webhook เป็นตัวเชื่อม

[Workflow: Order Created]
  → Webhook Trigger (รับ order จาก website)
  → Validate & Save to DB
  → Trigger Events:
      → Webhook POST → [Workflow: Send Confirmation Email]
      → Webhook POST → [Workflow: Update Inventory]
      → Webhook POST → [Workflow: Notify Fulfillment Team]

แต่ละ Downstream Workflow ทำงานอิสระ ถ้า Email Workflow ล้มเหลว ไม่กระทบ Inventory Workflow และสามารถ Retry แต่ละตัวอิสระ

ข้อดี: Decoupled, ง่ายต่อการเพิ่ม/ลด handler, แต่ละ Workflow ทดสอบแยกได้

Pattern 5: Configuration-Driven Workflow

ปัญหา: มี Workflow หลายตัวที่ทำงานเหมือนกัน แต่ต่างกันที่พารามิเตอร์ เช่น ส่งรายงานหาทีมต่างๆ ที่ต่างกันแค่ email recipient และ report type

วิธีแก้: สร้าง Workflow เดียวที่อ่าน configuration จากภายนอก (Google Sheets หรือ Database) แล้วทำงานตาม config

ตัวอย่าง: ระบบส่งรายงาน

Config Sheet มี columns:

report_nameschedulerecipient_emailsheet_idenabled
Sales Daily0 8 * * *sales@co.com1abc…TRUE
Inventory Weekly0 9 * * 1ops@co.com2def…TRUE
Marketing Monthly0 10 1 * *mkt@co.com3ghi…FALSE
[Generic Report Workflow]
  → Schedule Trigger (ทุกชั่วโมง)
  → Google Sheets (ดึง config ทั้งหมดที่ enabled = TRUE)
  → Filter (เฉพาะรายการที่ถึงเวลา schedule)
  → Loop
      → Google Sheets (ดึงข้อมูลตาม sheet_id)
      → Email (ส่งหา recipient_email)

ข้อดี: เพิ่ม/แก้/ปิด report ได้โดยแก้แค่ Config Sheet ไม่ต้องแตะ Workflow

เลือก Pattern อย่างไร

ไม่จำเป็นต้องใช้ทุก Pattern ในทุก Workflow การเลือก Pattern ควรขึ้นอยู่กับปัญหาที่มีจริงๆ:

  • Workflow ยาวเกินไปและมีหน้าที่หลายอย่าง → Orchestrator-Worker
  • กลัว Error แล้วข้อมูลหาย → Dead Letter Queue
  • Trigger อาจซ้ำและทำให้ข้อมูลซ้ำ → Idempotent Processing
  • หลาย Workflow ต้องตอบสนองต่อ Event เดียวกัน → Event-Driven Pipeline
  • มี Workflow หลายตัวที่ซ้ำกันต่างแค่ค่าพารามิเตอร์ → Configuration-Driven

Pattern ทั้งห้านี้ไม่ใช่กฎตายตัว แต่คือแนวคิดที่ผ่านการพิสูจน์ว่าได้ผลในโลกจริง การเรียนรู้ Pattern เหล่านี้ช่วยให้คุณสร้าง Workflow ที่ไม่ใช่แค่ทำงานได้วันนี้ แต่ยังดูแลได้ดีในอีก 1-2 ปีข้างหน้า

อยากเรียน n8n แบบเป็นระบบ ตั้งแต่เริ่มต้นจนสร้าง Workflow ใช้งานจริงได้ ลองดู คอร์สสอน n8n ที่ aiunlock.co

Related posts