Come gestire un progetto su larga scala in node.js mantenendo tutto asincrono?

2

Ho un modulo di grandi dimensioni che deve elaborare più di 10.000 richieste / risposte al secondo. Ogni richiesta ha un json e ha bisogno di elaborarlo e verificarlo sul database e generare la risposta sulla base della query db. Ecco un esempio

 Function 1

 function  ('/get' , fucntion (req1 , res1 , next ){

  //to process the req data 
  processData(req1 , res1 );

 });


 Function 2

     processData(req1 , res1 ){

      var J = JSON.parse (req1.body)
     //it has to read db three times 
     //process the json build the response and return 

           condtionCheck(J , res1){

                    var a = someVlaue(){
                    //select a value from a collection set of nosql which have 
                    //more than 1000 document and 
                    //i have to itrate a for loop to check the condition .....etc 
                    //...........

                      }
                    ........

                      dataRead(var a , res1){
             // is it possible to send response for the req1 object here
                         res1.send({value b: abcd123})
                    }

              }

      }

     Function 3 ..... and so on 

Il problema principale è che tutto il codice che ho scritto all'interno dei dati di processo è sincrono. Bacaue ogni codice dipende dalla richiamata precedente e ci sono così tanti controlli di condizione che vengono usati in più occasioni.

Quindi è bene mettere un'elaborazione così grande in modo sincrono all'interno del nodo? Se scrivo il codice usando async alcune volte tutto lo scenario è in una condizione di deadlock Come evitare un simile comportamento? Async o funzione come step hanno influenza sulle prestazioni? In una serie di funzioni come possiamo ridurre la latenza?

    
posta Vivek Bajpai 29.04.2013 - 11:55
fonte

1 risposta

0

Risposta breve:

No, l'elaborazione sincrona in node.js causerà problemi di prestazioni.

Risposta lunga:

Si desidera evitare il più possibile l'elaborazione sincrona nel nodo. Ovviamente, a volte ne avrai bisogno, ma potrebbe essere un punto in cui muovi il rilevante codice sincrono dal nodo e in qualcosa di più adatto.

In sostanza, poiché il nodo segue un modello di concorrenza evento, in cui un singolo thread esegue una serie di eventi uno alla volta, qualsiasi evento di lunga durata bloccherà l'esecuzione di qualsiasi altra cosa. Quindi, quello che cercherete di fare è quello di eliminare tutte le funzionalità possibili in piccole, asincrone, chiamate di funzione.

Quello che vorresti fare è usare una libreria, come async o Step , che consente di evitare l'approccio "callback hell" alla programmazione dei nodi. JQuery ha una cosa simile nel browser che potresti aver usato, che è il suo metodo promise () e oggetti rinviati. Ciò renderà molto più veloce scrivere e gestire la sorgente del tuo nodo.

Se hai davvero bisogno di inserire una grande procedura sincrona nella tua app web, allora il nodo non è lo strumento giusto per quel lavoro. Cerca di avere un'altra API a cui il nodo può chiamare quando deve eseguire un'attività a esecuzione prolungata, indipendentemente dal fatto che si tratti di un'app C ++ della riga di comando o di un'API Web in un linguaggio con più modelli di concorrenza standard.

    
risposta data 30.04.2013 - 12:59
fonte

Leggi altre domande sui tag