Nodejs Обратный Производительности Прокси-Сервера

Я изучаю возможность использования Node в качестве обратного прокси-сервера. Одна из основных целей моего проекта-это очень высокая производительность. Поэтому я настроил сервер узлов для прокси-запросов к целевому серверу узлов, который будет отвечать "hello world" независимо от запроса.

используя Apache Bench я сделал некоторое сравнение по количеству обработанных запросов в секунду. Прокси, цель и вызывающий абонент находятся на отдельных больших экземплярах M1 в AWS. Мой результаты разочаровывают и сбивают с толку.

прямой от вызывающего абонента к цели:

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

= ~2600 запросов в секунду!--4-->

от вызывающего абонента через прокси до цели

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

= ~1100 запросов в секунду!--4-->

используя lighttpd, я смог получить ~3500 запросов в секунду на прокси и target

Я разочарован тем, что прокси-сервер менее эффективен, чем целевой сервер. Если сравнивать другие продукты, такой как lighttpd я видел прокси достичь сопоставимых результатов с целью, поэтому я смущен, когда узел (должен быть быстрым) не достигает того же самого.

вот мой прокси-код в узле 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);

4 ответов


В То Время Как Узел.js очень эффективен, он не многопоточен, поэтому прокси-узел будет обрабатывать больше соединений, чем цель, но только с одним потоком и, следовательно, станет узким местом. Есть два способа обойти это:

  1. используйте многопоточный балансировщик нагрузки перед несколькими экземплярами прокси-сервера узла (например, nginx).
  2. измените прокси-сервер узла для использования несколько процессов. Для этого существует несколько модулей узлов, но узел теперь включает в себя "кластер" из коробки и кажется мне самым простым методом.

попробуйте bouncy:https://github.com/substack/bouncy

Он был оптимизирован для очень высокой производительности.


из http.запрос документов:

отправка 'Connection: keep-alive' уведомит узел, что соединение с сервером должно быть сохранено до следующего запроса.

поэтому я уверен, что ваш прокси повторно подключается к целевому экземпляру с каждым запросом, что очень неэффективно. Я думаю, что ваша переменная опций должна выглядеть так, чтобы ускорить ее:

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

после добавления соединения: keep-alive заголовок, вы должны проверить с keep-alive (- K опция) также:

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