【发布时间】:2016-09-06 20:10:50
【问题描述】:
我正在使用 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', function (req, 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', function (req, res) {
User.find({}).exec(function(err, users) {
res.json(users);
}
});
app.get('/admin-route', function (req, res) {
blockingFunction(); // this function takes 2 seconds to complete
});
3.当请求 X 命中admin-route 并调用blockingFunction() 时,在 X 的请求之后立即调用 /users 的 A、B 和 C 是否必须等待 2 秒才能进入路由回调函数?
4.我们是否应该将每个自定义函数,即使它只需要 4 毫秒,都作为带有回调的异步函数?
【问题讨论】:
-
与这个问题无关,但我听说 express 已经死了。
-
Node/JS 中的
blockingFunction是什么? Afaik,一切都是围绕事件循环建模的。
标签: node.js