2013-07-11 42 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(未确认的写入),并基本上将所有数据转储到套接字缓冲区,直到它超出并关闭或出错。