Node.js / Express和并行队列

我们正在构build一个基于Node.js服务器和Express的基础架构。

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

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

目前,服务器为每个请求按顺序执行此操作,而且这种方式运行良好(Node / Express可以自动处理并发请求)。 然而,随着我们计划增长,并发请求的数量可能会增长,我们相信对我们来说,实现一个处理请求的队列会更好。 否则,我们可能冒险有太多的任务在同一时间运行和太多的打开连接到CDN。 快速响应客户并不是一件相关的事情。

我在想的是在Node服务器中有一个单独的部分,它包含一些 “工作人员”(2-3,但我们将做testing以确定同时操作的正确数量)。 所以,新stream程看起来像这样:

  1. 在接受来自客户端的请求之后,服务器将一个操作添加到队列中。
  2. 有2-3(待testing)工作人员将队列排除在外并执行所有操作(生成文件并将其上载到CDN)。
  3. 当工作人员处理了这个操作(不pipe是否在队列中停留时间较长),它通知Node服务器(callback),并且服务器响应客户端(它一直在等待)。

你怎么看待这个方法? 你相信这是正确的吗?

最重要的是,这可以在Node / Express中实现吗?

感谢您的时间

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

一些序言: Node.js本身是单线程的。 它的事件循环是什么使它很好地处理多个请求同时,即使在其单线程模型,这是最好的特点之一国际海事组织。

真正的交易:那么,我们如何能够缩放这个甚至处理更多的并发连接,并使用所有可用的CPU? 用集群模块 。

这个模块的工作方式与@Qualcuno所指出的完全一样,它将允许您在主服务器后面创build多个工作者(aka进程)来共享负载并更有效地使用可用的CPU。

根据Node.js的官方文档:

因为员工都是独立的stream程,所以他们可以根据自己的计划需求而被杀死或重新产生,而不会影响到其他员工。 只要还有一些工人还活着,服务器就会继续接受连接。

所需的例子:

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); } 

希望这是你所需要的。

如果您还有其他问题,请留言

(回答我自己的问题)

根据堆栈溢出这个问题,在我的情况下,解决scheme是使用Caolan McMahon的asynchronous模块来实现一个队列。

主应用程序将创build作业并将其推送到队列中,该队列对可以运行的并行作业数量有限制。 这允许同时处理任务,但是严格控制极限。 它在Mac OSX上像cocoa的NSOperationQueue一样工作。

要做到这一点,我会使用像Heroku提供的Web / Worker Dynos(服务器)一样的结构。 Web服务器可以接受请求并将信息传递给可以进行信息处理和上传的工作人员。 我会让前端站点在一个套接字(socket.io)上监听外部CDN的URL,当上传完成时,它将从worker中触发。 希望这是有道理的。

您可以使用Kue模块和Redis(数据库来保存作业)备份队列。 你创造了工作,并把它们放在一个使用kue模块中,你可以把多less个工作人员放在他们身上。 有用的链接:kue – https://github.com/Automattic/kue