使用Node.js + Express 2“代理”大量HTTP请求

时间:2012-11-02 13:49:20

标签: node.js http proxy express

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

  1. 解密POST有效负载并根据结果向服务器发出HTTP请求;
  2. 加密来自服务器的回复并将其发送回客户端。
  3. 加密相关部分工作正常。我面临的问题是超时。代理应该在不到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个请求。但是多次调用路由处理程序。

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

2 个答案:

答案 0 :(得分:2)

超时是由使用http.globalAgent引起的,默认情况下up to 5会将{{3}}个并发请求处理到一个host:port(在我的情况下这还不够)。

ab发送了请求(而不是数十个)的请求(在OS X下由Wireshark批准的事实;我无法在Parallels内的Ubuntu下重现这一点。)

答案 1 :(得分:1)

您可以查看node-http-proxy模块以及它如何处理连接。确保您没有缓冲任何数据,一切都按streaming工作。你应该试着看看那些长期请求的时间在哪里。尝试使用conosle.timeconsole.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)。