2

我感觉某处有某种泄漏,但我不确定如何识别或排除故障。我正在使用 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;
4

0 回答 0