我的一些流星方法最近神秘地放慢了速度。虽然它们过去很活泼,但很多都需要10秒左右。
不会造成经济放缓的事情:
我在服务器端和客户端使用console.time()/ console.timeEnd()进行了调试。服务器端代码需要大约0.3秒才能运行,但是客户端在meteor.call()之后大约11秒才会收到回调...
这是服务器方法:
function cancelSomething(somethingId, reason) {
console.time('cancelSomething method');
check(somethingId, String);
check(reason, String);
if (!AuthChecks()))
throw new Meteor.Error(401, 'Not Authorized');
var something = MySomethings.findOne({'_id': somethingId});
if (!something)
throw new Meteor.Error(404, 'Something not found');
var returnVal = SomethingService.cancel(something, reason);
console.timeEnd('cancelSomething method'); // <--- prints "cancelSomething 350ms" or there abouts
return returnVal;
}
客户机侧:
console.time('meteorCall');
Meteor.call('cancelSomething', this._id, reason, function(err) {
if (err) {
console.log('an error occurred', err);
}
console.timeEnd('meteorCall'); // <--- prints "meteorCall 11500" or so
});
编辑: 我注意到db中“somethings”中的文档数量存在一定的相关性。 w / 500文件需要大约1秒才能收到客户端的回报,5000则需要大约8.5秒......
答案 0 :(得分:4)
有趣。我认为在不了解您的应用程序的情况下很难回答这个问题,但我有一些建议可以帮助您指导正确的方向。
如果我们可以假设定时器工作正常,可能正在发生的是服务器无法开始执行该方法,因为另一个方法调用由同一客户已在进行中。请查看文档中的unblock。答案可能就像在您的某个方法的顶部放置this.unblock
一样简单。
如果SomethingService.cancel
做了导致大量DDP流量的事情,那么可能会占用客户端一段时间并使其无法执行回调。例如,如果它:
似乎问题必须通过调用observe
,考虑到你的高CPU负载,这很有意义。坦率地说,我没有提出这个问题,这有点愚蠢,因为我已经回答了类似的问题here。如果您想尝试保持观察,这里有一些额外的建议: