Est prise séquentielle des requêtes HTTP d'une opération de blocage dans le nœud?

Noter que les informations non pertinentes à ma question sera la 'cité'

comme (n'hésitez pas à passer ces).

Problème

Je suis l'aide d'un noeud à faire dans l'ordre les requêtes HTTP sur le compte de plusieurs clients. De cette façon, quelles en sont à l'origine de la client(e) s de différentes chargement de la page pour obtenir le résultat souhaité, maintenant, ne prend qu'une seule demande par l'intermédiaire de mon serveur. Je suis actuellement en utilisant le ‘async’ module pour le contrôle du débit et de la ‘demande’ module pour faire les requêtes HTTP. Il y a environ 5 rappels qui, à l'aide de la console.le temps, prend environ 2 secondes du début à la fin (de l'esquisse du code fourni ci-dessous).

Maintenant, je suis plutôt inexpérimenté avec le noeud, mais je suis conscient de l'
single-threaded nature de nœud. Alors que j'ai lu de nombreuses fois que le nœud
n'est pas intégrée au PROCESSEUR des tâches limitées, je ne comprenais pas vraiment ce que
signifiait jusqu'à maintenant. Si j'ai une bonne compréhension de ce qui se passe,
cela signifie que ce que j'ai actuellement (en développement) n'est en aucune façon
allez à l'échelle même de plus de 10 clients.

Question

Depuis que je ne suis pas un expert au niveau du nœud, je pose cette question (dans le titre) pour obtenir une confirmation que plusieurs séquentielle des requêtes HTTP est en effet de blocage.

Épilogue

Si c'est le cas, je m'attends je vais demander à un autre DONC, la question (après avoir fait les recherches appropriées) de discuter de diverses solutions possibles, devrais-je choisir de continuer d'aborder ce problème dans le nœud (qui lui-même peut ne pas être approprié pour ce que je suis en train de faire).

D'autres réflexions

Je suis vraiment désolé si cette question n'était pas assez détaillée, trop noobish, ou a en particulier un langage fleuri (je vais essayer d'être concis).

Grâce et de tous les upvotes à quelqu'un qui peut m'aider avec mon problème!

Le code que j'ai mentionnés plus tôt:

var async = require('async');
var request = require('request');

...

async.waterfall([
    function(cb) {
        console.time('1');

        request(someUrl1, function(err, res, body) {
            //load and parse the given web page.

            //make a callback with data parsed from the web page
        });
    },
    function(someParameters, cb) {
        console.timeEnd('1');
        console.time('2');

        request({url: someUrl2, method: 'POST', form: {/* data */}}, function(err, res, body) {
            //more computation

            //make a callback with a session cookie given by the visited url
        });
    },
    function(jar, cb) {
        console.timeEnd('2');
        console.time('3');

        request({url: someUrl3, method: 'GET', jar: jar /* cookie from the previous callback */}, function(err, res, body) {
            //do more parsing + computation

            //make another callback with the results
        });
    },
    function(moreParameters, cb) {
        console.timeEnd('3');
        console.time('4');

        request({url: someUrl4, method: 'POST', jar: jar, form : {/*data*/}}, function(err, res, body) {
            //make final callback after some more computation.
            //This part takes about ~1s to complete
        });
    }
], function (err, result) {
    console.timeEnd('4'); //
    res.status(200).send();
});
Non, il n'est pas bloquant - c'est pourquoi le rappel est nécessaire pour gérer l'asynchrone résultat. Naturellement, s'il est nécessaire sérialisé en relation la demande précédente doit remplir afin d'utiliser les résultats ..
Le blocage signifierait qu'aucun autre code, dans le même contexte d'exécution - pourrait être exécuté avant la demande. Dans cet exemple, le request appels retourner immédiatement et la suite des opérations peut être fait; d'où la non-bloquant. En attente sur une demande (comme cela peut être nécessaire) ne fait pas la request de blocage d'appel.
La "cascade" approche efficacement les causes de la sérialisation de la demande, mais ce n'est qu'un ordre imposé sur le sous-jacent async modèle et non-bloquant IO effectué par Node.js. Trivial contre-exemples incluent l'exécution de plusieurs chutes d'eau en parallèle, ou encore la manipulation de multiples simultanées Node.js les demandes.
Node.js utilisera "0 CPU" lors de l'exécution de l'OI web demande elle-même (le processus est si ridiculement IO). Si il y a en fait, est significative de traitement " (ie. dans un rappel), qui est une préoccupation distincte de combien de temps il faut pour aller chercher la ressource externe. Node.js calcul trivial est "limitée à un seul core/thread", qui est souvent assez vite, à moins d'utiliser un supplément de stratégie de concurrence d'accès telles que le traitement multiple.
Si c'est un problème que les calculs dans la demande de rappel sont la prise de 1 seconde (qui est en effet un long temps à bloquer le nœud"), puis de travailler sur le focus de la question et de l'exploration.

OriginalL'auteur youngrrrr | 2015-10-06