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 очень эффективен, он не многопоточен, поэтому прокси-узел будет обрабатывать больше соединений, чем цель, но только с одним потоком и, следовательно, станет узким местом. Есть два способа обойти это:
- используйте многопоточный балансировщик нагрузки перед несколькими экземплярами прокси-сервера узла (например, nginx).
- измените прокси-сервер узла для использования несколько процессов. Для этого существует несколько модулей узлов, но узел теперь включает в себя "кластер" из коробки и кажется мне самым простым методом.
попробуйте 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/