我有一个似乎没有人帮忙的问题。如何在生产模式下同时处理数千个请求?
我做了一个简单的测试用例:
module.exports = {
index: function (req, res){
if (req.param('foo') == 'bar'){
async.series([
function(callback){
for (k=0; k <= 50000; k++){
console.log('did something stupid a few times');
}
callback();
}
], function(){
return res.json(null);
});
}else{
return res.view('homepage', {
});
}
}
};
现在,如果我转到http://localhost:1337/?foo=bar,它显然会等待一段时间才会响应。因此,如果我现在打开一个不同的会话(其他浏览器或隐身,并转到http://localhost:1337/我希望立即得到结果。而是等待其他请求完成,然后它才会让这个请求通过。
因此它不是异步的,如果我同时操作这个应用程序有2个ppl,这是一个很大的问题。我的意思是这个应用程序将有来自数据库,正在提供的html文件等的下拉...
我的问题是:如何处理这样的问题?我听到了#34; promises vs callbacks&#34; - 这是某种解决方案吗?
我知道群集,但这只会将请求与cpu的数量分开,最终你会解决它最多允许8个人同时不被阻止。它赢了;同时处理了100个请求......
P.S。该测试是为了简化示例,但考虑有人上传文件,转发到不同服务器的Web服务,等待用户输入引脚的销售点支付终端,有人从应用程序下载文件等...
答案 0 :(得分:0)
nodejs是事件驱动的,并以单线程运行您的Javascript。因此,只要第一个请求中的代码位于for
循环中,nodej就无法执行任何操作,并且无法访问事件队列中的下一个事件,因此您的第二个请求必须等待第一个完成。
现在,如果您使用了真正的异步操作,例如setTimeout()
而不是大for
循环,那么nodejs可以在第一个请求等待setTimeout()
时为其他事件提供服务。
nodejs中的一般规则是避免在主nodejs应用程序中执行需要大量CPU的任何操作。如果您遇到CPU密集型问题,那么您最好是运行集群(与您拥有的CPU一样多),或者将CPU密集型工作转移到由不同进程提供服务的某种工作队列中,然后让它们运行当主节点进程保持空闲并准备好为新的传入请求提供服务时,操作系统时间切片那些其他进程。
我的问题是:如何处理这样的问题?我听到了#34; promises vs callbacks&#34; - 这是某种解决方案吗?
我知道群集,但这只会将请求与cpu的数量分开,最终你会解决它最多允许8个人同时不被阻止。它赢了;同时处理了100个请求......
大多数情况下,服务器进程花费大部分时间在请求中执行nodejs中的异步操作(读取文件,与其他服务器通信,执行数据库操作等等),其中实际工作已完成在nodejs进程之外。在这种情况下,当正在进行其他请求的异步操作时,nodejs不会阻塞并可以自由处理其他请求。协调这些操作的一点点CPU时间可以通过集群进一步帮助,尽管它可能值得首先测试一个进程,看看是否真的需要集群。
P.S。该测试是为了简化示例,但考虑有人上传文件,转发到不同服务器的Web服务,等待用户输入引脚的销售点支付终端,有人从应用程序下载文件等...
你在这里提到的所有操作都可以真正异步完成,所以他们不会像你的for
循环一样阻止你的nodejs app,所以基本上for
循环不是很好的模拟任何一个。您需要使用真正的异步操作来模拟它。真正的异步操作在主nodejs线程之外完成它们的工作,然后只在它们完成时将事件发布到事件队列,允许nodejs在异步操作正在执行其工作时执行其他操作。这是关键。