我遇到了一个非常奇怪的问题。我正在导入一些大的xml文件并将它们存储到mongoDB中。 algorythm是一个典型的异步循环:
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有联系,但那是o.k.是mongoDB连接吗?但为什么它会突然丢失?
唯一有助于贯穿整个循环的是在mongo-callback中执行递归循环调用,如下所示:
setTimeout( function() {
doLoop( it+1, callback_loop );
},1);
有谁知道这里出了什么问题?
谢谢, heinob
答案 0 :(得分:2)
最后我找到了答案。这是默认全局http代理中的问题。查看完整说明here。
答案 1 :(得分:0)
您可以使用process.nextTick
或setImmediate
代替setTimeout
进行尝试 - 它应该是faster。
当您在一个事件循环滴答中执行所有操作时,我假设某些网络缓冲区溢出。也许让节点tick
在你的情况下洗掉一些缓冲区。
正如您已经提到的,这也可能是由于“受攻击”系统的简单过载造成的。
答案 2 :(得分:0)
确保使用写入问题w:1至少每两次写入以确保不会使套接字泛滥。很可能你正在使用w:0(未确认写入)进行写操作,并且基本上将所有数据转储到套接字缓冲区中,直到它超出并关闭或出错。