Perché dovrei usare Restify?


101

Avevo il requisito di creare un'API REST in node.js e stavo cercando un framework più leggero di express.js che probabilmente evitasse le funzionalità indesiderate e agisse come un framework personalizzato per la creazione di API REST. Restify dalla sua introduzione è consigliato per lo stesso caso.

Lettura Perché usare restify e non express? sembrava che il restify fosse una buona scelta.

Ma la sorpresa è arrivata quando ho provato entrambi con un carico.

Ho creato un'API REST di esempio su Restify e l'ho riempita con 1000 richieste al secondo. Sorpresa per me il percorso ha iniziato a non rispondere dopo un po '. La stessa app costruita su express.js ha gestito tutto.

Attualmente sto applicando il carico all'API tramite

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

I risultati che ho ottenuto sembrano sensati? E se è così express è più efficiente di restify in questo scenario? O c'è qualche errore nel modo in cui li ho testati?

aggiornato in risposta ai commenti

comportamento di restify

  1. quando alimentato con un carico di oltre 1000 req.s interrompe l'elaborazione in appena 1 secondo ricevendo fino a 1015 req.s e poi non fa nulla. cioè. il contatore che ho implementato per il conteggio delle richieste in arrivo interrotte aumenta dopo 1015.

  2. se alimentato con un carico anche di 100 req. al secondo ha ricevuto fino a 1015 e dopo non ha risposto.


3
Hai passato questo: blog.perfectapi.com/2012/… ? Se cerchi su Google, sentirai molte persone che dubitano delle sue prestazioni.
Munim

3
È possibile che la restificazione di un blocco da qualche parte durante l'analisi delle rotte o della richiesta di dati non lo faccia in modo efficiente, il che porta a picchi nei tempi di risposta con un carico elevato. Express.js è leggero ma ricco di funzionalità. Il modo in cui è fatto, lo rende ancora leggero perché la funzionalità inutilizzata non ha molto impatto sulle prestazioni complessive. Inoltre è ben mantenuto e utilizzato da grandi aziende, uno degli esempi: MySpace. Non riesco a vedere alcuno svantaggio dell'utilizzo di Express.js per l'API REST (in realtà l'ho fatto esattamente), in realtà ti consente in futuro di migliorare la tua API poiché la funzionalità è presente.
moka

1
@Munim: grazie per i grafici. ma la pagina dice " nota, questo grafico non è aggiornato poiché i problemi di prestazioni di Restify sono stati risolti " .. Ma sembra che nulla sia stato risolto. !!
mithunsatheesh

1
@mithunsatheesh ho notato anche quelli. Ma poiché l'autore non ha condotto nuovi studi, l'ho preso con un pizzico di sale. Il problema su GitHub ha ancora persone che si lamentano delle prestazioni.
Munim

2
Puoi fornire più codice di esempio (restify)?
Adrian Heine

Risposte:


50

Rettifica : questa informazione ora è sbagliata, continua a scorrere!

si è verificato un problema con lo script che causava l'esecuzione del test Restify su un percorso non intenzionale. Ciò ha causato il mantenimento della connessione, migliorando le prestazioni a causa del ridotto overhead.


Questo è il 2015 e penso che la situazione sia cambiata molto da allora. Raygun.io ha pubblicato un recente benchmark che confronta hapi, express e restify .

Dice:

Abbiamo anche identificato che Restify mantiene attive le connessioni, il che rimuove il sovraccarico di creare una connessione ogni volta che viene chiamato dallo stesso client. Per essere onesti, abbiamo anche testato Restify con il flag di configurazione di chiusura della connessione. Vedrai una sostanziale diminuzione del throughput in quello scenario per ovvi motivi.

Immagine benchmark da Raygun.io

Sembra che Restify sia un vincitore qui per implementazioni di servizi più semplici. Soprattutto se stai costruendo un servizio che riceve molte richieste dagli stessi clienti e vuoi muoverti rapidamente. Ovviamente ottieni molto più rapporto qualità-prezzo rispetto a Node nudo poiché hai funzionalità come il supporto DTrace integrato.


1
il post del blog che stai citando è utile, se l'autore fornisce maggiori dettagli sul processo di test che ha seguito. Guarda i commenti sotto il post!
mithunsatheesh

1
Sì, è vero, poiché il benchmarking è difficile da eseguire correttamente, sarebbe fantastico se l'autore pubblicasse il processo ei codici. Quindi ho preso questo come un grano di sale e volevo condividerlo con la comunità.
Masum

Secondo i documenti di Restify, supporta anche DTrace. mcavage.me/node-restify/#dtrace
Jeff Fairley


3
Si prega di notare l'Addendum nello stesso articolo menzionato prima di arrivare alle conclusioni.
Vignesh TV

26

Questo è il 2017 e l'ultimo test delle prestazioni di Raygun.io che confronta hapi, express, restify e Koa.

Mostra che Koa è più veloce di altri framework, ma poiché questa domanda riguarda express e restify, Express è più veloce di restify.

Ed è scritto nel post

Ciò dimostra che in effetti Restify è più lento di quanto riportato nel mio test iniziale.

inserisci qui la descrizione dell'immagine


11

Secondo la descrizione del Node Knockout :

restify è un modulo node.js creato appositamente per creare servizi web REST in Node. restify semplifica molti dei problemi difficili della creazione di un servizio di questo tipo, come il controllo delle versioni, la gestione degli errori e la negoziazione dei contenuti. Fornisce inoltre sonde DTrace integrate che puoi ottenere gratuitamente per scoprire rapidamente dove si trovano i problemi di prestazioni della tua applicazione. Infine, fornisce una solida API client che gestisce i tentativi / backoff per te su connessioni non riuscite, insieme ad altre sottigliezze.

Probabilmente i problemi di prestazioni e i bug possono essere risolti. Forse quella descrizione sarà una motivazione adeguata.


5

Mi sono imbattuto in un problema simile nel benchmarking di più framework su OS X tramite ab. Alcuni degli stack sono morti, costantemente, dopo circa la millesima richiesta.

Ho superato il limite in modo significativo e il problema è scomparso.

Puoi controllare che il tuo maxfiles sia a con ulimit , (o launchctl limit <solo OS X) e vedere qual è il massimo.

Spero che aiuti.


Hmm .. sembra che potrebbe essere simile al problema connect.bodyParser (), dove ogni connessione apre file temporanei sul filesystem locale?
Eric Elliott

I sistemi operativi di solito hanno limiti configurabili sul numero di descrittori di file che un processo, un thread e / o il sistema operativo possono gestire contemporaneamente. Per Linux: stackoverflow.com/questions/760819/… per MacOS X: stackoverflow.com/questions/7578594/...
AndreasPizsa

2

ero confuso con express o restify o perfectAPI. ho anche provato a sviluppare un modulo in tutti loro. il requisito principale era realizzare un RESTapi. ma alla fine sono finito con express, mi sono messo alla prova con la richiesta al secondo fatta su tutto il framework, l'express ha dato risultati migliori di altri. Anche se in alcuni casi il restify outshines express ma express le cuciture per vincere la gara. Mi congratulo per espresso. E sì, mi sono imbattuto anche in locomotive js, alcuni framework MVC costruiti su express. Se qualcuno cerca un'app MVC completa che utilizzi Express e Jade, scegli la locomotiva.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.