2

私はMubSubを使用して、ユーザーが特定のクエリをサブスクライブし、利用可能になるとすぐにプッシュされた更新を取得できるようにしています。このライブラリは、キャップ付きコレクションを使用して、テーラブル カーソルを取得します。私が抱えている問題は、テーラブルカーソルが 1 つしかない場合、すべてがうまくいくことです。カーソルの取得には数ミリ秒程度かかります。しかし、サブスクリプションを追加する (したがって、より多くのカーソルを開く) と、カーソルの受信に最大 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();
                }));
            })();
        })();
    }));
}));

これは既知の問題ですか、それとも何か間違ったことをしているだけですか?

4

1 に答える 1

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();
            }));
        })();
    })();
}));

最後のドキュメントの_idが何であるかは問題ではないため、MubSubの作成者がこれを行った理由が完全にはわかりません。これは、ドキュメントがキャップ付きコレクションに挿入され、挿入順序が保持されるためです。

于 2012-09-30T19:44:51.367 に答える