OS X 10.8.3Gniazdka nie wydają się być zamknięcie przy użyciu node.js http.get
Węzeł 0.10.0
używam „http” moduł do żądań Interfejs API wykresu Facebook.
Oto opcje, które mijam na „http.get”:
var options = {host: 'graph.facebook.com',
port: 80,
path: '/' + fb_id + '/picture'}; //fb_id is a Facebook user identifier
Mój kod wygląda następująco:
http.get(options,
function(res) {
...some stuff...
DONE(RESULT); //DONE is a callback function
}).on('error', function(e) {
...some error handling...
});
Co mogę obserwować to, że mogę zrobić tylko tyle żądań jako wartość http.globalAgent.maxSockets. Po osiągnięciu wielu żądań, następne wywołanie http.get nigdy (pozornie) się nie łączy. Weryfikowałem, że nie dostaję błędów w żądaniach.
To tak jakby gniazda nie są zamykane po odpowiedź przychodzi.
Czy jest coś, co muszę zrobić w ramach obsługi reagowania w celu zapewnienia, że gniazdo jest zamknięty?
Czy te gniazda nie są zamykane z powodu domyślnego zachowania keepalive?
Jak mam przystąpić do debugowania tego?
Widziałem to w dokumentacji, ale stwierdziłem, że jest mylące: "Jeśli oczekujące żądania HTTP nie czekają na gniazdo, aby się uwolnić, gniazdo zostanie zamknięte.Oznacza to, że pula węzła ma tę zaletę, że utrzymuje się przy obciążeniu, ale nadal nie wymaga od programistów ręcznego zamykania klientów HTTP przy użyciu funkcji keep-alive. " Nie rozumiem, dlaczego połączone, już otwarte połączenia nie są użyty dla kolejnych żądań Spróbuję agent: false i oczekiwać od niego dobrych rzeczy –
Myślę, że moduł 'http' nie kolejkuje żadnych żądań, dla których gniazdo nie jest dostępne w puli. jest osiągnięty, a wszystkie żądania oczekują, żadne kolejne żądania nie mogą uzyskać bezpłatnego gniazda z puli i zostaną po prostu usunięte. – robertklep
Zdałem sobie sprawę, że moja architektura aplikacji przyczyniła się do mojego problemu, ponieważ ponownie zażądałem Moduł "http" przed każdym żądaniem, co oznacza, że każde odwołanie http było autonomiczne: Próbowałem zmienić to tak, aby ht Odwołanie do modułu tp zostało udostępnione w wywołaniach "get", ale widzę to samo zachowanie (pierwsze żądania globalAgent.maxSockets są w porządku, reszta zawiesza się z powodu braku gniazda). To nasuwa pytanie - jak można skorzystać z tego domyślnego zachowania keepalive? –