5

我遇到了一个非常奇怪的问题。我正在导入一些大的 xml 文件并将它们存储到 mongoDB 中。该算法是一个典型的异步循环:

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 连接吗?但是为什么会突然丢失呢?

唯一有助于运行整个循环的是在 mongo-callback 中执行递归循环调用,如下所示:

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

有谁知道这里出了什么问题?

谢谢,海诺布

4

3 回答 3

4

终于我找到了答案。这是默认全局 http 代理中的一个问题。在此处查看完整说明。

于 2014-01-08T11:15:31.073 回答
0

确保至少每两次写入都使用 w:1 写入关注点,以确保不会淹没套接字。很可能您正在使用 w:0(未确认的写入)进行写入,并且基本上将所有数据转储到套接字缓冲区中,直到它溢出并关闭或出错。

于 2013-08-13T10:53:30.763 回答
0

您可以尝试使用process.nextTicksetImmediate代替setTimeout- 它应该更快

当您在一个事件循环滴答中执行所有操作时,我假设某些网络缓冲区溢出。在您的情况下,也许让节点tick洗牌一些缓冲区。

正如您已经提到的,这也可能是由于“被攻击”系统的简单过载。

于 2013-07-19T13:46:14.300 回答