36

これは私には少し不明確なことであり (私は Node と Mongo を使い始めたばかりです)、サーバーのパフォーマンスと負荷のために本当に懸念しています (これは別の質問だと思いますが、それについては後で説明します)。投稿の終わり)。

したがって、各 API エンドポイントが関数に対応する Node.js と Restify を使用して API を作成していると仮定すると、次のようにする必要があります。

a) db接続を開いてグローバル変数に保存し、それをすべての関数で使用しますか?
例:

// requires and so on leave me with a db var, assume {auto_reconnect: true}
function openDB() {
    db.open(function(err, db) {
        // skip err handling and so on
        return db;
    }
}

var myOpenDB = openDB(); // use myOpenDB in every other function I have

b) db 接続を開き、すべてを 1 つの巨大なクロージャに入れるだけですか?
例:

// same as above
db.open(function(err, db) {
    // do everything else here, for example:
    server.get('/api/dosomething', function doSomething(req, res, next) { // (server is an instance of a Restify server)
        // use the db object here and so on
    });
}

c)必要なたびにデータベースを開いたり閉じたりしますか?
例:

// again, same as above
server.get('/api/something', function doSomething(req, res, next) {
    db.open(function(err, db) {
        // do something
        db.close();
    });
});

server.post('/api/somethingelse', function doSomethingElse(req, res, next) {
    db.open(function(err, db) {
        // do something else
        db.close();
    });
});

この最後の 1 つは、私が直感的に行うことですが、同時に、これを行うのが完全に快適ではありません。Mongo サーバーに負担をかけすぎていませんか? 特に(そして、私がそれに到達することを願っています)、何千とまではいかなくても、何百もの呼び出しがこのようなものになる場合はどうなりますか?

前もって感謝します。

4

2 に答える 2

13

私はMongoJSが大好きです。デフォルトのコマンド ラインと非常によく似た方法で Mongo を使用できます。これは、公式の Mongo ドライバーの単なるラッパーです。DB を 1 回だけ開き、使用するコレクションを指定します。でノードを実行する場合は、コレクションを省略することもできます--harmony-proxies

var db = require('mongojs').connect('mydb', ['posts']);

server.get('/posts', function (req, res) {
  db.posts.find(function (err, posts) {
    res.send(JSON.stringify(posts));
  });
});
于 2012-08-03T18:40:20.770 に答える
6
  • HTTP リクエストが処理される前に DB のオープンが完了するという保証がないため、オプション A は良い考えではありません (これは非常にありそうもないことですが)。
  • オプション C も、DB 接続を不必要に開いたり閉じたりするため、理想的ではありません。

これを処理するのが好きな方法は、遅延/約束を使用することです。Node で利用できるさまざまな promise ライブラリがたくさんありますが、基本的な考え方は次のようにすることです。

var promise = new Promise();

db.open(function(err, db) {
    // handle err
    promise.resolve(db);
});

server.get('/api/something', function doSomething(req, res, next) {
    promise.then(function(db)
        // do something
    });
});

Mongoose はこれと漠然と似た方法で接続を処理していると思います。

于 2012-08-03T17:54:56.967 に答える