Warum sollte ich Restify verwenden?

101

Ich musste eine REST-API in node.js erstellen und suchte nach einem leichteren Framework als express.js, das wahrscheinlich die unerwünschten Funktionen vermeidet und sich wie ein benutzerdefiniertes Framework zum Erstellen von REST-APIs verhält. Für denselben Fall wird empfohlen, das Intro zu wiederholen.

Lesen Warum restify verwenden und nicht ausdrücken? schien zu restifizieren ist eine gute Wahl.

Aber die Überraschung kam, als ich beide mit einer Ladung ausprobierte.

Ich habe eine Beispiel-REST-API für Restify erstellt und sie mit 1000 Anforderungen pro Sekunde überflutet. Überraschung für mich, dass die Route nach einer Weile nicht mehr reagierte. Die gleiche App, die auf express.js basiert, hat alle erledigt.

Ich wende derzeit die Last auf API über an

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

Sind die Ergebnisse, die ich erzielt habe, vernünftig? Und wenn ja, ist Express in diesem Szenario effizienter als Restify? Oder gibt es einen Fehler in der Art, wie ich sie getestet habe?

als Antwort auf Kommentare aktualisiert

Verhalten von restify

  1. Wenn es mit einer Last von mehr als 1000 Anforderungen gespeist wurde, stoppte es die Verarbeitung in nur 1 Sekunde, erhielt bis 1015 Anforderungen und tat dann nichts. dh. Der Zähler, den ich zum Zählen eingehender Anforderungen implementiert habe, stoppte das Inkrement nach 1015.

  2. wenn mit einer Last von sogar 100 reqs gespeist. pro Sekunde erhielt es bis 1015 und reagierte danach nicht mehr.

mithunsatheesh
quelle
3
Haben Sie dies durchlaufen: blog.perfectapi.com/2012/… ? Wenn Sie auf Google suchen, werden Sie viele Leute hören, die Zweifel an der Leistung haben.
Munim
3
Es ist möglich, dass irgendwo beim Blockieren von Routen oder beim Anfordern von Daten ein Restify blockiert wird, und dies nicht effizient, was zu Spitzen in den Antwortzeiten mit hoher Last führt. Express.js ist leicht, aber reich an Funktionen. Die Art und Weise, wie es hergestellt wird, macht es immer noch leicht, da nicht verwendete Funktionen keinen großen Einfluss auf die Gesamtleistung haben. Es wird auch gut gepflegt und von großen Unternehmen verwendet, eines der Beispiele: MySpace. Ich kann keine Nachteile bei der Verwendung von Express.js für die REST-API erkennen (genau das habe ich tatsächlich getan). Dadurch können Sie Ihre API in Zukunft tatsächlich verbessern, da die Funktionalität vorhanden ist.
Moka
1
@ Munim: Danke für die Grafiken. Auf der Seite steht jedoch " Hinweis, dieses Diagramm ist veraltet, da die Leistungsprobleme bei Restify behoben wurden ". Es scheint jedoch, dass nichts behoben wurde. !!
Mithunsatheesh
1
@mithunsatheesh Ich habe die auch bemerkt. Aber da der Autor keine neuen Studien durchführte, nahm ich es mit einer Prise Salz. Das Problem bei Github hat immer noch Leute, die sich über die Leistung beschweren.
Munim
2
Können Sie mehr (Restify) Beispielcode geben?
Adrian Heine

Antworten:

50

Berichtigung : Diese Information ist jetzt falsch, scrollen Sie weiter!

Es gab ein Problem mit dem Skript, das dazu führte, dass der Restify-Test auf einer unbeabsichtigten Route durchgeführt wurde. Dies führte dazu, dass die Verbindung am Leben blieb und die Leistung aufgrund des geringeren Overheads verbessert wurde.


Dies ist 2015 und ich denke, die Situation hat sich seitdem sehr verändert. Raygun.io hat kürzlich einen Benchmark veröffentlicht, in dem Hapi, Express und Restify verglichen werden .

Es sagt:

Wir haben auch festgestellt, dass Restify Verbindungen am Leben erhält, wodurch der Aufwand für das Erstellen einer Verbindung jedes Mal, wenn Sie vom selben Client aufgerufen werden, entfällt. Um fair zu sein, haben wir Restify auch mit dem Konfigurationsflag zum Schließen der Verbindung getestet. In diesem Szenario wird der Durchsatz aus offensichtlichen Gründen erheblich sinken.

Benchmark-Bild von Raygun.io

Anscheinend ist Restify hier ein Gewinner für einfachere Servicebereitstellungen. Vor allem, wenn Sie einen Service erstellen, der viele Anfragen von denselben Kunden erhält und schnell umziehen möchte. Sie bekommen natürlich viel mehr Geld als nackte Node, da Sie Funktionen wie DTrace-Unterstützung eingebaut haben.

Masum
quelle
1
Der von Ihnen erwähnte Blog-Beitrag ist nützlich, wenn der Autor detailliertere Angaben zum Testprozess macht, den er befolgt hat. Siehe die Kommentare unter dem Beitrag!
Mithunsatheesh
1
Ja, das stimmt, da Benchmarking schwer korrekt durchzuführen ist, wäre es großartig, wenn der Autor den Prozess und die Codes veröffentlichen würde. Also nahm ich das als ein Körnchen Salz und wollte es mit der Gemeinde teilen.
Masum
Laut den Restify-Dokumenten unterstützt es auch DTrace. mcavage.me/node-restify/#dtrace
Jeff Fairley
1
Siehe auch den Raygun.io Leistungstest 2016
Shane Holloway
3
Bitte beachten Sie das Addendum im selben Artikel, bevor Sie zu Schlussfolgerungen gelangen.
Vignesh TV
26

Dies ist 2017 und der neueste Leistungstest von Raygun.io , bei dem Hapi, Express, Restify und Koa verglichen werden.

Es zeigt, dass Koa schneller ist als andere Frameworks, aber da es bei dieser Frage um Express und Restify geht, ist Express schneller als Restify.

Und es steht in der Post

Dies zeigt, dass Restify tatsächlich langsamer ist als in meinem ersten Test angegeben.

Geben Sie hier die Bildbeschreibung ein

Puneet Singh
quelle
11

Gemäß der Node Knockout-Beschreibung :

restify ist ein Modul von node.js, das zum Erstellen von REST-Webdiensten in Node entwickelt wurde. restify erleichtert viele der schwierigen Probleme beim Aufbau eines solchen Dienstes wie Versionierung, Fehlerbehandlung und Aushandlung von Inhalten. Es bietet auch integrierte DTrace-Sonden, mit denen Sie kostenlos schnell herausfinden können, wo die Leistungsprobleme Ihrer Anwendung liegen. Schließlich bietet es eine robuste Client-API, die zusammen mit einigen anderen Besonderheiten das Wiederholen / Zurücksetzen bei fehlgeschlagenen Verbindungen für Sie übernimmt.

Leistungsprobleme und Fehler können wahrscheinlich behoben werden. Vielleicht ist diese Beschreibung eine angemessene Motivation.

Eric Elliott
quelle
5

Ich stieß auf ein ähnliches Problem beim Benchmarking mehrerer Frameworks unter OS X über ab. Einige der Stapel starben nach etwa der 1000. Anfrage durchweg.

Ich habe das Limit deutlich überschritten und das Problem ist verschwunden.

Sie können mit ulimit (oder launchctl limit <nur OS X) überprüfen, ob sich Ihre Maxfiles befinden , und sehen, wie hoch das Maximum ist.

Hoffentlich hilft das.

Craigwaterman
quelle
Hmm .. klingt so, als ob es dem Problem connect.bodyParser () ähnlich sein könnte, bei dem jede Verbindung temporäre Dateien im lokalen Dateisystem öffnet?
Eric Elliott
Betriebssysteme haben normalerweise konfigurierbare Grenzen für die Anzahl der Dateideskriptoren, die ein Prozess, ein Thread und / oder das Betriebssystem gleichzeitig verarbeiten können. Für Linux: stackoverflow.com/questions/760819/… Für MacOS X: stackoverflow.com/questions/7578594/…
AndreasPizsa
2

Ich war verwechselt mit Express oder Restify oder PerfectAPI. Ich habe sogar versucht, in allen ein Modul zu entwickeln. Die Hauptanforderung war die Erstellung eines RESTapi. aber schließlich endete mit Express, testete mich selbst mit der Anfrage pro Sekunde, die auf allen Rahmen gestellt wurde, der Express gab bessere Ergebnisse als andere. Obwohl in einigen Fällen Outshines Express, aber Express-Nähte neu formuliert werden, um das Rennen zu gewinnen. Ich Daumen hoch für Express. Und ja, ich bin auch auf Lokomotiven gestoßen, einige MVC-Frameworks, die auf Express aufbauen. Wenn Sie nach einer vollständigen MVC-App mit Express und Jade suchen, entscheiden Sie sich für eine Lokomotive.

Kushvarma
quelle