我正在运行带有express的Node.js应用程序,并希望开始提高其性能.定义了几条路线.我们有一个基本的例子:
app.get('/users',function (req,res) { User.find({}).exec(function(err,users) { res.json(users); } });
假设我们有3个客户端A,B和C,他们试图使用这条路线.他们的请求以A,B,C的顺序到达服务器,两者之间有1毫秒的差异.
1.如果我正确理解了node.js架构,那么每个请求都会被立即处理,因为Users.find()是异步的并且有非阻塞代码?
让我们用同步调用展开这个例子:
app.get('/users',res) { var parameters = getUserParameters(); User.find({parameters}).exec(function(err,users) { res.json(users); } });
相同的请求,相同的订单. getUserParameters()需要50毫秒才能完成.
2. A将进入路由回调函数并阻塞node.js线程50毫秒. B和C将无法进入该功能并且必须等待.当A完成getUsersParameters()时,它将继续使用异步User.find()函数,B现在将进入路由回调函数. C仍然需要等待50多毫秒.当B进入异步功能时,可以最终处理C的请求.合在一起:C必须等待50毫秒才能完成A,50毫秒需要B完成,50毫秒才能完成(为简单起见,我们忽略了异步功能的等待时间)?
现在假设我们还有一个路由,只有管理员可以访问,并且每分钟都会通过crontab调用.
app.get('/users',res) { User.find({}).exec(function(err,users) { res.json(users); } }); app.get('/admin-route',res) { blockingFunction(); // this function takes 2 seconds to complete });
3.当请求X命中admin-route并且调用了blockingFunction()时,在X的请求之后立即调用/ users的A,B和C是否必须等待2秒才会进入路由回调函数?