J'avais l'obligation de créer une API REST dans node.js) et je recherchais un cadre plus léger que express.js, ce qui évite probablement les fonctionnalités indésirables et se comporterait comme un outil personnalisé. cadre construit pour la construction REST API. Restify à partir de son intro est recommandé pour le même cas.
Lecture Pourquoi utiliser Restify et ne pas exprimer? semblait que Restify était un bon choix.
Mais la surprise est venue quand j'ai essayé les deux avec une charge.
J'ai créé un échantillon REST API sur Restify et je l'ai inondé de 1 000 demandes par seconde. Surprenez, la route n'a pas répondu au bout d'un moment. La même application construite 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();
}
Est-ce que les résultats que j'ai obtenus semblent raisonnables? Et si oui, est-ce que express est plus efficace que restify dans ce scénario? Ou y a-t-il une erreur dans la façon dont je les ai testés?
comportement de restifier
quand il était alimenté avec une charge de plus de 1000 req.s, il arrêta le traitement en une seconde à 1015 req.s sans rien faire. c'est à dire. le compteur i implémenté pour compter les demandes entrantes a cessé d'incrémenter après 10h15.
quand nourris avec une charge de même 100 reqs. par seconde, il a reçu jusqu'à 10h15 et est devenu non réactif après cela.
Dans ce blog , il y avait une comparaison entre PerfectAPI
et Express.js
et Restify.js
et le résultat est que Express
est meilleur que Restify
pour un grand nombre de requêtes. J'ai donc créé un simple point de repère à l'aide des versions actuelles d'Express et Restify
Voici le code pour tester express:
var express = require('express');
var app = express();
app.get('/hello/:name', function(req, res){
res.send('hello ' + req.params.name);
});
app.listen(3000);
console.log('Listening on port 3000');
et voici le code pour Restify
:
var restify = require('restify');
var server = restify.createServer();
server.get('/hello/:name', function(req, res, next) {
res.send('hello ' + req.params.name);
});
server.listen(3000, function() {
console.log('Listening on port 3000');
});
J'ai utilisé ApacheBench pour les tests et voici un exemple simple pour l'utiliser.
Vous pouvez l'installer avec Sudo apt-get install Apache2-utils
alors vous pouvez exécuter cette commande pour tester ab -n 10000 -c 100 http://127.0.0.1:3000/
. Cela va frapper le serveur avec 10000 requêtes, avec une simultanéité de 100.
Les résultats pour Restify
Server Hostname: 127.0.0.1
Server Port: 3000
Document Path: /hello/mark
Document Length: 12 bytes
Concurrency Level: 100
Time taken for tests: 2.443 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 1390000 bytes
HTML transferred: 120000 bytes
Requests per second: 4092.53 [#/sec] (mean)
Time per request: 24.435 [ms] (mean)
Time per request: 0.244 [ms] (mean, across all concurrent requests)
Transfer rate: 555.53 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.5 0 8
Processing: 5 24 4.5 23 40
Waiting: 5 24 4.5 23 40
Total: 12 24 4.5 23 40
et pour Express
:
Server Hostname: 127.0.0.1
Server Port: 3000
Document Path: /hello/mark
Document Length: 10 bytes
Concurrency Level: 100
Time taken for tests: 2.254 seconds
Complete requests: 10000
Failed requests: 0
Write errors: 0
Total transferred: 1890000 bytes
HTML transferred: 100000 bytes
Requests per second: 4436.76 [#/sec] (mean)
Time per request: 22.539 [ms] (mean)
Time per request: 0.225 [ms] (mean, across all concurrent requests)
Transfer rate: 818.89 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.5 0 7
Processing: 17 22 4.7 21 55
Waiting: 16 22 4.7 21 55
Total: 18 22 4.9 21 58
La comparaison montre que Express
est plus rapide que Restify
mais que Restify
ne bloquait pas et ne répondait pas à toutes les demandes.
Tout le monde peut essayer ce test de performance et vous pouvez modifier le nombre de demandes et le nombre de demandes simultanées pour voir l’effet sur les deux.
Corrigendum : cette information est maintenant fausse, continuez à faire défiler!
un problème lié au script a provoqué l'exécution du test Restify sur une route non souhaitée. La connexion restait active, ce qui entraînait une amélioration des performances due à une réduction des frais généraux.
Nous sommes en 2015 et je pense que la situation a beaucoup changé depuis. Raygun.io a publié un référence récente comparant hapi, express et restify .
Ça dit:
Nous avons également identifié le fait que Restify maintient les connexions en vie, ce qui supprime la surcharge liée à la création d'une connexion chaque fois que vous appelez à partir du même client. Pour être juste, nous avons également testé Restify avec l'indicateur de configuration de fermeture de la connexion. Vous constaterez une diminution substantielle du débit dans ce scénario pour des raisons évidentes.
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 beaucoup de demandes des mêmes clients et qui souhaite agir rapidement. Bien sûr, vous en aurez plus pour votre argent que pour le nu Node) puisque vous avez des fonctionnalités telles que le support DTrace.
Ceci est 2017 et le dernier test de performance réalisé par Raygun.io en comparant hapi , exprimer, restifier 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 il est écrit dans le post
Cela montre en effet que Restify est plus lent que ce que rapportait mon test initial.
Selon le Description du nœud Knockout :
restify est un module node.js conçu pour créer REST dans Node. Restify simplifie 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 identifier rapidement les problèmes de performances de votre application, ainsi qu'une API client robuste qui gère les nouvelles tentatives/rétablissements sur les connexions défaillantes, ainsi que d'autres subtilités.
Les problèmes de performances et les bugs peuvent probablement être corrigés. Peut-être que cette description sera une motivation suffisante.
J'ai rencontré un problème similaire en comparant plusieurs frameworks sur OS X via ab. Certaines piles sont mortes régulièrement après la 1000e demande environ.
J'ai considérablement dépassé la limite et le problème a disparu.
Vous pouvez vérifier que votre fichier maxfile correspond à limit, (ou launchctl limit <OS X uniquement) et voir quel est le maximum.
J'espère que ça t'as aidé.
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é mon moi avec la demande par seconde faite sur tout le framework, l’express donnait un meilleur résultat que d’autres. Bien que, dans certains cas, restituer les reflets express, mais express coutures pour gagner la course Je félicite pour express. Et oui, j’ai aussi rencontré la locomotive js, un framework MVC construit au-dessus d’express. Si vous recherchez une application MVC complète utilisant Express et Jade, optez pour la locomotive.