一年多来,我们看到了一些有趣的模式,这些模式并不总是让自己重复,但有时会重复,我们从来没有弄明白为什么,我希望有人可以理解它。它可能是我们的方法,它可能是环境(节点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个服务。有没有人有什么想法会导致所谓的延迟?
答案 0 :(得分:0)
如果延迟是由暂时减慢的网络连接引起的,那么期望两个并行请求都能感受到同样的效果是合乎逻辑的。在减速过程中ping
或tracert
可能会为您提供有用的诊断信息,以确定它是否是一般的运输问题。如果你的node.js服务器(运行Javascript单线程)暂时忙着用CPU做其他事情(提供另一个请求,垃圾收集等等),那么这会影响API调用的明显响应性,因为它花了node.js片刻处理等待响应的时刻。
有些工具可以持续监控您自己的http服务器的响应能力(您可以设置所需的监控间隔)。如果你在某处有一个CPU-hog,那些工具会在响应性方面表现出类似的滞后。还有一些工具可以监控网络连接的健康状况,这也会显示连接故障。这些是监视工具的类型,人们的工作是维护健康的服务器场可能使用的工具。我没有一个名称方便任何一个,但你可以通过搜索找到这样的工具。