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

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:processnode3: ประมวลผลเฉพาะงานอะซิงโครนัสเท่านั้น กำหนดค่า WORKER_MODE=async-task:processสมมติว่ามีสี่โหนด ได้แก่ node1, node2, node3 และ node4 สามารถกำหนดค่าได้ดังนี้ครับ/ค่ะ
node1 และ node2: ประมวลผลคำขอทั่วไปทั้งหมด กำหนดค่า WORKER_MODE=! และให้ Load Balancer กระจายคำขอไปยังสองโหนดนี้โดยอัตโนมัติnode3 และ node4: ประมวลผล Background Task อื่นๆ ทั้งหมด กำหนดค่า WORKER_MODE=*เมื่อพัฒนาปลั๊กอินทางธุรกิจ คุณสามารถแยกบริการที่ใช้ทรัพยากรจำนวนมากได้ตามความต้องการของสถานการณ์ครับ/ค่ะ ซึ่งสามารถทำได้ด้วยวิธีต่อไปนี้:
my-plugin:process สำหรับการกำหนดค่า Environment Variable และจัดทำเอกสารประกอบapp.serving() เพื่อตรวจสอบสภาพแวดล้อม และตัดสินใจว่าโหนดปัจจุบันควรให้บริการทางธุรกิจนั้นๆ โดยอิงจากการควบคุมของ Environment Variable หรือไม่