为每秒 1-3k 请求的集群分叉在一个端口上启动 http 服务器是一种好习惯吗?
Is it a good practice to start http server on one port for Cluster forks for 1-3k requests per second?
在 node.js 上创建高负载服务器是个好方法吗?
我需要启动高负载(1-3k 请求)http 服务器来处理 Post 请求。作为后端,我选择 node.js with express。
我为所有分叉进程创建了一个共享的 http 服务器。
本地测试在每 3000 个请求中给出了 3.75 秒的结果。
const cluster = require('cluster');
const port = 3000;
var express = require('express');
var cors = require('cors');
var queryController = require('./controllers/queryController');
var app = express();
app.set('view engine', 'ejs');
app.use(cors());
if (cluster.isMaster) {
const cpuCount = require('os').cpus().length;
// Forking.
for (let i = 0; i < cpuCount; i++) {
cluster.schedulingPolicy = cluster.SCHED_NONE;
cluster.fork();
}
cluster.on('fork', (worker) => {
console.log(Worker #${worker.id} is up!);
});
cluster.on('listening', (worker, address) => {
worker.on('message', (msg)=>{
...
} );
});
cluster.on('disconnect', (worker) => {
console.log(The worker #${worker.id} has disconnected);
});
cluster.on('exit', (worker) => {
console.log(Worker ${worker.id} is dead);
cluster.fork();
});
} else {
//All forks listen 3000 port and each uses own controller to handle a requests
queryController(app,cors);
app.listen(port, function(){
// console.log("Listening on port 3000!");
});
process.on('uncaughtException', (err) => {
console.error(err.message);
console.error(err.stack);
process.exit(1);
});
}
当您超过单个 node.js 进程的规模时,如果您的 node.js CPU 处理确实是瓶颈(而不是像你的数据库服务器这样的共享资源,它本身应该是集群或扩展的)。这是 cluster module 的推荐方案,内置于 node.js.
当您超过该规模时,使用某种负载 balancer/proxy 分散负载的多台服务器集群是一个很好的做法。当你超过这个规模时,你可能会在地理上进行扩展,以便来自不同地区的请求到达网络上离他们更近的不同数据中心(例如美国、欧洲、非洲、亚洲等...)。
在某些情况下(这完全取决于瓶颈所在),使用高性能负载均衡器将负载分散到不同端口上的不同服务器进程(在同一台计算机上)比拥有所有这些更好进程共享一个端口。这最终只能通过测试来解决。
在 node.js 上创建高负载服务器是个好方法吗? 我需要启动高负载(1-3k 请求)http 服务器来处理 Post 请求。作为后端,我选择 node.js with express。 我为所有分叉进程创建了一个共享的 http 服务器。 本地测试在每 3000 个请求中给出了 3.75 秒的结果。
const cluster = require('cluster');
const port = 3000;
var express = require('express');
var cors = require('cors');
var queryController = require('./controllers/queryController');
var app = express();
app.set('view engine', 'ejs');
app.use(cors());
if (cluster.isMaster) {
const cpuCount = require('os').cpus().length;
// Forking.
for (let i = 0; i < cpuCount; i++) {
cluster.schedulingPolicy = cluster.SCHED_NONE;
cluster.fork();
}
cluster.on('fork', (worker) => {
console.log(Worker #${worker.id} is up!);
});
cluster.on('listening', (worker, address) => {
worker.on('message', (msg)=>{
...
} );
});
cluster.on('disconnect', (worker) => {
console.log(The worker #${worker.id} has disconnected);
});
cluster.on('exit', (worker) => {
console.log(Worker ${worker.id} is dead);
cluster.fork();
});
} else {
//All forks listen 3000 port and each uses own controller to handle a requests
queryController(app,cors);
app.listen(port, function(){
// console.log("Listening on port 3000!");
});
process.on('uncaughtException', (err) => {
console.error(err.message);
console.error(err.stack);
process.exit(1);
});
}
当您超过单个 node.js 进程的规模时,如果您的 node.js CPU 处理确实是瓶颈(而不是像你的数据库服务器这样的共享资源,它本身应该是集群或扩展的)。这是 cluster module 的推荐方案,内置于 node.js.
当您超过该规模时,使用某种负载 balancer/proxy 分散负载的多台服务器集群是一个很好的做法。当你超过这个规模时,你可能会在地理上进行扩展,以便来自不同地区的请求到达网络上离他们更近的不同数据中心(例如美国、欧洲、非洲、亚洲等...)。
在某些情况下(这完全取决于瓶颈所在),使用高性能负载均衡器将负载分散到不同端口上的不同服务器进程(在同一台计算机上)比拥有所有这些更好进程共享一个端口。这最终只能通过测试来解决。