Node.js/Express和并行队列

Ita*_*Ale 15 queue concurrency node.js express

我们正在构建一个具有Node.js服务器和Express的基础架构.

在服务器中,发生的事情如下:

  1. 服务器接受来自客户端的传入HTTP请求.
  2. 服务器生成两个文件(此操作可以"相对较长",也意味着0.1秒左右)
  3. 服务器将生成的文件(每个约20-200 KB)上载到外部CDN
  4. 服务器响应客户端,这包括CDN上文件的URI

目前,服务器按顺序为每个请求执行此操作,这非常有效(Node/Express可以自动处理并发请求).但是,随着我们计划增长,并发请求的数量可能会增加,我们认为实现队列处理请求会更好.否则,我们可能会面临同时运行太多任务以及与CDN打开过多连接的风险.快速响应客户并不是一件相关的事情.

我在想的是在节点服务器中有一个单独的部分,其中包含一些 "工作者"(2-3,但我们将进行测试以确定正确的同时操作数).所以,新流程看起来像:

  1. 在接受来自客户端的请求之后,服务器将操作添加到队列.
  2. 有2-3个(待测试的)工作人员将元素从队列中取出并执行所有操作(生成文件并将其上载到CDN).
  3. 当工作人员处理了操作(如果它在队列中停留相对较长时间无关紧要),它会通知节点服务器(回调),服务器响应客户端(同时等待客户端) ).

您如何看待这种方法?你认为这是正确的吗?

最重要的是,如何在Node/Express中实现?

感谢您的时间

dio*_*ney 28

tldr; 您可以使用本机Node.js 群集模块来处理大量并发请求.

一些序言: Node.js本身是单线程的.它的事件循环使它非常适合同时处理多个请求,即使在它的单线程模型中也是如此,这是IMO的最佳功能之一.

真正的交易: 那么,我们如何扩展它以处理更多的并发连接并使用所有可用的CPU?使用群集模块.

该模块将完全按照@Qualcuno的指示工作,这将允许您在主服务器后面创建多个工作程序(也称为进程)以共享负载并更有效地使用可用的CPU.

根据Node.js官方文档:

由于工人都是独立的流程,因此可以根据您的计划需求杀死或重新生成工作,而不会影响其他工作人员.只要有一些工作人员还活着,服务器就会继续接受连接.

必需的例子:

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);
}
Run Code Online (Sandbox Code Playgroud)

希望这是你需要的.

如果您有任何其他问题,请评论.


Ita*_*Ale 5

(回答我自己的问题)

根据Stack Overflow上的这个问题,在我的案例中,解决方案是使用Caolan McMahon的异步模块实现队列.

主应用程序将创建作业并将其推入队列,该队列可以运行的并发作业数量有限制.这允许同时处理任务,但严格控制限制.它在Mac OSX上像Cocoa的NSOperationQueue一样工作.