我正在调查使用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);
答案 0 :(得分:8)
虽然Node.js非常有效,但它不是多线程的,因此代理节点将处理比目标更多的连接,但只有一个线程,因此成为瓶颈。有两种方法:
答案 1 :(得分:3)
尝试有弹性:https://github.com/substack/bouncy
它针对非常高的性能进行了优化。
答案 2 :(得分:0)
来自http.request docs:
发送'Connection:keep-alive'将通知Node,在下一次请求之前,应该保持与服务器的连接。
所以我敢打赌你的代理会在每个请求中重新连接到target-instance,这是非常低效的。我认为你的选项变量应该像这样加速它:
var opts {
host: 'target-instance',
port: 80,
path: '/',
headers: {
"Connection": "keep-alive"
}
};
答案 3 :(得分:0)
添加连接后:keep-alive header,你应该使用keep-alive(-k选项)进行测试:
ab -c 100 -n 10000 -k http://xxxx/