2013-04-09 6 views
10

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?

Antwort

7

Versuchen Sie die Einstellung agent: false in den Optionen. Standardverhalten ist in der Tat Verbindungen offen für HTTP zu halten keep-alive:

var options = {host: 'graph.facebook.com', 
       port: 80, 
       path: '/' + fb_id + '/picture', 
       agent: false}; 
+0

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. –

+0

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

+0

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? –

2

Knoten HTTP-Modul besagt, dass Agent standardmäßig globalen Agenten: http://nodejs.org/api/http.html#http_http_globalagent, was bedeutet, dass Keepalive gemeinsam genutzt wird, unabhängig von dem Modul, des Ursprung der anfordern.

BTW, reagiert auf Wes 'Kommentar vom Apr 9'13 um 20:47 Uhr: Es spielt keine Rolle, wie oft Sie ein Knotenmodul laden, es wird nur einmal geladen und von allen Modulen geteilt.

Was Sie erleben, ist ein Pool Erschöpfung Problem. Der einfachste Weg, dies zu vermeiden, ist die Verwendung eines neuen Agenten (http://nodejs.org/api/http.html#http_class_http_agent) mit Ihren gewünschten maxSockets. Denken Sie daran, dass der Agent, den Sie erstellen, von Modulen gemeinsam genutzt werden kann, wenn Sie ihn in einen Export dieses Moduls einfügen (Module im Knoten sind stateful !!!).

2

Ich habe das gleiche Verhalten, außer dass meine Verbindungen wurden schließlich nach einer Zeitüberschreitung wieder verwendet. Überprüfen Sie, ob die Verbindungen nach einer bestimmten Zeit (einige Minuten) wiederverwendet werden, und prüfen Sie, ob die Antwortheader "Verbindung: Keep-Alive" enthalten.

Wenn dies der Fall ist, wäre eine mögliche Lösung, den Header 'Connection: Close' anstelle von Keep-Alive zu verwenden. Auf diese Weise könnten gepoolte Verbindungen früher als im üblichen Setup wiederverwendet werden. Ich bin mir nicht sicher, ob dies zu Leistungsproblemen bei der Verwendung der Facebook-Endpunkte führt.

Für mich mit Agent: false hat nicht funktioniert, weil die große Anzahl von Anfragen erschöpfte Server-Ressourcen gesendet.

Verwandte Themen