OS X 10.8.3Sockets nicht angezeigt zu werden, zu schließen, wenn mit Node.js http.get
Knoten 0.10.0
Ich bin mit der ‚http‘ Modul-Anforderungen von dem machen Facebook Grafik API.
Hier sind die Optionen, die ich ‚http.get‘ passieren:
var options = {host: 'graph.facebook.com',
port: 80,
path: '/' + fb_id + '/picture'}; //fb_id is a Facebook user identifier
sieht Ihr Code wie folgt aus:
http.get(options,
function(res) {
...some stuff...
DONE(RESULT); //DONE is a callback function
}).on('error', function(e) {
...some error handling...
});
Was ich beobachte ist, dass ich nur so viele Anfragen tun als der Wert von http.globalAgent.maxSockets. Sobald ich diese vielen Anfragen erreiche, verbindet sich der nächste Aufruf von http.get (scheinbar) nie. Ich habe überprüft, dass bei den Anfragen keine Fehler auftreten.
Es ist, als ob die Steckdosen nicht geschlossen werden, nachdem die Antwort kommt.
Gibt es etwas, was ich als Teil der Antworthandler tun müssen, um sicherzustellen, dass der Socket geschlossen ist?
Schließen sich diese Sockets aufgrund des standardmäßigen Keepalive-Verhaltens nicht?
Wie soll ich fortfahren, um dies zu debuggen?
Ich sah dies in der Dokumentation aber fand es verwirrend: "Wenn keine ausstehenden HTTP-Anfragen auf einen Socket warten, um frei zu werden, wird der Socket geschlossen.Das bedeutet, dass der Pool des Knotens den Vorteil hat, dass er unter Last bleibt, aber Entwickler müssen die HTTP-Clients mit Keep-Alive nicht manuell schließen. " Ich verstehe nicht, warum die gepoolten, bereits geöffneten Verbindungen nicht sind Ich werde versuchen, Agent: false, und erwarten, dass gute Dinge davon. –
Ich denke, das 'http' Modul nicht Warteschlange Anfragen, für die ein Socket nicht im Pool verfügbar ist. Wenn' maxSockets' ist erreicht und all diese Anfragen sind noch ausstehend, alle nachfolgenden Anfragen können keinen freien Socket aus dem Pool bekommen und werden einfach fallen gelassen. " – robertklep
Ich erkannte, dass meine Anwendungsarchitektur zu meinem Problem beitrug, da ich das Programm erneut benötigte "http" Modul vor jeder Anfrage, was bedeutet, dass jeder HTTP-Verweis Standalone war. Ich versuchte, dies zu ändern, so dass die HT Tp-Modul-Referenz wurde über 'Get'-Aufrufe gemeinsam genutzt, aber ich sehe das gleiche Verhalten (erste globalAgent.maxSockets Anfragen sind in Ordnung, der Rest hängt wegen eines Sockets). Dies wirft die Frage auf - Wie würde man dieses Standard-Keepalive-Verhalten nutzen? –