Почему я должен использовать 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