node.js - Node 服务器响应时间意外延迟

标签 node.js web-services https node-http-proxy

问题陈述-

我们在 Internet 客户端和下游服务之间使用路由器。路由器(服务)是用 Node.js 编写的。它的职责是将互联网客户端的请求传递给相应的下游服务,并将响应返回给互联网客户端。我们在路由器级别面临一些延迟。

用于 http-proxy- 的库

https://github.com/nodejitsu/node-http-proxy

Node -http-代理 示例-

用示例进行解释。我们在 99% 的情况下面临问题 -

enter image description here

我们进行了 100 并发的负载/性能测试。

根据结果,直到 95 个百分点,响应时间对互联网客户端来说看起来不错。

但是,在 99 个百分点中,下游​​服务会在预期时间(~250 毫秒)内做出响应。但是路由器花费的时间是预期的 10 倍(~2500 毫秒)。

服务信息-

路由器和下游服务都在同一区域和同一子网中。所以,这个延迟不是因为网络。

这种延迟的可能性-

  1. 一些线程在 Node 服务级别被阻塞。这就是为什么无法收听下游服务响应的原因。
  2. 花更多时间在 DNS 查找上。
  3. 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);

问题-

  1. 我是 Node 服务的新手。如果您能帮助我用正确的值调整上述配置,那就太好了。如果我遗漏了任何配置,请告诉我?
  2. 有没有办法拦截路由器机器上的网络流量,这将有助于我分析上述 10 倍的路由器响应时间延迟?
  3. 如果您知道任何分析工具(网络级别),可以帮助我深入研究,请与我分享?

[更新 1]

找到一个有趣的链接 - war-story .

如果我在这里遗漏了任何必需的信息,请让我在这里添加。

最佳答案

我怀疑 http-proxy 模块是问题所在。如果这会同步处理请求,这可能会导致 javascript 在继续处理队列中的下一个请求之前等待后端响应。我建议改为 https://www.npmjs.com/package/http-proxy-async看看这是否解决了问题。

关于node.js - Node 服务器响应时间意外延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47294693/

相关文章:

web-services - 如何确保 Web 服务从一个版本到下一个版本都保持稳定?

ios - 如何使用 token 化来保护 Facebook 登录的 Web 服务方法?

java - 通过 HTTPS 的简单 Java Web 服务客户端

node.js - ( Node )JS实用函数将lcov文件转换为cobertura XML

node.js - 如何使用 webpack-dev-server 设置 create-react-app

node.js - 与异步系列控制流混淆

node.js - 停止express4中的中间件链

java - 发布 eclipse 创建的 Web 服务需要哪些文件?

http - 在 HTTPS Azure Web 角色上托管 WebAPI,并在 HTTPS Azure CDN 上托管 HTML Javascript?

https - 具有相同 header 的 firefox 和 luasocket 之间的差异