Pourquoi devrais-je utiliser Restify?

101

J'avais l'obligation de créer une API REST dans node.js et je recherchais un cadre plus léger qu'express.js qui évite probablement les fonctionnalités indésirables et agirait comme un cadre personnalisé pour la création d'API REST. Restify de son intro est recommandé pour le même cas.

Lecture Pourquoi utiliser restify et non express? semblait que restify est un bon choix.

Mais la surprise est venue quand j'ai essayé les deux avec une charge.

J'ai créé un exemple d'API REST sur Restify et l'ai inondé de 1000 requêtes par seconde. Surprise pour moi, l'itinéraire a commencé à ne pas répondre après un certain temps. La même application basée sur express.js a tout géré.

J'applique actuellement la charge à l'API via

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

Les résultats que j'ai obtenus semblent-ils raisonnables? Et si tel est le cas, est-il plus efficace d'exprimer que de restifier dans ce scénario? Ou y a-t-il une erreur dans la façon dont je les ai testés?

mis à jour en réponse aux commentaires

comportement de restify

  1. lorsqu'il était alimenté avec une charge de plus de 1000 demandes, il a arrêté le traitement en seulement 1 seconde, recevant jusqu'à 1015 demandes et ne faisait plus rien. c'est à dire. le compteur i implémenté pour compter les requêtes entrantes s'est arrêté incrémenté après 1015.

  2. lorsqu'il est alimenté avec une charge de 100 reqs. par seconde, il a reçu jusqu'à 10 h 15 et est devenu non réactif après cela.

mithunsatheesh
la source
3
Avez-vous parcouru ceci: blog.perfectapi.com/2012/… ? Si vous effectuez une recherche sur google, vous entendrez beaucoup de gens avoir des doutes sur ses performances.
Munim du
3
Il est possible que restify quelque part se bloque lors de l'analyse des routes ou demande des données, et ne le fait pas efficacement, ce qui entraîne des pics de temps de réponse avec une charge élevée. Express.js est léger mais riche en fonctionnalités. La façon dont il est fait le rend toujours léger car les fonctionnalités inutilisées n'ont pas beaucoup d'impact sur les performances globales. De plus, il est bien entretenu et utilisé par les grandes entreprises, l'un des exemples: MySpace. Je ne vois aucun inconvénient à utiliser Express.js pour l'API REST (c'est exactement ce que j'ai fait), cela vous permet en fait à l'avenir d'améliorer votre API car la fonctionnalité est là.
moka le
1
@Munim: merci pour les graphiques. mais la page dit " note, ce graphique est obsolète puisque les problèmes de performances de Restify ont été résolus " .. Mais il semble que rien ne soit résolu. !!
mithunsatheesh
1
@mithunsatheesh J'ai remarqué ceux-là aussi. Mais comme l'auteur n'a pas mené de nouvelles études, je l'ai pris avec une pincée de sel. Le problème sur github a toujours des gens qui se plaignent des performances.
Munim du
2
Pouvez-vous donner plus d'exemples de code (restify)?
Adrian Heine

Réponses:

50

Rectificatif : cette information est désormais erronée, continuez à faire défiler!

il y a eu un problème avec le script qui a conduit le test Restify sur une route non prévue. Cela a permis de maintenir la connexion active, ce qui a amélioré les performances en raison d'une réduction de la surcharge.


Nous sommes en 2015 et je pense que la situation a beaucoup changé depuis. Raygun.io a publié un récent benchmark comparant hapi, express et restify .

Ça dit:

Nous avons également identifié que Restify maintient les connexions actives, ce qui supprime la surcharge liée à la création d'une connexion à chaque fois lors d'un appel depuis le même client. Pour être honnête, nous avons également testé Restify avec l'indicateur de configuration de fermeture de la connexion. Vous verrez une diminution substantielle du débit dans ce scénario pour des raisons évidentes.

Image de référence de Raygun.io

On dirait que Restify est un gagnant ici pour des déploiements de services plus faciles. Surtout si vous créez un service qui reçoit de nombreuses demandes des mêmes clients et que vous souhaitez agir rapidement. Bien sûr, vous en avez beaucoup plus pour votre argent que Node nu puisque vous avez des fonctionnalités telles que le support DTrace intégré.

Masum
la source
1
l'article de blog que vous mentionnez est utile, si l'auteur divulgue plus de détails sur le processus de test qu'il a suivi. Voir les commentaires sous le post!
mithunsatheesh
1
Oui, c'est vrai, comme l'analyse comparative est difficile à faire correctement, ce serait formidable que l'auteur publie le processus et les codes. J'ai donc pris cela comme un grain de sel et je voulais partager avec la communauté.
Masum
Selon les documents Restify, il prend également en charge DTrace. mcavage.me/node-restify/#dtrace
Jeff Fairley
1
Voir également le test de performance Raygun.io 2016
Shane Holloway
3
Veuillez noter l'addendum dans le même article mentionné avant de tirer des conclusions.
Vignesh TV
26

Il s'agit de 2017 et du dernier test de performance de Raygun.io comparant hapi, express, restify et Koa.

Cela montre que Koa est plus rapide que les autres frameworks, mais comme cette question concerne express et restify, Express est plus rapide que restify.

Et c'est écrit dans le post

Cela montre qu'en effet Restify est plus lent que ce qui a été rapporté dans mon test initial.

entrez la description de l'image ici

Puneet Singh
la source
11

Selon la description de Node Knockout :

restify est un module node.js conçu pour créer des services Web REST dans Node. restify facilite de nombreux problèmes difficiles liés à la création d'un tel service, comme la gestion des versions, la gestion des erreurs et la négociation de contenu. Il fournit également des sondes DTrace intégrées que vous obtenez gratuitement pour découvrir rapidement où se situent les problèmes de performances de votre application. Enfin, il fournit une API client robuste qui gère les tentatives / interruptions pour vous en cas d'échec de connexions, ainsi que d'autres subtilités.

Les problèmes de performances et les bogues peuvent probablement être corrigés. Peut-être que cette description sera une motivation adéquate.

Eric Elliott
la source
5

J'ai rencontré un problème similaire en comparant plusieurs frameworks sur OS X via ab. Certaines piles sont mortes, systématiquement, après environ la 1000e demande.

J'ai considérablement dépassé la limite et le problème a disparu.

Vous pouvez vérifier votre maxfiles avec ulimit , (ou launchctl limit <OS X uniquement) et voir quel est le maximum.

J'espère que cela pourra aider.

craigwaterman
la source
Hmm .. cela pourrait être similaire au problème connect.bodyParser (), où chaque connexion ouvre des fichiers temporaires sur le système de fichiers local?
Eric Elliott
Les systèmes d'exploitation ont généralement des limites configurables sur le nombre de descripteurs de fichiers qu'un processus, un thread et / ou un système d'exploitation peuvent gérer simultanément. Pour Linux: stackoverflow.com/questions/760819/… Pour MacOS X: stackoverflow.com/questions/7578594/…
AndreasPizsa
2

j'ai été confondu avec express ou restify ou perfectAPI. même essayé de développer un module dans chacun d'eux. la principale exigence était de faire un RESTapi. mais finalement fini avec express, testé moi-même avec la demande par seconde faite sur tout le framework, l'express a donné un meilleur résultat que d'autres. Bien que dans certains cas, il restitue des coutures expresses mais expresses pour gagner la course. Je tiens à exprimer. Et oui, je suis également tombé sur locomotive js, un cadre MVC construit sur express. Si vous recherchez une application MVC complète utilisant express et jade, optez pour la locomotive.

kushvarma
la source