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

时间:2016-05-11 14:43:55

标签: node.js mongodb amazon-web-services 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索引。
  5. 一切都按预期工作 - 文档已成功上传到我的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分钟)。 / p>

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

    我删除了一些不再适用的修改

    编辑1:我已更新原始代码以显示我现在正在使用的连接设置,而且他们似乎没有帮助(连接设置来自:{{3} })

    编辑2:我已经将问题简化了一下。基本上,我必须处理的文件数量无关紧要 - 我的流将总是提前结束,我不知道为什么

1 个答案:

答案 0 :(得分:0)

除非我遗漏了你的mongoDB连接的选项

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

这只是2分钟。你说你的过程需要更长的时间吗?您是否尝试过增加这些值?

因此,您可能在此期间缓冲了流中的X数据量,从而为什么您在流中的“超时”时间比预期的要长。