ความแตกต่างของโหมดคลัสเตอร์และส้อมใน PM2


92

ฉันได้ค้นหาคำถามนี้มากมาย แต่ฉันไม่ได้รับคำอธิบายที่ชัดเจน มีเพียงสิ่งเดียวที่แตกต่างกันที่แอปที่คลัสเตอร์สามารถปรับขนาดและแอปที่แยกออกมาไม่ได้?

ไซต์สาธารณะของ PM2 อธิบายว่าโหมดคลัสเตอร์สามารถทำคุณสมบัติเหล่านี้ได้แต่ไม่มีใครพูดถึงข้อดีของโหมด Fork (อาจจะมีNODE_APP_INSTANCEตัวแปร)

ฉันรู้สึกว่า Cluster อาจเป็นส่วนหนึ่งของ Fork เพราะดูเหมือนว่า Fork จะถูกใช้โดยทั่วไป ดังนั้นฉันเดาว่า Fork หมายถึงเพียงแค่ 'กระบวนการแยก' จากจุดของ PM2 และ Cluster หมายถึง 'กระบวนการแยกที่สามารถปรับขนาดออกได้' แล้วทำไมต้องใช้โหมดส้อม?

คำตอบ:


124

ความแตกต่างหลักระหว่างfork_modeและcluster_modeคือสั่งให้ pm2 ใช้ทั้งchild_process.fork api หรือคลัสเตอร์ api

ภายในหมายความว่าอย่างไร

โหมดส้อม

ใช้forkโหมดนี้เป็นกระบวนการพื้นฐานในการวางไข่ สิ่งนี้อนุญาตให้เปลี่ยนexec_interpreterเพื่อให้คุณสามารถเรียกใช้phpหรือpythonเซิร์ฟเวอร์ด้วย pm2 ใช่exec_interpreter"คำสั่ง" ที่ใช้เริ่มกระบวนการย่อยคือ "คำสั่ง" ตามค่าเริ่มต้น pm2 จะใช้nodeเพื่อpm2 start server.jsทำสิ่งต่างๆเช่น:

require('child_process').spawn('node', ['server.js'])

โหมดนี้มีประโยชน์มากเพราะสามารถใช้งานได้มากมาย ตัวอย่างเช่นคุณสามารถเปิดเซิร์ฟเวอร์หลายเครื่องบนพอร์ตที่กำหนดไว้ล่วงหน้าซึ่งจะถูกโหลดบาลานซ์โดย HAProxy หรือ Nginx

โหมดคลัสเตอร์

clusterจะทำงานกับnodeที่มันexec_interpreterเพราะมันจะเข้าถึง nodejs คลัสเตอร์โมดูล (เช่นisMaster, forkวิธีอื่น ๆ ) สิ่งนี้ยอดเยี่ยมสำหรับการจัดการกระบวนการที่ไม่มีการกำหนดค่าเนื่องจากกระบวนการจะถูกแยกโดยอัตโนมัติในหลาย ๆ อินสแตนซ์ ตัวอย่างเช่นpm2 start -i 4 server.jsจะเปิดใช้งาน 4 อินสแตนซ์server.jsและปล่อยให้โมดูลคลัสเตอร์จัดการกับการทำโหลดบาลานซ์


3
คำถามจากคำตอบของคุณที่นี่: ฉันมีกรณีการใช้งานที่จำเป็นต้องมีเช่นแอป node.js 30 อินสแตนซ์ที่สร้างขึ้นด้วยหมายเลขพอร์ตที่ไม่ซ้ำกันที่กำหนดไว้ล่วงหน้า (: 3000 ถึง: 3030) และให้แต่ละอินสแตนซ์จัดการกับ กลุ่มผู้ใช้เฉพาะที่จะเข้าถึงบนพอร์ตที่กำหนดเท่านั้น ดังนั้นฉันจึงไม่ต้องการให้กระบวนการหลักทำการจัดสรรภาระงาน แต่ให้เริ่มต้น (และทำงานต่อไป) กระบวนการลูกเท่านั้น เป็นไปได้หรือไม่ หรือจะพยายามกระจายภาระไปยังกระบวนการลูกที่เกิดทั้งหมดเท่านั้น?
tamak

3
ฉันจะใช้ pm2 programatic API เพื่อเรียกใช้กระบวนการ 30 รายการใน fork_mode และใช้อย่างอื่นเป็นตัวโหลดบาลานเซอร์ระหว่างพอร์ต 30 คุณยังสามารถใช้pm2 start -i 30 app.jsและปล่อยให้คลัสเตอร์ nodejs ทำงานได้
soyuka

11
หมายเหตุ: ในcluster modeกระบวนการหลักเป็นจุดเดียวของความล้มเหลว
Karl Pokus

42

Node.js เป็นเธรดเดียว

นั่นหมายความว่า CPU Quad-core ของ Intel มีเพียง 1 คอร์เท่านั้นที่สามารถรันแอปพลิเคชันโหนดได้

มันเรียกว่า: fork_mode.

เราใช้มันสำหรับdev ท้องถิ่น

pm2 start server.js -i 0 ช่วยให้คุณรันเธรด 1 โหนดบนแต่ละคอร์ของ CPU ของคุณ

และปรับสมดุลการโหลดอัตโนมัติสำหรับคำขอที่มาแบบไร้สัญชาติ

ในพอร์ตเดียวกัน

เราเรียกว่า: cluster_mode.

ซึ่งจะใช้เพื่อประโยชน์ของผลการดำเนินงานเกี่ยวกับการผลิต

คุณสามารถเลือกที่จะทำสิ่งนี้กับนักพัฒนาท้องถิ่นหากคุณต้องการทดสอบพีซีของคุณอย่างเครียด :)


2
thaks มันเคลียร์หลายสิ่งในใจของฉันเกี่ยวกับ nodejs
Rishabh Agrawal

1
คำอธิบายดีมาก !!
Piqué

1
Node.js ไม่ใช่เธรดเดียวมี (ปัจจุบัน) เธรดผู้ใช้หนึ่งเธรด แต่แน่นอนว่าได้รับการสนับสนุนโดย libuv threadpool
Benjamin Gruenbaum

1
@BenjaminGruenbaum เห็นด้วยกับคุณ คำแถลงของฉันควรเข้าใจในสมมติฐานที่ว่าฉันไม่ได้พูดถึงลึกเกินไปถึงระดับ
libuv

16

เอกสารและแหล่งที่มาทำให้เข้าใจผิดได้ที่นี่

เมื่ออ่านสิ่งนี้ในแหล่งที่มาความแตกต่างเพียงอย่างเดียวคือพวกเขาใช้โหนดclusterหรือchild_processAPI เนื่องจากclusterใช้อย่างหลังคุณก็ทำเช่นเดียวกัน มีเพียงมากขึ้นที่กำหนดเองผ่านรอบที่เกิดขึ้นอินน์stdio fork_modeนอกจากนี้ยังclusterสามารถสื่อสารผ่านสตริงเท่านั้นไม่ใช่วัตถุ

fork_modeโดยเริ่มต้นที่คุณกำลังใช้ ถ้าคุณผ่านที่-i [number]ตัวเลือกที่คุณกำลังจะเข้ามาcluster_modeซึ่งคุณมักมีจุดมุ่งหมายเพื่อ w pm2/

นอกจากนี้ตัวอย่างเช่นอาจไม่สามารถฟังบนพอร์ตเดียวกันเนื่องจากfork_mode สามารถ. ด้วยวิธีนี้คุณยังสามารถจัดโครงสร้างแอพให้ทำงานบนพอร์ตเดียวกันโดยอัตโนมัติโหลดบาลานซ์ คุณต้องสร้างแอปโดยไม่มีสถานะเช่นเซสชัน dbsEADDRINUSEcluster_mode


1
ฉันยังคงสับสน clusterโมดูลในตัวใช้child_processภายใน? และคำแนะนำของคุณคือถ้าฉันต้องการความยืดหยุ่นstdioฉันต้องใช้โหมดส้อม?
Jinyoung Kim

THe stdioสิ่งที่เป็นสิ่งที่ของpm2การดำเนินงานของ ไม่ต้องกังวลเรื่องนี้ คุณต้องการใช้cluster_modeในการผลิตเนื่องจากอินสแตนซ์ของคุณแข็งขึ้นเนื่องจาก-i [number]อินสแตนซ์กำลังทำงานอยู่เบื้องหลัง ใช้fork_modeหากไม่จำเป็นต้องทำการชุบแข็งหรือคุณต้องการบันทึกและสิ่งของที่ดีกว่า
eljefedelrodeodeljefe

1
เห็นได้ชัดว่าcluster_modeใช้ทรัพยากรในระบบของคุณมากขึ้นเนื่องจากคุณกำลังเรียกใช้-i [number]กระบวนการ
eljefedelrodeodeljefe

แม้ว่าฉันจะชื่นชมคำตอบของคุณอย่างอบอุ่น แต่ตอนนี้ฉันก็ยังไม่เข้าใจ ส่วนใหญ่ของคำอธิบายของคุณเป็นชนิดของสิ่งที่เป็นธรรมชาติ (เช่น CLI การใช้งานของcluster_modeโหลดสมดุลของcluster_mode, cluster_modeทรัพยากรการใช้งานมากขึ้น .. ) นั่นเป็นเหตุผลว่าทำไมฉันถึงไม่โหวต คุณช่วยอธิบายกรณีการใช้งานง่ายๆทั้งสองแบบได้ไหม แต่ละกรณีจะต้องมีเหตุผลว่าทำไมจึงใช้โหมดนี้
Jinyoung Kim

@eljefedelrodeodeljefe คุณสามารถอธิบายเพิ่มเติมเกี่ยวกับ "คุณต้องสร้างแอปโดยไม่มีสถานะเช่นเซสชัน dbs" ได้หรือไม่? เหตุใดแอปจึงควรไม่มีสถานะ
STEN
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.