2013-07-11 64 views
3

我遇到了一個非常奇怪的問題。我正在導入一些大的xml文件並將它們存儲到mongoDB中。該algorythm是一個典型的異步循環:錯誤:在處理大異步循環時連接EADDRNOTAVAIL

doLoop = function(it, callback_loop) { 
    if(it < no_of_items) { 
     storeToMongo(..., function(err, result) { 
       ... 
       doLoop(it+1, callback_loop); 
     }); 
    } else { 
     callback_loop(); 
    } 
}; 
doLoop(0, function() { 
    ... 
}); 

現在(突然毫無代碼中的任何顯着變化),我收到以下錯誤而執行循環:

events.js:72 
     throw er; // Unhandled 'error' event 
      ^
Error: connect EADDRNOTAVAIL 
    at errnoException (net.js:901:11) 
    at connect (net.js:764:19) 
    at net.js:842:9 
    at dns.js:72:18 
    at process._tickCallback (node.js:415:13) 

錯誤後會發生約一分鐘。在此期間處理的項目總數完全相同,但並不完全相同。

我試圖找出什麼connect/net導致錯誤,但我迷路了。我的代碼中沒有套接字連接。我與redis有聯繫,但那是。它是mongoDB連接嗎?但爲什麼它突然迷路了?

,有助於在整個循環運行的唯一一件事就是蒙戈回調像這樣內執行遞歸循環調用:

setTimeout(function() { 
    doLoop(it+1, callback_loop); 
},1); 

任何人在那裏誰有一個想法是怎麼回事錯在這裏?

感謝, heinob

+0

你確定沒有其他節點正在運行相同的服務器?嘗試grep進程 –

+0

是的,還有另一個節點進程正在運行。但他們過去並沒有打擾過對方。爲什麼setTimeout-workaround「解決」這個問題? – heinob

回答

2

最後我找到了答案。這是默認的全局http代理中的一個問題。查看完整說明here

0

你可以用process.nextTicksetImmediate代替setTimeout嘗試 - 它應該是faster

由於您在單個事件循環中執行所有操作,因此我認爲有些網絡緩衝區溢出。也許讓節點tick將你的案例中的一些緩衝區洗掉。如上所述,它也可能是由於「被攻擊」系統的簡單過載造成的。

0

確保您至少每寫兩次寫w:1寫關注點,以確保您不會溢出套接字。很可能你正在寫入w:0(未確認的寫入),並基本上將所有數據轉儲到套接字緩衝區,直到它超出並關閉或出錯。