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的,所以代理节点将会处理比目标更多的连接,但只有一个线程,因此成为瓶颈。 有两种方法:
- 在节点代理的多个实例(例如nginx)之前使用multithreading负载平衡器。
- 将您的节点代理更改为使用多个进程 。 有多个节点模块可以做到这一点,但节点现在包含了“ 集群 ”,看起来是最简单的方法。
尝试充气: 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 /