我在Node.js + Express中编写代理2.代理应该:
加密相关部分工作正常。我面临的问题是超时。代理应该在不到15秒的时间内处理请求。实际上,大多数都不到500毫秒。
当我增加并行请求数时会出现问题。大多数请求都已完成,但有些请求在15秒+几毫秒后失败。 ab -n5000 -c300
工作正常,但并发度为500时,某些超时请求失败。
我只能推测,但似乎问题是回调exectuion的顺序。是否有可能首先出现的请求会挂起ETIMEDOUT
,因为节点的焦点在于最新的节点仍在500毫秒内及时处理。
P.S。:远程服务器没有问题。我正在使用request与之互动。
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);
});
我的问题如下:当ab
发出时,假设有20个POST到/
,快速路由处理程序被调用了数千次。这并不总是发生,有时20个,只有20个请求得到及时处理。
当然,ab
不是问题。我完全确定ab
只发送了20个请求。但是多次调用路由处理程序。
我找不到这种行为的原因,有什么建议吗?
答案 0 :(得分:2)
超时是由使用http.globalAgent
引起的,默认情况下up to 5会将{{3}}个并发请求处理到一个host:port
(在我的情况下这还不够)。
ab
发送了请求(而不是数十个)的请求(在OS X下由Wireshark批准的事实;我无法在Parallels内的Ubuntu下重现这一点。)
答案 1 :(得分:1)
您可以查看node-http-proxy模块以及它如何处理连接。确保您没有缓冲任何数据,一切都按streaming工作。你应该试着看看那些长期请求的时间在哪里。尝试使用conosle.time
和console.timeEnd
检测代码的一部分,看看哪里花了最多的时间。如果时间大部分花在javascript上,你应该尝试对其进行分析。基本上,您可以通过在node命令中添加--prof选项来使用v8 profiler。这是一个v8.log,可以通过v8 tool found in node-source-dir/deps/v8/tools进行处理。只有通过scons(scons d8)安装了d8 shell后,它才有效。您可以查看this article以帮助您进一步完成此工作。
您还可以使用node-webkit-agent使用webkit开发人员工具来显示分析器结果。您还可以看一下my fork加糖。
如果这不起作用,您可以尝试profiling with dtrace(仅适用于基于illumos的系统,如SmartOS)。