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

Dav*_*per 5 mongodb amazon-web-services node.js node-mongodb-native

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

  1. 打开与 MongoDB 的连接。
  2. 查询集合(batchSize 设置为 1000)。此查询返回大约 1,300,000 个文档,这些文档是我自己验证的。
  3. 由于文件太多,无法放入 bson 响应中(如果我没记错的话,大约 16mb),我使用stream()游标对象上的函数来流式传输结果。
  4. 我将 1000 个文档分批上传到我的 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 = [];
            });
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

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

我可以尝试什么来帮助诊断这个问题吗?

我删除了一些编辑,因为它们不再适用

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

Edit2:我已经稍微简化了问题。基本上,我必须处理的文档数量并不重要 - 我的流总是会提前结束,我不确定为什么

小智 0

除非我遗漏了一些东西,否则您的 mongoDB 连接选项是

var options = { socketTimeoutMS: 120000, connectTimeoutMS: 120000, keepAlive: 1 };

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

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