为每秒 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 分散负载的多台服务器集群是一个很好的做法。当你超过这个规模时,你可能会在地理上进行扩展,以便来自不同地区的请求到达网络上离他们更近的不同数据中心(例如美国、欧洲、非洲、亚洲等...)。

在某些情况下(这完全取决于瓶颈所在),使用高性能负载均衡器将负载分散到不同端口上的不同服务器进程(在同一台计算机上)比拥有所有这些更好进程共享一个端口。这最终只能通过测试来解决。