2013-09-27 23 views
31

Qualcuno può spiegare come utilizzare l'hash del pool request.js?Come utilizzare i pool di richieste js (Node js Module)

Il github notes dire questo di piscine:

piscina - Un oggetto hash contenente gli agenti per queste richieste. Se omessa, la richiesta utilizzerà il pool globale impostato su maxSockets di default del nodo.

pool.maxSockets - Numero intero che contiene la quantità massima di socket nel pool.

Ho questo codice per scrivere su un'istanza CouchDB (notare i punti interrogativi). In sostanza, qualsiasi utente che si connette al server di nodo scriverà al indipendenti l'uno dall'altro DB:

var request = require('request'); 

request({ 
    //pool:,  // ?????????????????? 
    'pool.maxSockets' : 100, // ?????????????????? 
    'method' : 'PUT', 
    'timeout' : 4000, 
    'strictSSL' : true, 
    'auth' : { 
     'username' : myUsername, 
     'password' : myPassword 
    }, 
    'headers' : { 
     'Content-Type': 'application/json;charset=utf-8', 
     'Content-Length': myData.length 
    }, 
    'json' : myData, 
    'url': myURL 
}, function (error, response, body){ 
    if (error == null) { 
     log('Success: ' + body); 
    } 
    else { 
     log('Error: ' + error); 
    } 
}); 

cosa è meglio per un elevato throughput/prestazioni?
Quali sono gli svantaggi di un numero "maxSockets" elevato?
Come si crea un pool separato da utilizzare al posto del pool globale? Perché voglio solo creare un pool separato?

risposta

38

L'opzione piscina in richiesta utilizza l'agente che è lo stesso http.Agent dalla libreria HTTP standard. Vedere la documentazione per http.Agent e vedere le opzioni agent in http.request.

Uso

pool = new http.Agent(); //Your pool/agent 
http.request({hostname:'localhost', port:80, path:'/', agent:pool}); 
request({url:"http://www.google.com", pool:pool }); 

Se siete curiosi di sapere che cosa è che si può vedere dalla console.

{ domain: null, 
    _events: { free: [Function] }, 
    _maxListeners: 10, 
    options: {}, 
    requests: {}, 
    sockets: {}, 
    maxSockets: 5, 
    createConnection: [Function] } 

Il maxSockets determina quanti socket simultanee l'agente può avere aperto per host, è presente in un agente di default con valore 5. Tipicamente sarà impostato prima. Passando esplicitamente a pool.maxSockets si sostituisce la proprietà maxSockets in pool. Questa opzione ha senso solo se si passa l'opzione pool.

modi così diversi si usa:

  1. non danno agent opzione, saranno undefined utilizzerà http.globalAgent. Il caso predefinito.
  2. Assegnarlo come falso, disabiliterà il raggruppamento.
  3. Fornire il proprio agente, come nell'esempio sopra.

Rispondere alle vostre domande in senso inverso.

Pool è pensato per mantenere un certo numero di socket da utilizzare dal programma. Innanzitutto le prese vengono riutilizzate per richieste diverse. Quindi riduce il sovraccarico di creazione di nuovi socket. In secondo luogo utilizza un minor numero di socket per le richieste, ma in modo coerente. Non occuperà tutte le prese disponibili. In terzo luogo mantiene la coda di richieste. Quindi c'è tempo di attesa implicito.

Il pool funge sia da cache che da acceleratore. L'effetto acceleratore sarà più visibile se si hanno più richieste e prese minori. Quando si utilizza il pool globale, può limitare il funzionamento di due client diversi, non ci sono garanzie sui tempi di attesa. Avere un pool separato per loro sarà più equo per entrambi (pensate se uno richiede più degli altri).

La proprietà maxSockets offre la massima concorrenza possibile. Aumenta il rendimento generale/prestazioni. L'inconveniente è l'effetto dell'acceleratore ridotto. Non è possibile controllare il sovraccarico del picco. Impostandolo su un numero elevato, sarà come se non ci fosse alcun pool. Inizieresti a ricevere errori come socket non disponibile. Non può essere superiore al limite massimo consentito dal sistema operativo.

Quindi cosa è meglio per prestazioni/prestazioni elevate? C'è un limite fisico nel throughput. Se raggiungi il limite, il tempo di risposta aumenterà con il numero di connessioni. Puoi continuare ad aumentare maxSocket fino ad allora, ma dopo di ciò non sarà più utile.

+0

Nel primo esempio di utilizzo, qual è il punto della seconda riga 'http.request ({...});' - è solo per mostrare che funzionerebbe quando si utilizza il modulo HTTP principale, oppure è richiesta una dichiarazione per essere chiamato per inizializzare correttamente il pool da usare nella libreria 'request'? Grazie! –

+0

La tua risposta è la migliore risorsa che ho avuto finora sul pooling degli agenti e sui pro e contro del loro utilizzo. Grazie mille per aver dedicato del tempo a scrivere questo (y) –

+0

** NOTE ** che le versioni recenti di _Node.js_ hanno un 'Infinity' come il' maxSockets' di default. –

13

Si dovrebbe dare un'occhiata al modulo forever-agent, che è un wrapper per http.Agent.

In genere il pool è un oggetto hash che contiene un numero di agenti http. prova a riutilizzare i socket creati dalla connessione "keep-alive". per host: porta. Ad esempio, hai eseguito diverse richieste per ospitare www.domain1.com:80 e www.domain2.com:80, se nessuna risposta contiene un'intestazione Connection: close, inserirà il socket nel pool e lo invierà alle richieste in sospeso.

Se nessuna richiesta in sospeso richiede questo socket in pool, verrà distrutta.

Il maxSockets indica il numero massimo di socket simultanei per un singolo host: porta, il valore predefinito è . Vorrei suggerire di pensare di questo valore con lo scenario insieme:

  • Secondo tali siti hot richieste di visita, è meglio creare piscina separata. in modo che le nuove richieste possano recuperare rapidamente i socket inattivi. il punto è che è necessario ridurre il numero di richieste in sospeso su determinati siti aumentando il valore maxSockets di un pool. Si noti che non importa se si imposta un numero molto elevato su maxSockets quando la connessione viene gestita correttamente dal server di origine tramite l'intestazione di risposta Connection: close.

  • In base ai siti che le vostre richieste difficilmente visitano, utilizzare pool: false per disabilitare il pool.

È possibile utilizzare questo modo di specificare piscina separata per la vostra richiesta:

// create a separate socket pool with 10 concurrent sockets as max value. 
var separateReqPool = {maxSockets: 10}; 
var request = require('request'); 

request({url: 'http://localhost:8080/', pool: separateReqPool}, function(e, resp){ 
}); 
+2

Questo "sepearateReqPool" sembrava funzionare per me ed era molto meno codice. Non sono sicuro del bit di forever-agent (non ci ho provato), ma la seconda parte è stata molto utile. – jeremy

+0

Il sistema operativo si sostituirà se imposto il pool: false? Voglio dire, continuerà a riutilizzare le connessioni keep-alive o è quella logica esclusiva dell'applicazione? – lucaswxp