Nodejs反向代理性能

我正在研究使用Node作为反向代理的可能性。 我的项目的主要目标之一是它是非常高的性能。 所以我已经设置了一个节点服务器来代理请求到目标节点服务器,无论请求会以“hello world”响应。

使用Apache Bench我已经对每秒处理的请求数做了一些比较。 代理,目标和调用者分别位于AWS的单独M1大型实例中。 我的结果令人沮丧和困惑。

直接从调用者到目标:

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非常高效,但它不是multithreading的,所以代理节点将会处理比目标更多的连接,但只有一个线程,因此成为瓶颈。 有两种方法:

  1. 在节点代理的多个实例(例如nginx)之前使用multithreading负载平衡器。
  2. 将您的节点代理更改为使用多个进程 。 有多个节点模块可以做到这一点,但节点现在包含了“ 集群 ”,看起来是最简单的方法。

尝试充气: https : //github.com/substack/bouncy

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

从http.request文档:

发送一个'Connection:keep-alive'会通知Node,连接到服务器应该持续到下一个请求。

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

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

添加connection:keep-alive头后,还应该用keep-alive(-k选项)进行testing:

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