2013-04-09 41 views
10

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行爲而不關閉?

我應該如何進行調試?

回答

7

嘗試在選項中設置agent: false。默認行爲確實是保持連接打開HTTP保持活動:http://nodejs.org/api/http.html#http_http_globalagent,這意味着保持活躍,而不管共享的模塊,它起源的:該代理默認爲全球代理

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

我在文檔中看到了這一點,但發現它令人困惑: 「如果沒有未完成的HTTP請求正在等待套接字變爲空閒,則套接字已關閉。這意味着節點池在負載下有保持活動的好處,但仍不需要開發人員使用保持活動來手動關閉HTTP客戶端。「 我不明白爲什麼池中已打開的連接不是用於後續的請求,我會嘗試agent:false,並期待它的好處 – 2013-04-09 19:07:43

+0

我認爲'http'模塊不會對在池中沒有套接字的任何請求進行排隊,如果'maxSockets'並且所有這些請求仍然處於待處理狀態,任何後續請求都無法從池中獲得一個空閒套接字並且會被丟棄。 – robertklep 2013-04-09 20:42:14

+0

我意識到我的應用程序體系結構對我的問題有所貢獻,因爲我重新要求'http'模塊在每個請求之前,這意味着每個http引用是獨立的。 我試圖改變這個,使得ht tp模塊引用是在'get'調用中共享的,但是我看到了相同的行爲(第一個globalAgent.maxSockets請求很好,其餘部分因爲需要套接字而掛起)。 這引發了一個問題 - 如何利用這種默認的keepalive行爲? – 2013-04-09 20:47:43

2

節點的HTTP模塊狀態請求。

順便說一句,在20:47回覆Wes'Apr9'13的評論:無論您加載一個節點模塊多少次,它將只加載一次並由所有模塊共享。

您遇到的問題是池耗盡問題。避免它的最簡單的方法是使用一個新的代理(http://nodejs.org/api/http.html#http_class_http_agent)和你想要的maxSockets。請記住,您創建的代理可以在模塊之間共享,如果將其放置在該模塊的導出中(節點中的模塊是有狀態的!!!)。

2

我經歷了同樣的行爲,除了我的連接在超時期限後最終重新使用。檢查連接是否在一段時間(幾分鐘)後重新使用,並檢查響應頭是否包含「Connection:keep-alive」。

如果是這種情況,可能的解決方案是使用'Connection:Close'標題而不是保持活動狀態,這樣可以像通常的安裝中那樣更早地重用連接的連接。我不確定這是否會導致使用Facebook端點的任何性能問題。

var options = {host: 'graph.facebook.com', 
       port: 80, 
       path: '/' + fb_id + '/picture', 
       headers: { 'Connection':'Close' } 
}; 

對於使用我代理:假沒工作,因爲請求廣大我送耗盡服務器資源。