Dav*_*per 5 mongodb amazon-web-services node.js node-mongodb-native
我有一个 NodeJS 应用程序(使用 node-mongodb-native 驱动程序版本 2.1),它执行以下操作:
stream()游标对象上的函数来流式传输结果。一切都按预期进行 - 文档已成功上传到我的 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 数据量,因此您在流期间的“超时”时间比预期更长。