当前位置: 首页 > 知识库问答 >
问题:

Node.js/Express和并行队列

万俟渊
2023-03-14

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

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

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

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

我所考虑的是在节点服务器中有一个单独的部分,其中包含几个“worker”(2-3个,但我们将进行测试以确定同时操作的正确数量)。因此,新的流看起来像:

  1. 在接受来自客户机的请求后,服务器向队列添加操作
  2. 有2-3名(待测试)工作人员将元素从队列中取出并执行所有操作(生成文件并将其上载到CDN)
  3. 当工作进程处理完操作后(不管它是否在队列中停留相对较长的时间),它会通知节点服务器(回调),而服务器会响应客户机(一直在等待)

你认为这种方法怎么样?你认为这是正确的吗?

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

谢谢你抽出时间

共有3个答案

韩豪
2023-03-14

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

龚威
2023-03-14

(回答我自己的问题)

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

主应用程序将创建作业并将它们推送到队列中,队列对可以运行的并发作业数量有限制。这允许并发处理任务,但严格控制限制。它的工作原理类似于MacOSX上Cocoa的NSOperationQueue。

曹建华
2023-03-14

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

一些前导:Node.js本身是单线程的。它的事件循环使得它非常适合同时处理多个请求,即使在它的单线程模型中也是如此,这是它最好的特性之一。

真正的交易:那么,我们如何扩展它以处理更多的并发连接并使用所有可用的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);
}

希望这是你需要的。

如果您有任何其他问题,请发表评论。

 类似资料:
  • 问题内容: 我当前正在使用一个Web应用程序,每次都调用此Web应用程序,请删除所有当前的Express会话,因此我需要一种方法来保留所有这些会话。我试图用connect- mongodb和connect- redis保留所有这些会话,但是都无效,nodemon总是说req.session是未定义的。我不知道该怎么做才能保留所有会话。 我需要一种方法来保留所有会话,执行时不要丢失它们,并为其提供教

  • 问题内容: 我在会话方面遇到问题,有时我 刚刚 设置的会话变量在下一页请求中未定义。为了正确设置变量,我通常必须再次执行该流程。 我可以确认我没有尝试将会话变量设置为undefined。他们有合法的价值。 在我的应用中,用户从/ twitter / connect /移至/ twitter / callback /。前者从Twitter检索一些oauth数据,后者将用户登录到Twitter。 /

  • 问题内容: 我无法确切了解其功能。我以为自己了解了,但似乎无法复制自己的感觉: 虽然是循环的,我会寄过来几个请求,假设将排队几次身后有只在被排队完成。 如果我对它的工作方式是正确的,我认为结果将如下所示: 但这不是连续的: 我看到这是在执行之前返回的,这是预期的,但似乎是NEXT在行,而不是在队列的末尾,在所有请求的后面。这是它的工作方式吗?也许我只是不了解节点中事件队列的工作原理。而且请不要在这

  • Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。 使用 Express 可以快速地搭建一个完整功能的网站。 Express 框架核心特性: 可以设置中间件来响应 HTTP 请求。 定义了路由表用于执行不同的 HTTP 请求动作。 可以通过向模

  • Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。 使用 Express 可以快速地搭建一个完整功能的网站。 Express 框架核心特性: 可以设置中间件来响应 HTTP 请求。 定义了路由表用于执行不同的 HTTP 请求动作。 可以通过向模板传递参数来动态渲染 HTML 页面。

  • 问题内容: 我已经通过使用nodejs + express制作了简单的nodejs应用程序。现在,我要进行用户身份验证。我想通过使用猫鼬来实现会话处理。你能举个例子吗? 问题答案: 一些有用的链接: 如何在node.js中实现登录身份验证 在node.js和mongodb中创建注册和登录表单 另外,会话管理不是由Mongoose完成,而是由connect-mongodb或connect- redi