这是我第一次使用 Node.js 和 Mongo,所以请原谅任何无知。我来自 PHP 背景。我的理解是 Node.js 之所以可以很好地扩展,是因为它具有事件驱动的特性。因此,我在 node 中构建了我的 API,并一直在 localhost 上对其进行测试。今天,我将它部署到我的云服务器上,一切正常,除了......
随着请求开始堆积,它们开始需要很长时间才能完成。只有 2 个客户端连接到 API,当两个客户端尝试同时发出多个请求时,我已经看到 30 秒以上的页面加载时间(有时确实会发生)。
API 完成的大部分工作是 (a) 读取/写入驻留在云上的第二台服务器上的 MongoDB (b) 向其他 API、网站等发出请求并返回结果。这两个操作都不应该阻塞,但我可以想象这个问题与 Mongo DB 服务器 (a) 或外部 API (b) 上的瓶颈有关。
当然,我最终会拥有多个应用服务器,但我希望每个服务器能够处理多个并发客户端而不会阻塞。
一些注意事项:1)我在节点代码中留下了一些console.logs,并且我打开了一个SSH客户端来监控云服务器。我怀疑这可能会导致速度变慢 2) 我使用 express、mongoose、Q、request 和一些其他模块
感谢您花时间帮助节点 newb ;)
编辑:在下面的一些回复之后添加了一些性能图的图片......
编辑:这是一个典型的回调——它由快速路由器调用,它使用 Q 模块和 OAuth 对 Facebook 进行 Post API 调用:
post: function(req, links, images, callback)
{
// removed some code that calculates the target (string) and params (obj) variables
// the this.request function is a simple wrapper around the oauth.getProtectedResource function
Q.ncall(this.request, this, target, 'POST', params)
.then(function(res){
callback(null, res);
})
.fail(callback).end();
},
编辑:一些“upsert”代码
upsert: function(query, callback)
{
var id = this.data._id,
upsertData = this.data.toObject(),
query = query || {'_id': id};
delete upsertData._id;
this.model.update(query, upsertData, {'upsert': true}, function(err, res, out){
if(err)
{
if(callback) callback(new Errors.Database({'message':'the data could not be upserted','error':err, 'search': query}));
return;
}
if(callback) callback(null);
});
},
诚然,我对 Q/promises 的了解很薄弱。但是,我认为我一直以一种不会阻止的方式实施它们......