【问题标题】:Nodejs Reverse Proxy PerformanceNodejs 反向代理性能
【发布时间】:2011-11-01 19:39:02
【问题描述】:

我正在研究使用 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);

【问题讨论】:

  • 为什么我认为我需要什么?我正在研究构建代理产品并尝试选择最佳基础技术。

标签: http node.js lighttpd reverse-proxy


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 不了解性能,是这样吗? API 使用起来非常简单,我认为它是代理的“幼稚方法”。
    【解决方案3】:

    来自 http.request 文档:

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

    所以我敢打赌,您的代理每次请求都会重新连接到目标实例,这是非常低效的。我认为您的 options 变量应该如下所示以加快速度:

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

    【讨论】:

    • 这似乎没有帮助。 Node 文档还提到它默认使用 Connection: keep-alive。事实上,在不将其添加到 opts 的情况下,我可以获得更好的性能。
    【解决方案4】:

    添加 connection: keep-alive 标头后,您还应该使用 keep-alive(-k 选项)进行测试:

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

    【讨论】:

    • 这极大地加快了直接向目标发送请求的数量,大约提高了 6k/秒,但对代理没有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 2015-06-20
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多