使用Node.js + Express 2“代理”很多HTTP请求

我在Node.js + Express中编写代理2.代理应该:

  1. 根据结果​​解密POST有效载荷并向服务器发出HTTP请求;
  2. encryption来自服务器的回复并将其发送回客户端。

与encryption相关的部分工作正常。 我面临的问题是超时。 代理服务器应该在15秒内处理请求。 其中大部分实际上都在500毫秒以下。

当我增加并行请求的数量时出现问题。 大部分请求都可以正常完成,但有些在15秒+几毫秒之后失败。 ab -n5000 -c300可以正常工作,但并发度为500时,会出现一些超时的请求。

我只能推测,但似乎问题是callbackexectuion的顺序。 是否有可能首先发出的请求挂起,直到ETIMEDOUT为止,因为节点的焦点在最新的请求中,这些请求仍在500ms ETIMEDOUT处理。

PS:远程服务器没有问题。 我正在使用请求与它进行交互。

UPD

事情的方式与一些代码的方式:

 function queryRemote(req, res) { var options = {}; // built based on req object (URI, body, authorization, etc.) request(options, function(err, httpResponse, body) { return err ? send500(req, res) : res.end(encrypt(body)); }); } app.use(myBodyParser); // reads hex string in payload // and calls next() on 'end' event app.post('/', [checkHeaders, // check Content-Type and Authorization headers authUser, // query DB and call next() parseRequest], // decrypt payload, parse JSON, call next() function(req, res) { req.socket.setTimeout(TIMEOUT); queryRemote(req, res); }); 

我的问题如下:在发布的时候,比如20个POST到/ ,表示路由处理器被调用了几千次。 这并不总是发生,有时20个,只有20个请求被及时处理。

当然, ab不是问题。 我100%确定只有20个请求由ab发送。 但是路由处理程序被多次调用。

我找不到这种行为的原因,有什么build议?

您可以看看node-http-proxy模块以及它如何处理连接。 确保你不要缓冲任何数据,一切工作通过stream 。 而且你应该看看这些长时间的请求花在哪里。 尝试使用conosle.timeconsole.timeEnd代码的部分内容,然后查看占用最多时间的位置。 如果时间大部分用在JavaScript上,你应该尝试对它进行分析。 基本上你可以使用v8 profiler,在你的node命令中join–prof选项。 这是一个v8.log ,可以通过node-source-dir / deps / v8 / tools中的v8工具进行处理 。 它只有在你通过scons (scons d8)安装了d8 shell的情况下才有效。 你可以看看这篇文章,以帮助你进一步做到这一点。

您还可以使用使用webkit开发人员工具的node-webkit-agent来显示分析器结果。 你也可以看看我的叉子有一点糖。

如果这不起作用,你可以尝试使用dtrace进行分析 (仅适用于像SmartOS这样基于光线的系统)。

超时是由使用http.globalAgent ,默认情况下,可以处理多达5个并发请求到一个host:port (这是不够的在我的情况)。

大多数请求(而不是数十)是由ab发送的(Wireshark在OS X下批准的事实;我不能在Parallels的Ubuntu下复制)。