OS X 10.8.3Sockets non sembrano essere chiusura quando si utilizza Node.js http.get
Nodo 0.10.0
sto usando il 'http' modulo per effettuare richieste del API grafico Facebook.
Qui ci sono le opzioni che mi passano per 'http.get':
var options = {host: 'graph.facebook.com',
port: 80,
path: '/' + fb_id + '/picture'}; //fb_id is a Facebook user identifier
Il mio codice è simile al seguente:
http.get(options,
function(res) {
...some stuff...
DONE(RESULT); //DONE is a callback function
}).on('error', function(e) {
...some error handling...
});
quello che osservo è che posso solo fare il maggior numero di richieste come valore di http.globalAgent.maxSockets. Una volta raggiunte così tante richieste, la prossima chiamata a http.get mai (apparentemente) si connette. Ho verificato che non ricevo errori sulle richieste.
E 'come se le prese non vengono chiuse dopo la risposta arriva.
c'è qualcosa che devo fare come parte del gestore di risposta per garantire che il socket viene chiuso?
Queste prese non si chiudono a causa del comportamento keepalive predefinito?
Come devo procedere per eseguire il debug di questo?
Ho visto questo nella documentazione ma ho trovato confuso: "Se nessuna richiesta HTTP in attesa è in attesa su un socket per diventare libero il socket è chiuso.Ciò significa che il pool del nodo ha il vantaggio di keep-alive quando è sotto carico ma non richiede agli sviluppatori di chiudere manualmente i client HTTP usando keep-alive. " Non capisco perché le connessioni raggruppate, già aperte, non siano usato per le richieste successive. Proverò agente: falso, e mi aspetto cose positive da esso. –
Penso che il modulo 'http' non accoda alcuna richiesta per la quale un socket non è disponibile nel pool. viene raggiunto e tutte quelle richieste sono ancora in attesa, eventuali richieste successive non possono ottenere un socket gratuito dal pool e verranno rilasciate. – robertklep
Mi sono reso conto che la mia architettura dell'applicazione stava contribuendo al mio problema da quando richiedevo nuovamente il modulo "http" prima di ogni richiesta, il che significa che ogni riferimento http era autonomo Ho provato a cambiare questo in modo che il ht il riferimento del modulo tp è stato condiviso tra invocazioni 'get', ma vedo lo stesso comportamento (le prime richieste di globalAgent.maxSockets vanno bene, il resto è sospeso per mancanza di un socket). Questo pone la domanda: come si potrebbe approfittare di questo comportamento keepalive predefinito? –