如何让我的 nodejs 应用程序为多个用户服务?

Posted

技术标签:

【中文标题】如何让我的 nodejs 应用程序为多个用户服务?【英文标题】:How to make my nodejs app serve multiple users? 【发布时间】:2013-05-06 19:09:26 【问题描述】:

我正在使用 nodejs 和 expressjs 框架实现一个非常基本的网站。这个想法是用户进入网站,点击一个按钮,将触发服务器中的 cpu 密集型任务,并在任务完成后在浏览器上收到一条消息。

对我来说令人困惑的部分是如何在不阻塞事件循环的情况下为每个用户完成此任务,因此,没有用户必须等待另一个用户完成。此外,如何为每个用户使用已用资源(对象、变量..)的新实例。

在玩耍和阅读之后,我遇到了 child-process。基本上,我想为每个用户分叉一个新的 child_process,这样无论排序花费多少时间,它都不会阻塞我的事件循环。但是,我仍然不确定这是否是这种情况下最好的做法。

现在,我已经完成了我想做的事情,但只有一个用户,但是当尝试启动另一个用户时,事情变得混乱并且变量被共享。我知道我不应该使用模块中声明的全局变量,但是还有什么方法可以在单个模块中的函数之间共享变量,但每个用户的变量都不同!?

我知道这个问题可能听起来很基础,但我有点想念 node js 如何为不同的用户提供新的变量,即与每个用户相关联的对象。

简而言之,我的问题是: 1-节点如何同时为多个用户服务? 2-我应该何时以及如何在幕后分叉或执行一个新的子进程,它是针对每个用户还是基于我在 cpu 中的 # cores 3- 如何在我的应用程序中为每个用户分离资源,以便每个用户都有自己的计数器、电子邮件和其他对象和变量。 4-我什么时候需要或者我必须杀死我的子进程。

提前致谢。

代码:

var cp = require('child_process');
var child= cp.fork('./routes/mysort-module');

exports.user=function(req,res)
    // child = new cp.fork('./routes/mysort-module'); // Should I make new child for each user?
    child.on('message',function(m) res.send('DONE');
    child.send('START PROCESS'); // Forking a cpu-intensive task in mysort-module.js


在我的排序模块中:

var variables = require(...);
//GLOBAL VARIABLES to be shared among different functions in this module 
process.on('message',function(m)
    //sort cpu-intensive task
    process.send('DONE');
);
// OTHER FUNCTIONS in THE MODULE that make use of global variables.

【问题讨论】:

【参考方案1】:

您应该尝试拆分您的问题。但是,我希望这能回答它。

问题 1: 全局变量不限于请求范围。这是 Node 对全局定义的一部分,以某种方式强制执行它是没有意义的。你根本不应该使用全局变量。

请求范围由HTTP模块给出:

http.createServer(function(req, res) 
  var a = 1;
  // req, res, and a are in request scope for your user-associated response
); 

消除全局变量应该不是那么难:如果模块 A 和 B 共享一个全局 G 并且模块 C 调用 A.doThis() 和 B.doThat(),则将 C 更改为调用 A.doThis(G) 和 B。 doThat(G) 代替。对所有出现的 G 执行此操作,并将其范围缩小到本地或请求。

此外,如果您需要涵盖来自一个客户端的多个请求的范围,请查看“会话”。

问题2:在请求处理程序中启动子进程:

exports.user = function(req,res)
  child = new cp.fork('./routes/mysort-module');

问题 3:见问题 1?

问题4:进程返回计算结果后。

process.on('DONE', function(result) 
  process.exit();
  // go on and send result to the client somehow...
);

【讨论】:

感谢您的回答,我肯定会给会议一个公平的考虑!并感谢拆分建议,我也看到一个问题太多了!但是,我仍然不确定问题3,也许我没有正确形成我的q,我的问题是,为每个请求启动一个子进程是否可行或正确!?或进程数应限制为核心数!?谢谢!

以上是关于如何让我的 nodejs 应用程序为多个用户服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何让我的 WPF 应用程序的多个实例使用相同的数据?

如何跨多个服务器 nodejs 和 socket.io 存储 socket.id

NodeJS - 处理 100 多个并发连接的内存不足

如何使用 NodeJs 代理多个文件上传?

如何让我的 Blazor 服务器端应用程序 IIS 8.5 保持活力

如何打破大型csv文件,在多个核心上处理它并使用nodeJs将结果合并为一个