我们正在构建一个具有Node.js服务器和Express的架构体系。
在服务器中,发生的情况如下所示:
目前,服务器正在为每个请求按顺序执行此操作,并且效果非常好(Node/Express可以自动处理并发请求)。然而,随着我们计划的增长,并发请求的数量可能会增加,我们认为最好实现一个队列来处理请求。否则,我们可能会面临同时运行太多任务和到CDN的太多打开连接的风险。快速响应客户不是一件相关的事情。
我所考虑的是在节点服务器中有一个单独的部分,其中包含几个“worker”(2-3个,但我们将进行测试以确定同时操作的正确数量)。因此,新的流看起来像:
你认为这种方法怎么样?你认为这是正确的吗?
最重要的是,如何在Node/Express中实现?
谢谢你抽出时间
为此,我将使用Heroku提供的Web/Worker Dynos(服务器)结构。web服务器可以接受请求并将信息传递给工人,工人可以进行信息处理和上传。我会让前端站点在一个套接字(socket.io)上监听外部CDN的url,当上传完成时,该url将从工作者处触发。希望这是有道理的。
(回答我自己的问题)
根据Stack Overflow上的这个问题,在我的例子中,一个解决方案是使用Caolan McMahon的异步模块实现一个队列。
主应用程序将创建作业并将它们推送到队列中,队列对可以运行的并发作业数量有限制。这允许并发处理任务,但严格控制限制。它的工作原理类似于MacOSX上Cocoa的NSOperationQueue。
可以使用本机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);
}
希望这是你需要的。
如果您有任何其他问题,请发表评论。
问题内容: 我在会话方面遇到问题,有时我 刚刚 设置的会话变量在下一页请求中未定义。为了正确设置变量,我通常必须再次执行该流程。 我可以确认我没有尝试将会话变量设置为undefined。他们有合法的价值。 在我的应用中,用户从/ twitter / connect /移至/ twitter / callback /。前者从Twitter检索一些oauth数据,后者将用户登录到Twitter。 /
问题内容: 我当前正在使用一个Web应用程序,每次都调用此Web应用程序,请删除所有当前的Express会话,因此我需要一种方法来保留所有这些会话。我试图用connect- mongodb和connect- redis保留所有这些会话,但是都无效,nodemon总是说req.session是未定义的。我不知道该怎么做才能保留所有会话。 我需要一种方法来保留所有会话,执行时不要丢失它们,并为其提供教
问题内容: 我无法确切了解其功能。我以为自己了解了,但似乎无法复制自己的感觉: 虽然是循环的,我会寄过来几个请求,假设将排队几次身后有只在被排队完成。 如果我对它的工作方式是正确的,我认为结果将如下所示: 但这不是连续的: 我看到这是在执行之前返回的,这是预期的,但似乎是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