Mongo 连接流在 NodeJS 应用程序中意外关闭

Posted

技术标签:

【中文标题】Mongo 连接流在 NodeJS 应用程序中意外关闭【英文标题】:Mongo connection stream closes unexpectedly in NodeJS application 【发布时间】:2016-09-07 01:20:53 【问题描述】:

我有一个 NodeJS 应用程序(使用 node-mongodb-native 驱动程序 2.1 版),它执行以下操作:

    打开与 MongoDB 的连接。 查询集合(batchSize 设置为 1000)。此查询返回大约 1,300,000 个我自己验证过的文档。 由于文档太多,无法放入 bson 响应(如果我没记错的话,大约 16mb),我使用光标对象上的 stream() 函数流式传输我的结果。 我分批将 1​​000 个文档上传到我的 Amazon CloudSearch 索引。

一切正常 - 文档已成功上传到我的 AWS 服务,一切正常。

但是,一旦流式传输了 85,000 个文档,流就会发出 end 事件。它始终如一地执行此操作,并且不会引发任何错误。通常我会将此归结为超时被击中,但事实上每次上传 85,000 个文档时都会发生这种情况,然后立即结束/关闭流,这让我觉得有些事情发生了。

我的代码如下:

var options = 
    socketTimeoutMS: 120000,
    connectTimeoutMS: 120000,
    keepAlive: 1
;
var url = "www.myMongoAddress.com";
mongo.connect(url, options, function(err, db) 
    var collection = db.collection('myCollection');
    var stream = collection.find(mySearch: 'criteria').batchSize(1000).stream();
    var batch = [];    
    var total = 0;

    stream.on('end', function() 
        console.log('stream ended!');
        console.log('processed ' + total + ' docs');
    );

    stream.on('data', function(doc) 
        doc = doc.map(function(d) 
            // Do some transforms on the data here.
        );
        batch.push(doc);

        if (batch.length == 1000 || !stream.hasNext()) 
            stream.pause();
            uploadDocsToAWS(function() 
                stream.resume();
                total += batch.length;
                batch = [];
            );
        
    );
);

假设我的查询返回了超过 85,000 个文档,则流始终以 85,000 个文档结束,并且始终需要大约 5 分钟(使用 Unix time 实用程序,平均时间为 5 分钟)。

我有什么办法可以帮助诊断这个问题吗?

我删除了一些修改,因为它们不再适用

Edit1:我已经更新了原始代码以显示我现在正在使用的连接设置,但它们似乎没有帮助(连接设置来自:http://mongodb.github.io/node-mongodb-native/2.1/reference/connecting/connection-settings/)

Edit2:我已经将问题简化了一点。基本上,我必须处理的文档数量无关紧要 - 我的流总是会过早结束,我不知道为什么

【问题讨论】:

增大或减小批量大小对结束前处理的文档数量有影响吗? @ry_donahue 哈,是的!我刚刚将批量大小更改为 4000,现在它在大约 5 分钟后始终停止在 92000。我开始认为这可能是一个超时问题...任何想法如何增加超时/完全删除它? 我相信 find 你可以做的选项:timeout:false 但老实说,我不相信这是超时。过去,我在恢复调用周围看到过奇怪的 CPU 使用情况。不幸的是,我从未完全解决这些问题。令人不安的事情是增加批量 3 倍并没有增加线性扫描的文档。所以超时绝对是最大的嫌疑人(对我来说)。 @ry_donahue 是的,我会试一试,让你知道。我希望更改哪个超时选项? mongodb.github.io/node-mongodb-native/driver-articles/… 是上面提到的那些吗?有不少。 我认为这只是:find(, timeout : false) 默认情况下应该为 false,但考虑到其他数据库配置,我现在不止一次恳求不同。跨度> 【参考方案1】:

除非我遗漏了什么,你的 mongoDB 连接选项是

var 选项 = 套接字超时时间:120000, 连接超时时间:120000, 保活:1 ;

只有 2 分钟。你说你的过程比这要长得多?您是否尝试过增加这些值?

因此,您可能在这段时间内缓冲了流中的 X 数据量,因此您在流中的“超时”时间比预期的要长。

【讨论】:

是的,我认为这是一个超时的事情,但不幸的是这些值是什么并不重要:(当还有大约 30,000 个文档要处理时,流在打开并处理后几乎立即结束什么都没有。从大约 40000-60000 它将在关闭流之前处理 4000。这很奇怪,我无法弄清楚。

以上是关于Mongo 连接流在 NodeJS 应用程序中意外关闭的主要内容,如果未能解决你的问题,请参考以下文章

SMTP 服务器在 mailkit 中意外断开连接

如何修复腻子中意外的服务器关闭连接

VSCode 调试器在节点模块文件中意外暂停

如何防止在 Android 片段/活动中意外退出应用程序?

在 Flutter 中意外删除了 dart 包

在我的付费 iPhone 应用程序中意外启用了 iAds