我正在用 Node.js + Express 2 编写代理。代理应该:
- 解密 POST 有效载荷并根据结果向服务器发出 HTTP 请求;
- 加密来自服务器的回复并将其发送回客户端。
与加密相关的部分工作正常。我面临的问题是超时。代理应在 15 秒内处理请求。实际上,它们中的大多数都在 500 毫秒以下。
当我增加并行请求的数量时出现问题。大多数请求都可以正常完成,但有些请求在 15 秒 + 几毫秒后失败。ab -n5000 -c300
工作正常,但在 500 并发时,某些超时请求会失败。
我只能推测,但似乎问题是回调执行的顺序。是否有可能首先出现的请求会一直挂起,直到ETIMEDOUT
因为节点关注最新的请求,这些请求仍在 500 毫秒内及时处理。
PS:远程服务器没有问题。我正在使用请求与它进行交互。
更新
一些代码的工作方式:
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
不是问题。我 100% 确定只有 20 个请求由ab
. 但是路由处理程序被多次调用。
我找不到这种行为的原因,有什么建议吗?