我感觉某处有某种泄漏,但我不确定如何识别或排除故障。我正在使用 express 和 nodejs 的请求模块。在负载下,通过请求对 Facebook Graph API 进行的 https 调用开始经历长时间的延迟或完全超时。起初我认为这是接收端 (Facebook) 的节流问题,但如果我制作一个简单的 C# 控制台应用程序,调用相同的 URL 数百次,响应时间都不会超过 150 毫秒。但是,节点中的相同代码从 50 毫秒到最多 10 秒不等。如果我在使用请求时设置了 timeout 属性,我会开始收到 ESOCKETTIMEDOUT 错误。如果我将请求选项上的 pool.maxsize 设置为 100,则会收到 ETIMEDOUT 错误。
我怎样才能知道我的挂断发生在哪里?
这是我使用请求模块的示例。我还尝试将其添加到我的应用程序中:
require('http').globalAgent.maxSockets = Infinity;
require('https').globalAgent.maxSockets = Infinity;
var executeGetUrl = function getUrl(url, cacheKey, parseJson, accessToken, callback) {
if (accessToken) {
url = url + '?access_token=' + accessToken;
}
try {
request({url: url, timeout: 10000, 'pool.maxSockets' : 100}, function (err, res, body) {
if (err) {
logger.error('Made facebook api call to ' + url + ' with error ' + err);
callback(err, null);
return;
}
if (parseJson) {
try {
body = JSON.parse(body);
} catch (err) {
callback(new Error('Could not parse ' + res.body + ': ' + err), null);
return;
}
if (body.error) {
err = new Error('Error calling ' + url + '. ' + body.error.message);
err.code = body.error.code;
callback(err, null);
}
else {
callback(null, body || {});
}
} else {
if (res.statusCode != 200) {
callback(new Error(res.body));
} else {
callback(null, res.body || {});
}
}
});
} catch (err) {
callback(null, err);
}
};
我正在记忆结果 60 秒,但这似乎与问题没有任何关系
var getUrl = memoize(executeGetUrl, {async: true, maxAge: 60000, length: 2});
并在承诺链中使用该功能
var deferred = q.defer();
getUrl(photosUrl, null, false, null, function (err, body) {
if (err) {
deferred.reject(err);
return;
}
deferred.resolve(body);
});
return deferred.promise;