Почему я должен использовать Restify?
У меня было требование создать API REST в node.js и искал более легкую структуру, чем express.js, которая, вероятно, избегает нежелательных функций и будет действовать как настраиваемая инфраструктура для построения REST API. Для одного и того же случая рекомендуется пересмотреть его введение.
Чтение Зачем использовать restify и не выражать? казалось, что restify - хороший выбор.
Но неожиданность пришла, когда я опробовал оба с нагрузкой.
Я сделал образец REST API для Reify и затопил его 1000 запросов в секунду. Удивите меня, что маршрут начал не реагировать через некоторое время. То же самое приложение, построенное на express.js, обработало все.
В настоящее время я применяю загрузку к API через
var FnPush = setInterval(function() {
for(i=0;i<1000;i++)
SendMsg(makeMsg(i));
}, 1000);
function SendMsg(msg) {
var post_data = querystring.stringify(msg);
var post_options = {
host: target.host,
port: target.port,
path: target.path,
agent: false,
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': post_data.length,
"connection": "close"
}
};
var post_req = http.request(post_options, function(res) {});
post_req.write(post_data);
post_req.on('error', function(e) {
});
post_req.end();
}
Есть ли у меня результаты, кажущиеся мне разумными? И если это так выразительно более эффективно, чем рестифицировать в этом сценарии? Или есть какая-либо ошибка в том, как я их протестировал?
обновлено в ответ на комментарии
поведение восстановления
-
при загрузке с нагрузкой более 1000 req.s он прекратил обработку всего за 1 секунду до 1015 req.s, а затем ничего не делал. то есть. счетчик i, реализованный для подсчета входящих запросов, остановил приращение после 1015.
-
при подаче с нагрузкой, равной 100 reqs. в секунду он получил до 1015 и после этого не реагировал.
Ответы
Ответ 1
В этом blog было проведено сравнение между PerfectAPI
и Express.js
и Restify.js
, и результатом было то, что Express
было лучше, чем Restify
для большого количества запросов, поэтому я сделал простой тест , используя текущие версии Express и Restify
Здесь код для проверки экспресс:
var express = require('express');
var app = express();
app.get('/hello/:name', function(req, res){
res.send('hello ' + req.params.name);
});
app.listen(3000);
console.log('Listening on port 3000');
и здесь код для Restify
:
var restify = require('restify');
var server = restify.createServer();
server.get('/hello/:name', function(req, res, next) {
res.send('hello ' + req.params.name);
});
server.listen(3000, function() {
console.log('Listening on port 3000');
});
Я использовал ApacheBench для тестирования, и это простой пример, чтобы использовать его.
Вы можете установить его с помощью sudo apt-get install apache2-utils
то вы можете запустить эту команду, чтобы протестировать ab -n 10000 -c 100 http://127.0.0.1:3000/
. Это ударит по серверу с 10000 запросами, с concurrency из 100.
Результаты для Restify
Server Hostname: 127.0.0.1
Server Port: 3000
Document Path: /hello/mark
Document Length: 12 bytes
Concurrency Level: 100
Time taken for tests: 2.443 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 1390000 bytes
HTML transferred: 120000 bytes
Requests per second: 4092.53 [#/sec] (mean)
Time per request: 24.435 [ms] (mean)
Time per request: 0.244 [ms] (mean, across all concurrent requests)
Transfer rate: 555.53 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.5 0 8
Processing: 5 24 4.5 23 40
Waiting: 5 24 4.5 23 40
Total: 12 24 4.5 23 40
и для Express
:
Server Hostname: 127.0.0.1
Server Port: 3000
Document Path: /hello/mark
Document Length: 10 bytes
Concurrency Level: 100
Time taken for tests: 2.254 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 1890000 bytes
HTML transferred: 100000 bytes
Requests per second: 4436.76 [#/sec] (mean)
Time per request: 22.539 [ms] (mean)
Time per request: 0.225 [ms] (mean, across all concurrent requests)
Transfer rate: 818.89 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.5 0 7
Processing: 17 22 4.7 21 55
Waiting: 16 22 4.7 21 55
Total: 18 22 4.9 21 58
Из сравнения видно, что Express
быстрее, чем Restify
, но Restify
не блокирует и не отвечает на все запросы.
Любой может попробовать этот тест, и вы можете изменить количество запросов и количество одновременных запросов, чтобы увидеть эффект на обоих.
Ответ 2
Исправление: эта информация сейчас неверна, продолжайте прокручивать!
В сценарии возникла проблема, из-за которой тест Restify проводился по непредусмотренному маршруту. Это привело к поддержанию соединения в активном состоянии, что привело к повышению производительности из-за уменьшения накладных расходов.
Это 2015 год, и я думаю, что ситуация сильно изменилась с тех пор. Raygun.io опубликовал недавний тест сравнения хапи, экспресс и рестайтинг.
Это говорит:
Мы также определили, что Restify поддерживает живые соединения, что устраняет накладные расходы на создание соединения каждый раз при получении вызова от одного и того же клиента. Чтобы быть справедливым, мы также протестировали Restify с флагом конфигурации закрытия соединения. Вы увидите существенное снижение пропускной способности в этом сценарии по очевидным причинам.
![Benchmark image from Raygun.io]()
Похоже, что Restify является победителем здесь для облегчения развертывания услуг. Особенно, если вы создаете сервис, который получает много запросов от одних и тех же клиентов и хочет быстро двигаться. Вы, конечно, получаете гораздо больше денег, чем голый Node, поскольку у вас есть такие функции, как поддержка DTrace.
Ответ 3
Это 2017 год и последний тест производительности Raygun.io, сравнивающий hapi, express, restify и Koa.
Это показывает, что Koa работает быстрее, чем другие фреймворки, но поскольку этот вопрос касается экспрессии и восстановления, то экспресс быстрее, чем восстановление.
И это написано в посте
Это показывает, что действительно Restify медленнее, чем сообщалось в моем первоначальном тесте.
![enter image description here]()
Ответ 4
В соответствии с Node Описание нокаута:
restify - это модуль node.js, созданный для создания веб-служб REST в node. restify делает много трудных проблем при построении такой службы, такой как управление версиями, обработка ошибок и согласование контента. Он также предлагает встроенные в DTrace зонды, которые вы можете бесплатно узнать, где проблемы с производительностью приложений. Наконец, он обеспечивает надежный клиентский API, который обрабатывает повторную попытку/отключение для вас при неудачных соединениях, а также некоторые другие тонкости.
Возможно, проблемы с производительностью и ошибки могут быть исправлены. Возможно, это описание будет адекватной мотивацией.
Ответ 5
Я столкнулся с подобной проблемой, сравнивая несколько фреймворков OS X с помощью ab. Некоторые из штабов умерли последовательно после 1000-го запроса.
Я превзошел предел значительно, и проблема исчезла.
Вы можете проверить, что ваш файл maxfiles имеет ulimit, (или рейтинг запуска < OS X) и посмотреть, что такое максимум.
Надеюсь, что это поможет.
Ответ 6
i был смущен выражением или регенерированием или совершенством API. даже пытались разработать модуль во всех них. главным требованием было сделать RESTapi. но, наконец, закончил с экспресс-тестированием себя с запросом в секунду, сделанным на всей структуре, экспресс дал лучший результат, чем другие. Хотя в некоторых случаях восстанавливать затмения, выражать, но выражать швы, чтобы выиграть гонку. Я палец вверх для выражения. И да, я также столкнулся с локомотивом js, некоторые MVC-структуры строятся поверх курьерской. Если кто-то ищет полное приложение MVC с помощью экспресс и нефрита, пойдите для локомотива.
Ответ 7
Я получил эти результаты, запустив: ab -n 100000 http://127.0.0.1:3000/
![Restify]()
![ExpressJS]()