Зачем мне использовать Restify?

У меня было требование создать REST API в node.js, и я искал более легкий фреймворк, чем express.js, который, вероятно, избегал бы нежелательных функций и действовал бы как специально созданный фреймворк для создания REST API. Restify from its intro рекомендуется для того же случая.

Прочитав Почему использовать restify, а не express? показалось, что restify - хороший выбор.

Но сюрприз пришел, когда я опробовал оба с нагрузкой.

Я сделал образец REST API на Restify и залил его 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();
}

Кажутся ли мне разумными полученные результаты? И если да, то в этом сценарии экспресс более эффективен, чем restify? Или есть какая-то ошибка в том, как я их тестировал?

обновлено в ответ на комментарии

поведение restify

  1. при загрузке более 1000 запросов он прекращал обработку всего за 1 секунду, получая до 1015 запросов, а затем ничего не делая. т.е. счетчик, который я реализовал для подсчета входящих запросов, прекратил приращение после 1015.

  2. при кормлении с нагрузкой даже 100 треб. в секунду он получил до 1015 и после этого перестал отвечать.


person Mithun Satheesh    schedule 11.07.2013    source источник
comment
Возможно, что restify где-то блокируется при анализе маршрутов или данных запроса, и делает это неэффективно, что приводит к резким скачкам времени отклика при высокой нагрузке. Express.js легкий, но богатый по функциональности. То, как он сделан, по-прежнему делает его легким, потому что неиспользуемые функции не сильно влияют на общую производительность. Также он в хорошем состоянии и используется крупными компаниями, один из примеров: MySpace. Я не вижу никаких недостатков использования Express.js для REST API (я действительно так и делал), это фактически позволяет вам в будущем улучшить ваш API, поскольку там есть функциональность.   -  person moka    schedule 11.07.2013
comment
@Munim: спасибо за графики. но на странице написано обратите внимание, что эта диаграмма устарела, так как проблемы с производительностью Restify были решены .. Но похоже, что ничего не решено. !!   -  person Mithun Satheesh    schedule 11.07.2013
comment
@mithunsatheesh Я тоже это заметил. Но поскольку автор не проводил свежих исследований, я отнесся к этому с недоверием. Проблема на github по-прежнему вызывает жалобы на производительность.   -  person Munim    schedule 11.07.2013
comment
Можете ли вы дать еще (обновить) образец кода?   -  person Adrian Heine    schedule 28.07.2013
comment
@AdrianLang вы имеете в виду код приложения restify rest? у него нет ничего, кроме почтового маршрута, который увеличивает глобальный счетчик с новыми входящими запросами. Та же самая реплика, сделанная в экспрессе.   -  person Mithun Satheesh    schedule 28.07.2013
comment
А как себя ведет сервер, когда перестает работать?   -  person Adrian Heine    schedule 28.07.2013
comment
@AdrianLang: обновил мой вопрос. Извините за задержку. я был вдали от своей системы.   -  person Mithun Satheesh    schedule 29.07.2013
comment
Это только я и мое незнание restify, или эта функция SendMsg выглядит так, будто у нее подозрительно мало обратных вызовов? Действительно ли все эти операции POST-запроса должны быть синхронными вызовами?   -  person hyde    schedule 22.10.2013
comment
@hyde: если я сделал 1000 запросов HTTP один за другим в течение секунды, это имеет значение? Я не понял твою точку зрения.   -  person Mithun Satheesh    schedule 22.10.2013


Ответы (6)


Исправление: теперь эта информация неверна, продолжайте прокручивать!

возникла проблема со сценарием, из-за которой тест Restify проводился по непредусмотренному маршруту. Это привело к тому, что соединение оставалось активным, что привело к повышению производительности из-за снижения накладных расходов.


Это 2015 год, и я думаю, что с тех пор ситуация сильно изменилась. Raygun.io опубликовал недавний тест, сравнивающий hapi, express и обновите.

Он говорит:

Мы также определили, что Restify поддерживает соединения, что устраняет накладные расходы на создание соединения каждый раз при вызове от одного и того же клиента. Честно говоря, мы также протестировали Restify с флагом конфигурации закрытия соединения. По очевидным причинам в этом сценарии вы увидите существенное снижение пропускной способности.

Контрольное изображение из Raygun.io

Похоже, что Restify является победителем в плане упрощения развертывания сервисов. Особенно, если вы создаете сервис, который получает множество запросов от одних и тех же клиентов и хочет быстро двигаться вперед. Вы, конечно, получите гораздо больше отдачи, чем голый Node, поскольку у вас есть такие функции, как поддержка DTrace.

person Masum    schedule 17.03.2015
comment
сообщение в блоге, о котором вы упоминаете, будет полезно, если автор более подробно расскажет о процессе тестирования, которому он следил. Смотрите комментарии под постом! - person Mithun Satheesh; 17.03.2015
comment
Да, это правда, так как бенчмаркинг сложно провести правильно, было бы здорово, если бы автор опубликовал процесс и коды. Поэтому я воспринял это как недовольство и хотел поделиться с сообществом. - person Masum; 17.03.2015
comment
Согласно документации Restify, он также поддерживает DTrace. mcavage.me/node-restify/#dtrace - person Jeff Fairley; 14.04.2015
comment
Также см. тест производительности Raygun.io 2016 - person Shane Holloway; 17.11.2016
comment
Пожалуйста, обратите внимание на Дополнение к той же статье, упомянутой перед тем, как делать выводы. - person Vignesh T.V.; 08.01.2017
comment
Это уже не актуально. Там тест 2016 года, связанный с @ShaneHolloway, и Restify показали худшие результаты (просто дойдите до конца статьи, автор допустил ошибку во время тестов, из-за чего Restify появился быстрее). Вот фактические результаты за 2016 г. raygun.com/blog/wp- content / uploads / 2016/06 / blogpostamend.png - person Maciej Krawczyk; 13.07.2017

Это 2017 и последний тест производительности, проведенный Raygun.io, сравнивающий hapi, express, restify и Koa.

Это показывает, что Koa быстрее, чем другие фреймворки, но поскольку этот вопрос касается экспресс-обновления и повторного обновления, Express быстрее, чем restify.

И это написано в сообщении

Это показывает, что действительно Restify работает медленнее, чем было указано в моем первоначальном тесте.

 введите описание изображения здесь

person Puneet Singh    schedule 16.02.2017

Согласно описанию нокаута узла:

restify - это модуль node.js, специально созданный для создания веб-сервисов REST в Node. restify упрощает многие сложные проблемы создания такой службы, такие как управление версиями, обработка ошибок и согласование содержимого. Он также предоставляет встроенные зонды DTrace, которые вы получаете бесплатно, чтобы быстро определить, в чем заключаются проблемы с производительностью вашего приложения. Наконец, он предоставляет надежный клиентский API, который обрабатывает повторные попытки / откат при неудачных подключениях, а также некоторые другие тонкости.

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

person Eric Elliott    schedule 21.10.2013

Я столкнулся с аналогичной проблемой при тестировании нескольких фреймворков на OS X через ab. Некоторые из стеков постоянно умирали после примерно 1000-го запроса.

Я значительно превысил лимит, и проблема исчезла.

Вы можете проверить максимальное количество файлов с помощью ulimit (или launchctl limit ‹только для OS X) и посмотреть, каков максимальный размер.

Надеюсь, это поможет.

person craigwaterman    schedule 14.08.2013
comment
Хм ... похоже, это может быть похоже на проблему connect.bodyParser (), где каждое соединение открывает временные файлы в локальной файловой системе? - person Eric Elliott; 22.10.2013
comment
ОС обычно имеют настраиваемые ограничения на количество дескрипторов файлов, которые процесс, поток и / или ОС могут обрабатывать одновременно. Для Linux: stackoverflow.com/questions/760819/ Для MacOS X: stackoverflow.com/questions/7578594/ - person AndreasPizsa; 23.03.2014

меня смущали экспресс, restify или perfectAPI. даже пробовал разработать модуль во всех из них. основным требованием было сделать RESTapi. но, в конце концов, закончил с экспрессом, проверил себя с запросом в секунду, сделанным на всех фреймворках, экспресс дал лучший результат, чем другие. Хотя в некоторых случаях Restify затмевает экспресс, но выражает швы, чтобы выиграть гонку. Я ставлю палец вверх за экспресс. И да, я также наткнулся на locomotive js, некоторую платформу MVC, построенную поверх Express. Если кто-то ищет полное приложение MVC, используя экспресс и нефрит, выбирайте локомотив.

person kushvarma    schedule 04.11.2013

В 2021 году тестирование проведено Fastify (https://www.fastify.io/benchmarks/) означает, что Restify теперь работает немного быстрее, чем Express.

Код, используемый для запуска теста, можно найти здесь https://github.com/fastify/benchmarks/.

краткое описание того, как накладные расходы fastify работают по сравнению с некоторыми другими хорошо известными веб-фреймворками Node.js

person Nick Sinai    schedule 24.01.2021