Dlaczego powinienem używać Restify?

101

Miałem wymóg zbudowania REST API w node.js i szukałem lżejszego frameworka niż express.js, który prawdopodobnie unika niechcianych funkcji i będzie działał jak niestandardowy framework do budowania API REST. W tym samym przypadku zalecana jest ponowna wersja z wprowadzenia.

Czytanie Po co używać restify a nie wyrażać? wydawało się, że restify to dobry wybór.

Ale niespodzianka przyszła, gdy wypróbowałem oba z obciążeniem.

Zrobiłem przykładowy REST API na Restify i zalałem go 1000 żądań na sekundę. Zaskoczyło mnie, że trasa po chwili zaczęła nie odpowiadać. Ta sama aplikacja oparta na express.js obsługuje wszystkie pliki.

Obecnie stosuję obciążenie do interfejsu API za pośrednictwem

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();
}

Czy wyniki, które otrzymałem, wydają się rozsądne? A jeśli tak, to czy ekspres jest bardziej wydajny niż ponowna weryfikacja w tym scenariuszu? A może jest jakiś błąd w sposobie ich testowania?

zaktualizowane w odpowiedzi na komentarze

zachowanie restify

  1. gdy był karmiony obciążeniem większym niż 1000 wymagań, przestał przetwarzać w ciągu zaledwie 1 sekundy, odbierając do 1015 wymagań, a następnie nic nie robiąc. to znaczy. licznik, który wdrożyłem do zliczania przychodzących żądań, zatrzymał przyrost po 1015.

  2. przy obciążeniu nawet 100 razy. na sekundę otrzymywał do 1015 i potem przestał odpowiadać.

mithunsatheesh
źródło
3
Czy przeglądałeś to: blog.perfectapi.com/2012/… ? Jeśli będziesz szukać w Google, usłyszysz wiele osób, które mają wątpliwości co do jego wydajności.
Munim,
3
Jest możliwe, że gdzieś ponownie określamy blok podczas analizowania tras lub żądań danych i nie robi tego wydajnie, co prowadzi do skoków czasu odpowiedzi przy dużym obciążeniu. Express.js jest lekki, ale bogaty w funkcje. Sposób wykonania nadal sprawia, że ​​jest lekki, ponieważ niewykorzystana funkcjonalność nie ma większego wpływu na ogólną wydajność. Jest dobrze utrzymany i używany przez duże firmy, jeden z przykładów: MySpace. Nie widzę żadnych wad używania Express.js dla REST API (właściwie to zrobiłem), faktycznie pozwala w przyszłości ulepszyć twoje API, ponieważ jest tam funkcjonalność.
moka,
1
@Munim: dzięki za wykresy. ale na stronie jest napisane „ uwaga, ten wykres jest nieaktualny, ponieważ problemy z wydajnością Restify zostały rozwiązane ” .. Ale wygląda na to, że nic nie zostało rozwiązane. !!
mithunsatheesh
1
@mithunsatheesh Też zauważyłem. Ale ponieważ autor nie przeprowadził nowych badań, wziąłem to ze szczyptą soli. Problem na githubie wciąż powoduje, że ludzie narzekają na wydajność.
Munim,
2
Czy możesz podać więcej (odnowić) przykładowy kod?
Adrian Heine

Odpowiedzi:

50

Sprostowanie : ta informacja jest teraz błędna, przewijaj dalej!

wystąpił problem ze skryptem, który powodował, że test Restify był przeprowadzany na niezamierzonej trasie. Spowodowało to, że połączenie zostało utrzymane, powodując poprawę wydajności ze względu na mniejsze obciążenie.


Jest rok 2015 i myślę, że od tego czasu sytuacja bardzo się zmieniła. Raygun.io opublikował ostatnio test porównujący hapi, express i restify .

To mówi:

Zidentyfikowaliśmy również, że Restify utrzymuje połączenia przy życiu, co eliminuje obciążenie związane z tworzeniem połączenia za każdym razem, gdy dzwoni się z tego samego klienta. Aby być uczciwym, przetestowaliśmy również Restify z flagą konfiguracji zamykającą połączenie. W tym scenariuszu zobaczysz znaczny spadek przepustowości z oczywistych powodów.

Obraz porównawczy z Raygun.io

Wygląda na to, że Restify jest tutaj zwycięzcą, jeśli chodzi o łatwiejsze wdrażanie usług. Zwłaszcza jeśli tworzysz usługę, która otrzymuje wiele zapytań od tych samych klientów i chcesz działać szybko. Oczywiście dostajesz o wiele więcej za dolara niż nagi Node, ponieważ masz wbudowane funkcje takie jak obsługa DTrace.

Masum
źródło
1
wpis na blogu, o którym wspominasz, jest przydatny, jeśli autor ujawni więcej szczegółów dotyczących procesu testowania, który przestrzegał. Zobacz komentarze pod postem!
mithunsatheesh
1
Tak, to prawda, ponieważ benchmarking jest trudny do wykonania poprawnie, byłoby świetnie, gdyby autor opublikował proces i kody. Więc wziąłem to za ziarno soli i chciałem się tym podzielić ze społecznością.
Masum
Zgodnie z dokumentacją Restify obsługuje również DTrace. mcavage.me/node-restify/#dtrace
Jeff Fairley
1
Zobacz także test wydajności Raygun.io 2016
Shane Holloway,
3
Proszę zwrócić uwagę na uzupełnienie w tym samym artykule, o którym wspomniano przed wyciągnięciem wniosków.
Vignesh TV
26

To rok 2017 i najnowszy test wydajnościowy Raygun.io porównujący hapi, express, restify i Koa.

Pokazuje, że Koa jest szybszy niż inne frameworki, ale ponieważ to pytanie dotyczy wyrażania i ponownego określania, Express jest szybszy niż restify.

I jest napisane w poście

To pokazuje, że rzeczywiście Restify jest wolniejszy niż raportowany w moim wstępnym teście.

wprowadź opis obrazu tutaj

Puneet Singh
źródło
11

Zgodnie z opisem Node Knockout :

restify to moduł node.js przeznaczony do tworzenia usług sieciowych REST w Node. restify ułatwia wiele trudnych problemów związanych z budowaniem takiej usługi, takich jak wersjonowanie, obsługa błędów i negocjowanie zawartości. Zawiera również wbudowane sondy DTrace, które można uzyskać bezpłatnie, aby szybko dowiedzieć się, na czym polegają problemy z wydajnością aplikacji. Wreszcie, zapewnia solidne API klienta, które obsługuje ponawianie / wycofywanie w przypadku nieudanych połączeń, a także kilka innych elementów.

Prawdopodobnie można naprawić problemy z wydajnością i błędy. Może ten opis będzie odpowiednią motywacją.

Eric Elliott
źródło
5

Natknąłem się na podobny problem podczas testowania wielu frameworków na OS X przez ab. Niektóre stosy padały konsekwentnie po około tysięcznym żądaniu.

Znacząco przekroczyłem limit i problem zniknął.

Możesz sprawdzić, czy Twoje maxfiles są na poziomie ulimit (lub launchctl limit <tylko OS X) i zobaczyć, jakie jest maksimum.

Mam nadzieję, że to pomoże.

craigwaterman
źródło
Hmm ... brzmi jakby to mogło być podobne do problemu connect.bodyParser (), gdzie każde połączenie otwiera pliki tymczasowe w lokalnym systemie plików?
Eric Elliott
Systemy operacyjne zwykle mają konfigurowalne ograniczenia liczby deskryptorów plików, które proces, wątek i / lub system operacyjny mogą obsługiwać jednocześnie. Linux: stackoverflow.com/questions/760819/ ... MacOS X: stackoverflow.com/questions/7578594/ ...
AndreasPizsa
2

mylono mnie z express, restify lub perfectAPI. próbowałem nawet stworzyć moduł we wszystkich z nich. głównym wymaganiem było wykonanie RESTapi. ale w końcu skończyło się na ekspresie, przetestowałem siebie z żądaniem na sekundę wykonanym na wszystkich frameworkach, ekspres dał lepszy wynik niż inne. Chociaż w niektórych przypadkach ponownie przyćmiewa wyraźne, ale ekspresowe szwy, aby wygrać wyścig. Kciuki w górę za ekspresją. I tak, natknąłem się również na lokomotywę js, jakiś framework MVC oparty na ekspresie. Jeśli ktoś szuka kompletnej aplikacji MVC wykorzystującej express i jade, wybierz lokomotywę.

kushvarma
źródło