logologo
เริ่มต้น
คู่มือ
การพัฒนา
ปลั๊กอิน
API
English
简体中文
日本語
한국어
Deutsch
Français
Español
Português
Русский
Italiano
Türkçe
Українська
Tiếng Việt
Bahasa Indonesia
ไทย
Polski
Nederlands
Čeština
العربية
עברית
हिन्दी
Svenska
เริ่มต้น
คู่มือ
การพัฒนา
ปลั๊กอิน
API
logologo
โหมดคลัสเตอร์
ภาพรวม
การเตรียมการ
การปรับใช้บน Kubernetes
กระบวนการดำเนินงาน
การแบ่งบริการ
ข้อมูลอ้างอิงสำหรับการพัฒนา
Previous Pageกระบวนการดำเนินงาน
Next Pageข้อมูลอ้างอิงสำหรับการพัฒนา
TIP

เอกสารนี้แปลโดย AI หากมีข้อมูลที่ไม่ถูกต้อง โปรดดูเวอร์ชันภาษาอังกฤษ

#การแยกบริการ v1.9.0+

#บทนำ

โดยปกติแล้ว บริการทั้งหมดของแอปพลิเคชัน NocoBase จะทำงานอยู่บน Node.js instance เดียวกันครับ/ค่ะ เมื่อฟังก์ชันการทำงานภายในแอปพลิเคชันมีความซับซ้อนมากขึ้นตามการเติบโตของธุรกิจ บริการบางอย่างที่ใช้เวลานานอาจส่งผลกระทบต่อประสิทธิภาพโดยรวมได้

เพื่อปรับปรุงประสิทธิภาพของแอปพลิเคชัน NocoBase จึงรองรับการแยกบริการของแอปพลิเคชันให้ทำงานบนโหนดที่แตกต่างกันในโหมดคลัสเตอร์ครับ/ค่ะ วิธีนี้ช่วยป้องกันไม่ให้ปัญหาด้านประสิทธิภาพของบริการใดบริการหนึ่งส่งผลกระทบต่อแอปพลิเคชันทั้งหมด จนไม่สามารถตอบสนองคำขอของผู้ใช้ได้อย่างปกติ

นอกจากนี้ยังช่วยให้เราสามารถขยายขนาด (horizontal scale) บริการบางอย่างได้อย่างตรงจุด ซึ่งจะช่วยเพิ่มการใช้ทรัพยากรของคลัสเตอร์ให้มีประสิทธิภาพมากยิ่งขึ้นครับ/ค่ะ

เมื่อทำการ Deploy NocoBase ในรูปแบบคลัสเตอร์ เราสามารถแยกบริการต่างๆ ไปยังโหนดที่แตกต่างกันได้ครับ/ค่ะ แผนภาพด้านล่างนี้แสดงโครงสร้างการแยกบริการ:

20250803214857

#บริการใดบ้างที่สามารถแยกได้

#เวิร์กโฟลว์แบบอะซิงโครนัส

Service KEY: workflow:process

เวิร์กโฟลว์ในโหมดอะซิงโครนัส (asynchronous) เมื่อถูกทริกเกอร์แล้วจะเข้าคิวเพื่อรอการประมวลผลครับ/ค่ะ เวิร์กโฟลว์ประเภทนี้ถือเป็น Background Task ที่ผู้ใช้มักไม่จำเป็นต้องรอผลลัพธ์กลับมา โดยเฉพาะอย่างยิ่งสำหรับกระบวนการที่ซับซ้อนและใช้เวลานาน ซึ่งมีการทริกเกอร์ในปริมาณมาก เราขอแนะนำให้แยกเวิร์กโฟลว์เหล่านี้ไปทำงานบนโหนดที่แยกต่างหากครับ/ค่ะ

#งานอะซิงโครนัสระดับผู้ใช้อื่นๆ

Service KEY: async-task:process

ซึ่งรวมถึงงานที่เกิดจากการดำเนินการของผู้ใช้ เช่น การนำเข้า (import) และส่งออก (export) แบบอะซิงโครนัสครับ/ค่ะ ในกรณีที่มีข้อมูลปริมาณมากหรือมีการทำงานพร้อมกันสูง เราขอแนะนำให้แยกงานเหล่านี้ไปทำงานบนโหนดที่แยกต่างหากครับ/ค่ะ

#วิธีการแยกบริการ

การแยกบริการต่างๆ ไปยังโหนดที่แตกต่างกันสามารถทำได้โดยการกำหนดค่า Environment Variable ที่ชื่อว่า WORKER_MODE ครับ/ค่ะ โดย Environment Variable นี้สามารถกำหนดค่าได้ตามกฎต่อไปนี้:

  • WORKER_MODE=<ว่างเปล่า>: หากไม่ได้กำหนดค่า หรือกำหนดค่าเป็นค่าว่างเปล่า โหมดการทำงานจะเหมือนกับโหมด Single-instance ในปัจจุบัน คือรับคำขอทั้งหมดและประมวลผลงานทั้งหมดครับ/ค่ะ ซึ่งเข้ากันได้กับแอปพลิเคชันที่ไม่ได้กำหนดค่ามาก่อน
  • WORKER_MODE=!: โหมดการทำงานจะประมวลผลเฉพาะคำขอเท่านั้น และจะไม่ประมวลผลงานใดๆ ครับ/ค่ะ
  • WORKER_MODE=workflow:process,async-task:process: กำหนดค่าด้วย Service Identifier หนึ่งรายการหรือมากกว่า (คั่นด้วยเครื่องหมายจุลภาคภาษาอังกฤษ) โหมดการทำงานจะประมวลผลเฉพาะงานที่มี Identifier เหล่านี้เท่านั้น และจะไม่ประมวลผลคำขอครับ/ค่ะ
  • WORKER_MODE=*: โหมดการทำงานจะประมวลผล Background Task ทั้งหมด โดยไม่คำนึงถึงโมดูล แต่จะไม่ประมวลผลคำขอครับ/ค่ะ
  • WORKER_MODE=!,workflow:process: โหมดการทำงานจะประมวลผลคำขอ และในขณะเดียวกันก็ประมวลผลเฉพาะงานที่มี Identifier ที่ระบุเท่านั้นครับ/ค่ะ
  • WORKER_MODE=-: โหมดการทำงานจะไม่ประมวลผลคำขอหรืองานใดๆ เลยครับ/ค่ะ (โหมดนี้จำเป็นสำหรับ Worker Process)

ตัวอย่างเช่น ในสภาพแวดล้อม K8S (Kubernetes) โหนดที่มีฟังก์ชันการแยกบริการที่เหมือนกันสามารถใช้การกำหนดค่า Environment Variable เดียวกันได้ครับ/ค่ะ ซึ่งจะช่วยให้การขยายขนาด (horizontal scale) บริการบางประเภททำได้ง่ายขึ้น

#ตัวอย่างการกำหนดค่า

#การประมวลผลแยกกันในหลายโหนด

สมมติว่ามีสามโหนด ได้แก่ node1, node2 และ node3 สามารถกำหนดค่าได้ดังนี้ครับ/ค่ะ

  • node1: ประมวลผลเฉพาะคำขอ UI ของผู้ใช้เท่านั้น กำหนดค่า WORKER_MODE=!
  • node2: ประมวลผลเฉพาะงานเวิร์กโฟลว์เท่านั้น กำหนดค่า WORKER_MODE=workflow:process
  • node3: ประมวลผลเฉพาะงานอะซิงโครนัสเท่านั้น กำหนดค่า WORKER_MODE=async-task:process

#การประมวลผลแบบผสมในหลายโหนด

สมมติว่ามีสี่โหนด ได้แก่ node1, node2, node3 และ node4 สามารถกำหนดค่าได้ดังนี้ครับ/ค่ะ

  • node1 และ node2: ประมวลผลคำขอทั่วไปทั้งหมด กำหนดค่า WORKER_MODE=! และให้ Load Balancer กระจายคำขอไปยังสองโหนดนี้โดยอัตโนมัติ
  • node3 และ node4: ประมวลผล Background Task อื่นๆ ทั้งหมด กำหนดค่า WORKER_MODE=*

#ข้อมูลอ้างอิงสำหรับนักพัฒนา

เมื่อพัฒนาปลั๊กอินทางธุรกิจ คุณสามารถแยกบริการที่ใช้ทรัพยากรจำนวนมากได้ตามความต้องการของสถานการณ์ครับ/ค่ะ ซึ่งสามารถทำได้ด้วยวิธีต่อไปนี้:

  1. กำหนด Service Identifier ใหม่ เช่น my-plugin:process สำหรับการกำหนดค่า Environment Variable และจัดทำเอกสารประกอบ
  2. ในส่วนของ Business Logic ฝั่ง Server-side ของปลั๊กอิน ให้ใช้ Interface app.serving() เพื่อตรวจสอบสภาพแวดล้อม และตัดสินใจว่าโหนดปัจจุบันควรให้บริการทางธุรกิจนั้นๆ โดยอิงจากการควบคุมของ Environment Variable หรือไม่
const MY_PLUGIN_SERVICE_KEY = 'my-plugin:process';
// ในโค้ดฝั่ง Server-side ของปลั๊กอิน
if (this.app.serving(MY_PLUGIN_SERVICE_KEY)) {
  // ประมวลผล Business Logic สำหรับบริการนี้
} else {
  // ไม่ประมวลผล Business Logic สำหรับบริการนี้
}