OS X 10.8.3套接字似乎並沒有被關閉時如何使用Node.js http.get
節點0.10.0
我使用的是「HTTP」模塊進行的請求Facebook圖形API。
這裏是我傳遞給「http.get」的選項:
var options = {host: 'graph.facebook.com',
port: 80,
path: '/' + fb_id + '/picture'}; //fb_id is a Facebook user identifier
我的代碼如下所示:
http.get(options,
function(res) {
...some stuff...
DONE(RESULT); //DONE is a callback function
}).on('error', function(e) {
...some error handling...
});
我觀察到的是,我只能做盡可能多的請求作爲http.globalAgent.maxSockets的值。一旦我達到那麼多請求,下一次調用http.get永遠不會(顯然)連接。我已驗證我沒有收到有關請求的錯誤。
就好像插座沒有被關閉的響應進來之後。
有什麼我需要做的響應處理的一部分,以確保電源被關閉?
這些套接字是否因爲缺省的keepalive行爲而不關閉?
我應該如何進行調試?
我在文檔中看到了這一點,但發現它令人困惑: 「如果沒有未完成的HTTP請求正在等待套接字變爲空閒,則套接字已關閉。這意味着節點池在負載下有保持活動的好處,但仍不需要開發人員使用保持活動來手動關閉HTTP客戶端。「 我不明白爲什麼池中已打開的連接不是用於後續的請求,我會嘗試agent:false,並期待它的好處 – 2013-04-09 19:07:43
我認爲'http'模塊不會對在池中沒有套接字的任何請求進行排隊,如果'maxSockets'並且所有這些請求仍然處於待處理狀態,任何後續請求都無法從池中獲得一個空閒套接字並且會被丟棄。 – robertklep 2013-04-09 20:42:14
我意識到我的應用程序體系結構對我的問題有所貢獻,因爲我重新要求'http'模塊在每個請求之前,這意味着每個http引用是獨立的。 我試圖改變這個,使得ht tp模塊引用是在'get'調用中共享的,但是我看到了相同的行爲(第一個globalAgent.maxSockets請求很好,其餘部分因爲需要套接字而掛起)。 這引發了一個問題 - 如何利用這種默認的keepalive行爲? – 2013-04-09 20:47:43