问题陈述-
我们在 Internet 客户端和下游服务之间使用路由器。路由器(服务)是用 Node.js 编写的。它的职责是将互联网客户端的请求传递给相应的下游服务,并将响应返回给互联网客户端。我们在路由器级别面临一些延迟。
用于 http-proxy- 的库
https://github.com/nodejitsu/node-http-proxy
Node -http-代理 示例-
用示例进行解释。我们在 99% 的情况下面临问题 -
我们进行了 100 并发的负载/性能测试。
根据结果,直到 95 个百分点,响应时间对互联网客户端来说看起来不错。
但是,在 99 个百分点中,下游服务会在预期时间(~250 毫秒)内做出响应。但是路由器花费的时间是预期的 10 倍(~2500 毫秒)。
服务信息-
路由器和下游服务都在同一区域和同一子网中。所以,这个延迟不是因为网络。
这种延迟的可能性-
- 一些线程在 Node 服务级别被阻塞。这就是为什么无法收听下游服务响应的原因。
- 花更多时间在 DNS 查找上。
- Node 级线程数较少,这就是为什么无法监听来自下游服务端的所有传入响应的原因。
分析这个-
我们调整了以下配置 -
keepAlive、maxSockets、maxFreeSockets、keepAliveMsecs、日志级别。请检查 http/https 代理的 Node 配置 - http agent configuration
Node 服务代码片段-
var httpProxy = require('http-proxy');
var http = require('http');
var https = require('https');
var agent = new https.Agent({
maxSockets: nconf.get(25),
keepAlive: true,
maxFreeSockets: nconf.get(10),
keepAliveMsecs : nconf.get(5000)
});
var proxy = httpProxy.createServer({ agent: agent });
var domain = require('domain');
var requestTimeout = parseInt(nconf.get('REQUEST_TIMEOUT'));
process.env.UV_THREADPOOL_SIZE = nconf.get(4);
问题-
- 我是 Node 服务的新手。如果您能帮助我用正确的值调整上述配置,那就太好了。如果我遗漏了任何配置,请告诉我?
- 有没有办法拦截路由器机器上的网络流量,这将有助于我分析上述 10 倍的路由器响应时间延迟?
- 如果您知道任何分析工具(网络级别),可以帮助我深入研究,请与我分享?
[更新 1]
找到一个有趣的链接 - war-story .
如果我在这里遗漏了任何必需的信息,请让我在这里添加。
最佳答案
我怀疑 http-proxy 模块是问题所在。如果这会同步处理请求,这可能会导致 javascript 在继续处理队列中的下一个请求之前等待后端响应。我建议改为 https://www.npmjs.com/package/http-proxy-async看看这是否解决了问题。
关于node.js - Node 服务器响应时间意外延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47294693/