使用Node.js + Express 2“代理”很多HTTP请求
我在Node.js + Express中编写代理2.代理应该:
- 根据结果解密POST有效载荷并向服务器发出HTTP请求;
- 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.time
和console.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下复制)。