繁体   English   中英

Nodejs反向代理性能

[英]Nodejs Reverse Proxy Performance

我正在调查使用Node充当反向代理的可能性。 我的项目的主要目标之一是它具有非常高的性能。 所以我设置了一个节点服务器来代理对目标节点服务器的请求,无论请求是什么,它都会响应'hello world'。

使用Apache Bench我已经对每秒处理的请求数进行了一些比较。 代理,目标和调用者都在AWS中的单独M1 Large实例上。 我的结果令人沮丧和困惑。

从呼叫者直接到目标:

ab -c 100 -n 10000 http://target-instance/

= ~2600请求/秒

从呼叫者到代理到目标

ab -c 100 -n 10000 http://proxy-instance/

= ~1100个请求/秒

使用lighttpd我能够在代理和目标上获得~3500请求/秒

我很失望代理服务器的性能低于目标服务器。 当比较像lighttpd这样的其他产品时,我看到代理实现了与目标相当的结果,所以我很困惑Node(假设快速闪电)没有达到相同的效果。

这是我在Node v0.5.9中的代理代码:我错过了什么吗?

var server =
http.createServer(function(req, res){
    var opts = { host: 'target-instance',
                 port: 80,
                 path: '/',
                 method: 'GET'};
    var proxyRequest = http.get(opts, function(response){
            response.on('data', function(chunk){
                    res.write(chunk);
            });
            response.on('end', function(){
                    res.end()
            });
    });
});
server.listen(80);

虽然Node.js非常高效,但它不是多线程的,因此代理节点将处理比目标更多的连接,但只有一个线程,因此成为瓶颈。 有两种方法:

  1. 在节点代理的多个实例(例如nginx)前面使用多线程负载均衡器。
  2. 更改节点代理以使用多个进程 有多个节点模块可以执行此操作,但节点现在包含开箱即用的“ 群集 ”,在我看来是最简单的方法。

尝试弹性: https//github.com/substack/bouncy

它针对非常高的性能进行了优化。

来自http.request文档:

发送'Connection:keep-alive'将通知Node,应该保持与服务器的连接,直到下一个请求为止。

所以我敢打赌你的代理用每个请求重新连接到目标实例,这是非常低效的。 我认为你的选项变量应该像这样加速它:

var opts  {
    host: 'target-instance',
    port: 80,
    path: '/',
    headers: {
        "Connection": "keep-alive"
    }
};

添加连接后:keep-alive header,你应该使用keep-alive(-k选项)进行测试:

ab -c 100 -n 10000 -k http:// xxxx /

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM