这是我第一次使用Node.js和Mongo,所以请原谅任何无知。我来自PHP背景。据我所知,Node.js因其事件驱动的性质而得分很好。因此,我在节点中构建了我的API并且已经在本地主机上测试它。今天,我将它部署到我的云服务器,一切都很好,除了......
随着请求开始堆积,他们开始需要很长时间才能完成。只有2个客户端连接到API,当两个客户端同时尝试发出多个请求时(有时会发生这种情况),我已经看到30秒+页面加载时间。
API完成的大部分工作是(a)读取/写入MongoDB,它驻留在云上的第二台服务器上(b)向其他API,网站等发出请求并返回结果。这两个操作都不应该阻塞,但我可以想象这个问题与Mongo DB服务器(a)或外部API(b)上的瓶颈有关。
当然,我最终会有多个应用程序服务器,但我希望每个服务器都可以处理多个并发客户端而不会出现阻塞。
一些注意事项: 1)我在节点代码中留下了一些console.logs,我打开了一个SSH客户端来监控云服务器。我怀疑这可能导致减速 2)我使用express,mongoose,Q,request和一些其他模块
感谢您花时间帮助节点newb;)
编辑:在下面的一些回复之后添加了一些性能图表的图片...
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 / promise的了解很少。但是,我认为我一直以不阻止的方式实施它们......
答案 0 :(得分:3)
您的问题提供了一半的相关数据:技术堆栈。但是,在调试性能问题时,还需要另一半数据:性能指标。
您正在运行一些“云服务器”,但目前尚不清楚这些服务器实际上在做什么。它们是否在CPU上飙升?在记忆?在IO?
有很多潜在的问题。你在生产模式下运行Express吗?你在MongoDB服务器上占用了太多的IO吗?您是否合法地下载了太多数据?你是否陷入了无限的Node.JS循环? (它发生)
我想提供更好的建议,但不知道所涉及的服务器的状态,开始选择任何特定的底层技术是不可能的。您可能是“Node newb”,但基本的服务器监控在编程语言中非常标准。
感谢您提供额外的详细信息,我将重新审核上述评论中最重要的部分:这些服务器被阻止在哪里?