node.js - Mongo 连接流在 NodeJS 应用程序中意外关闭

标签 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 索引。

一切都按预期进行 - 文档已成功上传到我的 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:我已经稍微简化了这个问题。基本上,我必须处理的文档数量无关紧要 - 我的流总是会提前结束,我不确定为什么

最佳答案

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

变量选项 = { socketTimeoutMS: 120000, connectTimeoutMS: 120000, 保活:1 };

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

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

关于node.js - Mongo 连接流在 NodeJS 应用程序中意外关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37166048/

相关文章:

amazon-web-services - 执行命令: npm install.时,代码构建失败,并显示错误原因:退出状态127

amazon-web-services - 如何在CDK中获取AWS IoT自定义终端节点?

javascript - 如何在 node.js selenium-webdriver 中模拟右键单击?

javascript - CommonJS 单例模块中的循环依赖

java - Spring Boot JMS - 何时应在 @Transacted 方法上发送消息?

javascript - 如何在 Meteor 中从服务器向客户端发送消息?

node.js - 不适用于 Node js 中的 fs.readFile

node.js - Nodejs mongodb async.Each 完成

javascript - 在javascript中从对象数组中提取两个数组的最快方法

amazon-web-services - 将节点添加到 AWS 上的 kubernetes 集群?