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— ข้อความ errorretry_count— จำนวนครั้งที่ลองซ้ำstatus—failed,retrying,completed,manual_reviewfirst_failed_at— วันเวลาที่ล้มเหลวครั้งแรกlast_retry_at— วันเวลาที่ลองซ้ำล่าสุด
Pattern 3: Idempotent Processing
ปัญหา: Workflow รันซ้ำสองครั้ง (เพราะ Trigger ซ้ำหรือ Retry) ทำให้ข้อมูลซ้ำ เช่น ส่งอีเมลสองฉบับ หรือ insert record สองครั้ง
วิธีแก้: ทำให้ทุก operation เป็น “Idempotent” — รันกี่ครั้งก็ได้ผลเดียวกัน
เทคนิค:
- ตรวจสอบก่อนทำ (Check-then-Act)
ได้รับ Order ID 12345
→ ตรวจสอบใน DB ว่า ID 12345 เคย process แล้วหรือยัง
→ IF ยังไม่เคย → Process และบันทึกว่าเสร็จแล้ว
→ IF เคยแล้ว → Skip (ส่ง log ว่า duplicate)
-
Upsert แทน Insert แทนที่จะ INSERT (ซึ่งจะ error ถ้า record ซ้ำ) ให้ใช้ Upsert (INSERT … ON CONFLICT UPDATE) ที่อัปเดตถ้ามีอยู่แล้ว หรือสร้างใหม่ถ้าไม่มี
-
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_name | schedule | recipient_email | sheet_id | enabled |
|---|---|---|---|---|
| Sales Daily | 0 8 * * * | sales@co.com | 1abc… | TRUE |
| Inventory Weekly | 0 9 * * 1 | ops@co.com | 2def… | TRUE |
| Marketing Monthly | 0 10 1 * * | mkt@co.com | 3ghi… | 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
n8n Advanced: 10 เทคนิคขั้นสูงสำหรับมืออาชีพ
รวม 10 เทคนิค n8n ขั้นสูงที่มืออาชีพใช้จริง ตั้งแต่ Error Handling, Sub-Workflow, Code Node ไปจนถึง API Pagination
Code Node ใน n8n: เขียน JavaScript เสริมพลัง Workflow
คู่มือใช้งาน Code Node ใน n8n เขียน JavaScript แปลงข้อมูล คำนวณ Logic ซับซ้อน และเรียก async function ที่ Node มาตรฐานทำไม่ได้
n8n Expressions: สูตรและตัวแปรที่ใช้บ่อย
รวม n8n Expressions ที่ใช้บ่อยที่สุด ทั้ง $json, $item, $now, $workflow พร้อมตัวอย่างจริงที่คัดลอกไปใช้ได้เลย