我正在使用MubSub来允许用户订阅某个查询并在可用时立即获取推送更新。此库使用上限集合来获取可转换的游标。我遇到的问题是,当我只有一个tailable游标时,一切都很顺利。获取游标大约需要几毫秒。但是当我添加更多订阅(从而打开更多游标)时,光标的接收有时可能需要8秒。我尝试过添加索引,但这根本没用。
以下是我的收藏统计资料:
{
"ns" : "mDB.myCollection",
"count" : 395669,
"size" : 325551880,
"avgObjSize" : 822.7884418541761,
"storageSize" : 1000001536,
"numExtents" : 1,
"nindexes" : 3,
"lastExtentSize" : 1000001536,
"paddingFactor" : 1,
"flags" : 1,
"totalIndexSize" : 81678240,
"indexSizes" : {
"subscriptionIndex" : 32704000,
"_id_" : 11593568,
"subscriptionQueryAsc" : 37380672
},
"capped" : 1,
"max" : 2147483647,
"ok" : 1
}
这段代码执行时间过长:
this.collection.then(handle(true, function(collection) {
var latest = null;
// The next statement takes a few ms for the first cursor,
// then 5+ seconds for more cursors
collection.find({}).sort({ $natural: -1 }).limit(1).nextObject(handle(function(doc) {
if (doc) latest = doc._id;
(function poll() {
if (latest) query._id = { $gt: latest };
var options = { tailable: true, awaitdata: true, numberOfRetries: -1 };
var cursor = collection.find(query, options).sort({ $natural: 1 });
(function more() {
cursor.nextObject(handle(function(doc) {
if (!doc) return setTimeout(poll, self.wait);
callback(doc);
latest = doc._id;
more();
}));
})();
})();
}));
}));
这是一个已知的问题,还是我只是做错了什么?
答案 0 :(得分:2)
我通过删除上面粘贴的代码中的以下行来修复此问题:
collection.find({}).sort({ $natural: -1 }).limit(1).nextObject(handle(function(doc) {
该特定语句使得代码非常慢,可能是因为它正在获取所有({})文档,并且不知何时游标的数量会减慢进程的速度。我做了这样的事情:
this.collection.then(handle(true, function(collection) {
var latest = null;
if (doc) latest = doc._id;
(function poll() {
if (latest) query._id = { $gt: latest };
var options = { tailable: true, awaitdata: true, numberOfRetries: -1 };
var cursor = collection.find(query, options).sort({ $natural: 1 });
(function more() {
cursor.nextObject(handle(function(doc) {
if (!doc) return setTimeout(poll, self.wait);
callback(doc);
latest = doc._id;
more();
}));
})();
})();
}));
我不完全理解为什么MubSub的作者这样做是因为上一篇文档的_id无关紧要。这是因为文档被插入到上限集合中,这会保留插入顺序。