节点一个异步调用并行减慢另一个

时间:2018-02-15 23:00:44

标签: node.js asynchronous dependencies

一年多来,我们看到了一些有趣的模式,这些模式并不总是让自己重复,但有时会重复,我们从来没有弄明白为什么,我希望有人可以理解它。它可能是我们的方法,它可能是环境(节点8.x& koa),它可能是很多东西。

我们使用request-promise模块与依赖项并行进行两次异步调用。

单个api依赖项的简化代码:

const httpRequest = require("request-promise");

module.exports = function (url) {
    const requestOptions = { 
        uri: ...,
        json: true,
        resolveWithFullResponse: true
    }

    return httpRequest(requestOptions)
        .then(response => {
            status = response.statusCode;
            tmDiff = moment().diff(tmStart);

            return createResponseObject({
                status,
                payload: response.body,
            })
        })
        .catch(err => { .... };
    });

};

并行呼叫:

const apiResponses = yield {
    api1: foo(ctx, route),
    api2: bar(ctx)
};

然而,我们在响应时间图表中看到的情况是,如果1很慢,则延迟似乎跟随其他单独的服务。它们的服务并不重要,这种模式已被注意到>可以并行调用的5个服务。有没有人有什么想法会导致所谓的延迟?

enter image description here

1 个答案:

答案 0 :(得分:0)

如果延迟是由暂时减慢的网络连接引起的,那么期望两个并行请求都能感受到同样的效果是合乎逻辑的。在减速过程中pingtracert可能会为您提供有用的诊断信息,以确定它是否是一般的运输问题。如果你的node.js服务器(运行Javascript单线程)暂时忙着用CPU做其他事情(提供另一个请求,垃圾收集等等),那么这会影响API调用的明显响应性,因为它花了node.js片刻处理等待响应的时刻。

有些工具可以持续监控您自己的http服务器的响应能力(您可以设置所需的监控间隔)。如果你在某处有一个CPU-hog,那些工具会在响应性方面表现出类似的滞后。还有一些工具可以监控网络连接的健康状况,这也会显示连接故障。这些是监视工具的类型,人们的工作是维护健康的服务器场可能使用的工具。我没有一个名称方便任何一个,但你可以通过搜索找到这样的工具。