Node.js บนเครื่องมัลติคอร์


606

Node.jsดูน่าสนใจแต่ฉันต้องพลาดบางอย่าง - Node.js ไม่ได้รับการปรับแต่งเพียงเพื่อให้ทำงานในกระบวนการและเธรดเดียวใช่หรือไม่

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

Node.js พอดีกับภาพนี้ได้อย่างไร เป็นความคิดที่จะแจกจ่ายหลาย ๆ ครั้งหรืออะไร


4
ดูเหมือนว่า Ryah จะเริ่มจริงจังกับการรวมการสนับสนุนมัลติคอร์ในตัวในโหนด: github.com/joyent/node/commit/…
broofa

2
ตัวจัดการกระบวนการ PM2 ใช้โมดูลคลัสเตอร์ภายในเพื่อกระจายแอป NodeJS ของคุณไปยังแกนทั้งหมดที่มีอยู่: github.com/Unitech/pm2
Unitech

@broofa, นั่นไม่ใช่เธรดจริงและกระบวนการย่อยไม่มีหน่วยความจำที่แชร์ โปรดดูเพิ่มเติมที่ Nodejs เทียบเท่ากับตัวแปรการทำเกลียวและการระเหยแบบคงที่ที่แท้จริงของ Java คืออะไร .
Pacerier

คำตอบ:


697

[ โพสต์นี้เป็นข้อมูลล่าสุด ณ วันที่ 2012-09-02 (ใหม่กว่าด้านบน) ]

Node.js ปรับขนาดบนเครื่องมัลติคอร์อย่างแน่นอน

ใช่ Node.js เป็นหนึ่งเธรดต่อกระบวนการ นี่คือการตัดสินใจออกแบบโดยเจตนาและไม่จำเป็นต้องจัดการกับความหมายการล็อก หากคุณไม่เห็นด้วยกับสิ่งนี้คุณอาจยังไม่เข้าใจว่าการดีบักโค้ดแบบมัลติเธรดนั้นเป็นเรื่องยากเพียงใด สำหรับคำอธิบายลึกของรูปแบบกระบวนการ Node.js และทำไมมันทำงานด้วยวิธีนี้ (และทำไมมันจะไม่สนับสนุนหลายหัวข้อ) อ่านโพสต์อื่น ๆ ของฉัน

ดังนั้นฉันจะใช้ประโยชน์จากกล่อง 16 core ของฉันได้อย่างไร

สองทาง:

  • สำหรับงานที่ต้องคำนวณหนัก ๆ ขนาดใหญ่เช่นการเข้ารหัสภาพ Node.js สามารถเปิดไฟกระบวนการเด็กหรือส่งข้อความไปยังกระบวนการผู้ปฏิบัติงานเพิ่มเติม ในการออกแบบนี้คุณจะต้องมีหนึ่งเธรดที่จัดการโฟลว์ของเหตุการณ์และกระบวนการ N ที่ทำงานหนักในการคำนวณและเคี้ยวซีพียูอีก 15 ตัว
  • สำหรับการปรับปริมาณงานบนเว็บเซอร์วิซคุณควรรันเซิร์ฟเวอร์ Node.js หลายเครื่องในหนึ่งกล่องหนึ่งตัวต่อคอร์และแยกการรับส่งข้อมูลระหว่างคำขอ สิ่งนี้จะให้ CPU-affinity ที่ยอดเยี่ยมและจะขยายสเกลความเร็วเกือบเป็นเส้นตรงด้วยการนับคอร์

ปรับขนาดปริมาณงานบนเว็บเซอร์

ตั้งแต่ v6.0.X Node.js ได้รวมโมดูลคลัสเตอร์โดยตรงจากกล่องซึ่งทำให้ง่ายต่อการตั้งค่าตัวทำงานของโหนดหลายตัวที่สามารถฟังในพอร์ตเดียว หมายเหตุว่านี้ไม่ได้เช่นเดียวกับพี่ learnboost "คลัสเตอร์" โมดูลพร้อมใช้งานผ่านNPM

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  http.Server(function(req, res) { ... }).listen(8000);
}

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

หากคุณมีภาระมากพอที่จะใส่ใจกับหลายคอร์แล้วคุณจะต้องทำสิ่งต่าง ๆ เพิ่มเติม:

  1. เรียกใช้บริการ Node.js ของคุณหลังเว็บพร็อกซีเช่นNginxหรือApache - สิ่งที่สามารถทำการควบคุมปริมาณการเชื่อมต่อ (ยกเว้นกรณีที่คุณต้องการให้เงื่อนไขโอเวอร์โหลดนำกล่องลงมาอย่างสมบูรณ์) เขียน URL ใหม่ให้บริการเนื้อหาคงที่และพร็อกซีย่อยบริการอื่น ๆ

  2. รีไซเคิลกระบวนการทำงานของคุณเป็นระยะ สำหรับกระบวนการที่ใช้เวลานานแม้กระทั่งหน่วยความจำขนาดเล็กก็จะรั่วไหลในที่สุด

  3. ตั้งค่าการรวบรวม / การตรวจสอบบันทึก


ป.ล. : มีการพูดคุยกันระหว่างแอรอนกับคริสโตเฟอร์ในความคิดเห็นของโพสต์อื่น ความคิดเห็นบางประการเกี่ยวกับเรื่องนี้:

  • โมเดลซ็อกเก็ตที่ใช้ร่วมกันนั้นสะดวกมากสำหรับการอนุญาตให้กระบวนการหลาย ๆ ฟังบนพอร์ตเดียวและแข่งขันเพื่อยอมรับการเชื่อมต่อใหม่ ตามแนวคิดคุณอาจนึกถึง Apache แบบ preforked ทำสิ่งนี้กับข้อแม้ที่สำคัญว่าแต่ละขั้นตอนจะยอมรับการเชื่อมต่อเพียงครั้งเดียวและจากนั้นก็ตาย การสูญเสียประสิทธิภาพสำหรับ Apache อยู่ในค่าใช้จ่ายของการฟอร์กกระบวนการใหม่และไม่มีอะไรเกี่ยวข้องกับการดำเนินการซ็อกเก็ต
  • สำหรับ Node.js การมีพนักงาน N คนแข่งขันกันในซ็อกเก็ตเดียวเป็นโซลูชั่นที่เหมาะสมอย่างยิ่ง อีกทางเลือกหนึ่งคือการตั้งค่า Front-end แบบ on-box เช่น Nginx และมีทราฟฟิกพร็อกซีนั้นไปยังพนักงานแต่ละคน โซลูชันทั้งสองมีคุณลักษณะด้านประสิทธิภาพที่คล้ายคลึงกันมาก และเนื่องจากอย่างที่ฉันได้กล่าวไว้ข้างต้นคุณอาจต้องการใช้ Nginx (หรือทางเลือก) ที่บังหน้าบริการโหนดของคุณอย่างไรก็ตามตัวเลือกที่นี่อยู่ระหว่าง:

พอร์ตที่ใช้ร่วมกัน: nginx (port 80) --> Node_workers x N (sharing port 3000 w/ Cluster)

VS

พอร์ตส่วนบุคคล: nginx (port 80) --> {Node_worker (port 3000), Node_worker (port 3001), Node_worker (port 3002), Node_worker (port 3003) ...}

มีประโยชน์บางอย่างในการตั้งค่าพอร์ตแต่ละพอร์ต (อาจมีข้อต่อระหว่างกระบวนการน้อยกว่ามีการตัดสินใจในการทำโหลดบาลานซ์ที่ซับซ้อนมากขึ้นเป็นต้น) แต่ก็เป็นงานที่ต้องตั้งค่ามากขึ้นและโมดูลคลัสเตอร์ในตัวนั้นต่ำ - ทางเลือกที่ซับซ้อนที่เหมาะกับคนส่วนใหญ่


1
คุณสามารถให้คำแนะนำใด ๆ สำหรับการรันบริการตาม nodejs ที่แตกต่างกันในช่องเดียวได้หรือไม่? เช่นฉันมีเซิร์ฟเวอร์ 1 เครื่องและต้องการรัน myservice1.js บน CpuCore1 และ myservice2.js บน CpuCore2 ฉันสามารถใช้คลัสเตอร์สำหรับสิ่งนี้ได้หรือไม่ หรือมีประโยชน์สำหรับการสร้างบริการที่โคลนเท่านั้น?
UpTheCreek

6
คุณควรโพสต์คำถามนั้น! (และฉันจะคัดลอกความคิดเห็นนี้เป็นคำตอบแรกของคุณ) สิ่งที่คุณต้องการทำจริงๆง่ายจริงๆ คุณไม่ต้องการ "คลัสเตอร์" จริงๆคุณเพียงแค่เรียกใช้บริการโหนดที่แตกต่างกันสองรายการ สองสคริปต์สองกระบวนการสองพอร์ต ตัวอย่างเช่นคุณอาจมี serviceA ฟังใน 3000 และ serviceB ฟังบน 3001 แต่ละบริการเหล่านั้นอาจใช้ "cluster" เพื่อให้มี 1+ คนทำงานและรีไซเคิลเป็นระยะ ๆ ฯลฯ จากนั้นคุณสามารถกำหนดค่า Nginx เพื่อฟังบนพอร์ต 80 และส่งต่อไปยัง บริการที่ถูกต้องขึ้นอยู่กับส่วนหัว "โฮสต์" ที่เข้ามาและ / หรือเส้นทาง URL
Dave Dopson

1
ขอบคุณ ฉันโพสต์คำถามที่เกี่ยวข้องแล้ว - คุณอธิบายสิ่งที่ฉันมีอยู่ในใจแล้ว แต่ฉันไม่แน่ใจเกี่ยวกับวิธีกำหนดเป้าหมายคอร์ CPU (เมื่อใช้สิ่งที่ต้องการตลอดไป)
UpTheCreek

คำตอบที่ดี วิธีที่ดีที่สุดที่จะให้กระบวนการโหนดสองกระบวนการสื่อสารกันบนเครื่องเดียวกันคืออะไร? มีโปรโตคอลที่เร็วกว่า TCP เมื่ออยู่ในเครื่องเดียวกันหรือไม่
winduptoy

1
@Serob_b - ใช่แล้ว การเรียกใช้แอป Node.js ในหลาย ๆ เครื่องเป็นเรื่องธรรมดามาก ไม่จำเป็นต้องใช้ห้องสมุด คุณเพียงแค่เรียกใช้รหัสของคุณบนเครื่องหลายเครื่องและกระจายโหลดระหว่างพวกเขา สร้างซอฟต์แวร์ของคุณเพื่อปรับขนาด (กล่าวคือเก็บสถานะไว้ในบริการข้อมูลภายนอกบางประเภทแทนที่จะเก็บสถานะไว้ในหน่วยความจำ) - นั่นคืองานของคุณ
Dave Dopson

45

วิธีหนึ่งคือการรันหลายอินสแตนซ์ของ node.js บนเซิร์ฟเวอร์จากนั้นวาง load balancer (โดยเฉพาะอย่างยิ่ง non-blocking หนึ่งอย่าง nginx) ที่อยู่ด้านหน้า


36
node.js เร็วพอ ๆ กับ nginx คุณสามารถใส่ load balancer ของ node.js ไว้หน้าเซิร์ฟเวอร์ node.js ของคุณหากคุณต้องการเช่นกัน :)
mikeal

26
ไรอันบอกว่าอย่าทำอย่างนี้จนกว่าโหนดจะเสถียรกว่า วิธีที่ดีที่สุดคือการเรียกใช้ nginx หน้าโหนด
resopollution

2
สำหรับ nginx ต่อหน้าโหนดมันจะไม่แก้ปัญหาบางอย่างเช่นถ้าคุณมีคิวในหน่วยความจำ 2 อินสแตนซ์ของโหนดจะไม่สามารถเข้าถึงคิวของกันและกันได้
resopollution

5
และ nginx ไม่รองรับ HTTP 1.1 อย่างสมบูรณ์ดังนั้นสิ่งต่างๆเช่น WebSockets จึงไม่สามารถใช้พร็อกซีได้
เล่นแร่แปรธาตุ

2
@mikeal, resopollution - ฉันแข็งแกร่งมากในด้าน Nginx ฉันฮาร์ดไดรฟ์ Node.js หลายครั้ง (ไม่มี stacktrace เพียงแค่ตาย) ฉันไม่เคยชน Nginx Nginx out-of-the-box มีการกำหนดค่าด้วย throttles มีเหตุผลทุกประเภท Node.js โดยค่าเริ่มต้นจะยังคงยอมรับการเชื่อมต่อใหม่ตามความต้องการในการให้บริการที่มีอยู่จนกว่ากล่องจะลดลง ... ใช่ทั้งช่อง; ฉันชนเคอร์เนลบนกล่อง CentOS5 โดยโหนดทดสอบความเครียด (ตอนนี้ที่ไม่ควรเกิดขึ้นจริง) ฉันมาไม่นานและฉันเห็นอนาคตที่สดใสของโหนดซึ่งอาจรวมถึงบทบาทประเภท LB โดยเฉพาะ ยังไม่ถึง
เดฟ Dopson

30

Ryan Dahl ตอบคำถามนี้ในการพูดคุยเรื่องเทคโนโลยีที่เขาให้ที่ Googleเมื่อฤดูร้อนที่ผ่านมา ในการถอดความ "เพียงแค่เรียกใช้กระบวนการหลายโหนดและใช้สิ่งที่เหมาะสมเพื่อให้พวกเขาสื่อสารเช่น sendmsg () - IPC สไตล์หรือ RPC แบบดั้งเดิม"

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

UPDATE - 10/11/11 : ความเห็นพ้องในชุมชนโหนดดูเหมือนว่าคลัสเตอร์ตอนนี้เป็นโมดูลที่ต้องการสำหรับการจัดการหลายอินสแตนซ์โหนดต่อเครื่อง ตลอดไปยังคุ้มค่าดู


8
ตลอดกาลและกลุ่มทำสิ่งที่แตกต่างกันมาก คุณอาจใช้ทั้งคู่ รีสตาร์ทตลอดกระบวนการเมื่อมันตาย คลัสเตอร์จัดการพนักงานหลายคน คุณต้องการใช้ตลอดกาลในการจัดการกระบวนการหลักของคุณ ...
เดฟ Dopson

4
นอกจากนี้โมดูล learnboost จะถูกแทนที่ส่วนใหญ่โดยรุ่นของคลัสเตอร์อบเข้าสู่โหนด v0.6.x (คำเตือน: พื้นผิว API จะแตกต่าง)
เดฟ Dopson

@broofa IPC เริ่มต้นเป็นอย่างไรเมื่อเปรียบเทียบกับให้บอกว่าใช้ Redis หรือ Memcache เล่ห์เหลี่ยมเพียงแค่ส่งสตริง / ข้อมูล / อาร์เรย์ในระหว่างกระบวนการ? ทางไหนจะเร็วกว่ากัน?
NiCk Newman

1
@broofa, IPC มีค่าโสหุ้ยมากเมื่อเทียบกับหน่วยความจำจริงที่ใช้ร่วมกันซึ่ง Java และ C สามารถทำได้
Pacerier

@Pacerier True แต่หน่วยความจำที่ใช้ร่วมกันจะแก้ปัญหาวิธีการขยายขนาดในบริบทของโฮสต์เดียวโดยไม่ต้องแก้ไขปัญหาแมโครที่จำเป็นในการขยายสเกลในหลาย ๆ โฮสต์ เช่นวิธีการทำงานในระบบคลาวด์
broofa

20

คุณสามารถใช้โมดูลคลัสเตอร์ ตรวจสอบนี้

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
    // Fork workers.
    for (var i = 0; i < numCPUs; i++) {
        cluster.fork();
    }

    cluster.on('exit', function(worker, code, signal) {
        console.log('worker ' + worker.process.pid + ' died');
    });
} else {
    // Workers can share any TCP connection
    // In this case its a HTTP server
    http.createServer(function(req, res) {
        res.writeHead(200);
        res.end("hello world\n");
    }).listen(8000);
}

13

มัลติโหนดใช้ประโยชน์จากแกนประมวลผลทั้งหมดที่คุณมี
มีลักษณะที่http://github.com/kriszyp/multi-node

สำหรับความต้องการที่ง่ายขึ้นคุณสามารถเริ่มต้นโหนดหลายสำเนาบนหมายเลขพอร์ตที่แตกต่างกันและวาง load balancer ไว้ข้างหน้า


12

Node Js สนับสนุนการทำคลัสเตอร์เพื่อใช้ประโยชน์เต็มที่จาก cpu ของคุณ หากคุณไม่ได้ทำงานกับคลัสเตอร์คุณอาจเสียความสามารถด้านฮาร์ดแวร์ของคุณไป

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

รหัสที่แสดงด้านล่างอนุญาตให้คุณจัดกลุ่มแอปพลิเคชันของคุณ รหัสนี้เป็นรหัสทางการที่แสดงโดย Node.js

var cluster = require('cluster');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
    // Fork workers.
    for (var i = 0; i < numCPUs; i++) {
        cluster.fork();
    }

    Object.keys(cluster.workers).forEach(function(id) {
        console.log("I am running with ID : " + cluster.workers[id].process.pid);
    });

    cluster.on('exit', function(worker, code, signal) {
        console.log('worker ' + worker.process.pid + ' died');
    });
} else {

    //Do further processing.
}

ตรวจสอบบทความนี้สำหรับบทช่วยสอนเต็มรูปแบบ


11

ตามที่กล่าวไว้ข้างต้นClusterจะปรับขนาดและโหลดแอพของคุณในทุกคอร์

เพิ่มสิ่งที่ชอบ

cluster.on('exit', function () {
  cluster.fork();
});

จะรีสตาร์ทผู้ทำงานที่ล้มเหลว

ทุกวันนี้ผู้คนจำนวนมากชอบPM2ซึ่งจัดการการจัดกลุ่มสำหรับคุณและยังมีคุณสมบัติการตรวจสอบที่ยอดเยี่ยมอีกด้วย

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


3
PM2 นั้นยอดเยี่ยมสำหรับการใช้งานจริง เครื่องมือตรวจสอบช่วยฉันแก้ไขปัญหาความจำของแอพ
mbokil

7

รุ่นในอนาคตของโหนดจะช่วยให้คุณสามารถแยกกระบวนการและส่งข้อความไปยังมันได้และ Ryan ได้ระบุว่าเขาต้องการหาวิธีที่จะแชร์ตัวจัดการไฟล์ด้วยดังนั้นจึงไม่เป็นการใช้งาน Web Worker โดยตรง

ในขณะนี้ยังไม่มีวิธีแก้ปัญหาที่ง่าย แต่ก็ยังเร็วเกินไปและโหนดเป็นหนึ่งในโครงการโอเพ่นซอร์สที่เคลื่อนไหวเร็วที่สุดเท่าที่ฉันเคยเห็นมาดังนั้นคาดว่าจะมีบางสิ่งที่ยอดเยี่ยมในอนาคตอันใกล้


7

Spark2 ขึ้นอยู่กับ Spark ซึ่งตอนนี้ไม่ได้รับการบำรุงรักษาอีกต่อไป คลัสเตอร์เป็นตัวตายตัวแทนและมีคุณสมบัติเจ๋ง ๆ เช่นวางไข่หนึ่งกระบวนการต่อซีพียูคอร์และการตอบสนองคนตาย


คำถามเดิมและคำตอบมากมายเหล่านี้มีอายุไม่กี่เดือนและเมื่อโหนดเคลื่อนไหวอย่างรวดเร็วฉันขอขอบคุณที่คุณเพิ่มการแจ้งเตือนเกี่ยวกับ Cluster หลังจากดู Cluster และตัวอย่างแล้วดูเหมือนว่าสิ่งที่ฉัน (หรือ OP?) ต้องการ Node ขอบคุณ!
Riyad Kalla

5

ฉันใช้Node คนทำงานเพื่อเรียกใช้กระบวนการอย่างง่าย ๆ จากกระบวนการหลักของฉัน ดูเหมือนว่าจะทำงานได้ดีในขณะที่เรารอวิธีการอย่างเป็นทางการที่จะมา


1
เหตุใดโหนดของผู้ปฏิบัติงาน example.js ไม่สามารถทำงานได้โหนดของฉันคือ 0.3.3 รุ่นก่อน
กุ้ยหลิน桂林

5

เด็กคนใหม่ในบล็อกที่นี่คือ"Up"ของ LearnBoost "ขึ้น"

มันมี "Zero-downtime reloads" และสร้างผู้ทำงานหลายคนเพิ่มเติม (โดยค่าเริ่มต้นจำนวนซีพียู แต่สามารถกำหนดค่าได้) เพื่อมอบสิ่งที่ดีที่สุดในโลก

มันใหม่ แต่ดูเหมือนว่าจะค่อนข้างเสถียรและฉันใช้มันอย่างมีความสุขในโครงการปัจจุบันของฉัน


5

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

npm i -g pm2
pm2 start app.js -i max

4

คุณสามารถรันแอ็พพลิเคชัน node.js ของคุณบนหลายคอร์โดยใช้โมดูลคลัสเตอร์ร่วมกับระบบปฏิบัติการโมดูลซึ่งอาจใช้เพื่อตรวจสอบจำนวน CPU ที่คุณมี

ตัวอย่างเช่นลองจินตนาการว่าคุณมีserverโมดูลที่รันเซิร์ฟเวอร์ http ง่าย ๆ บนแบ็กเอนด์และคุณต้องการเรียกใช้สำหรับซีพียูหลายตัว:

// Dependencies.
const server = require('./lib/server'); // This is our custom server module.
const cluster = require('cluster');
const os = require('os');

 // If we're on the master thread start the forks.
if (cluster.isMaster) {
  // Fork the process.
  for (let i = 0; i < os.cpus().length; i++) {
    cluster.fork();
  }
} else {
  // If we're not on the master thread start the server.
  server.init();
}


0

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

สิ่งนี้คล้ายกับสถาปัตยกรรมเว็บเซิร์ฟเวอร์ / ฐานข้อมูลการตรวจจับส่วนใหญ่ที่กระบวนการ cgi จัดการกับตรรกะทางธุรกิจและจากนั้นดันและดึงข้อมูลผ่านซ็อกเก็ตยูนิกซ์ไปยังฐานข้อมูล

ความแตกต่างคือการประมวลผลข้อมูลถูกเขียนเป็นโหนดเว็บเซิร์ฟเวอร์ฟังบนพอร์ต

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


0

เป็นไปได้ที่จะขยาย NodeJS ออกเป็นหลายกล่องโดยใช้ TCP load balancer (HAProxy) ด้านหน้ากล่องหลายกล่องที่ใช้งาน NodeJS หนึ่งกระบวนการ

หากคุณมีความรู้ทั่วไปที่จะแบ่งปันระหว่างอินสแตนซ์ทั้งหมดคุณสามารถใช้ที่เก็บ Redis ส่วนกลางหรือคล้ายกันซึ่งสามารถเข้าถึงได้จากอินสแตนซ์กระบวนการทั้งหมด (เช่นจากกล่องทั้งหมด)


ถ้าคุณไม่มีซีพียูหลักเพียงตัวเดียวในเซิร์ฟเวอร์เหล่านั้นนั่นก็จะไม่ใช้ความจุ CPU ทั้งหมดของคุณ (เว้นแต่คุณจะทำอย่างอื่นด้วย)
UpTheCreek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.