14

私は Mongoose (MongoDB を永続ストレージに使用する node.js の ORM) を評価してきました。

私がやりたいのは、アプリの起動時に DB が起動していないときにアプリが実行できるようにすることと、DB がダウンするのをインテリジェントに処理することです。

現在、どちらの場合も機能しない私のテストアプリはこれを行います:

var mongoose_connection = mongoose.createConnection(DATABASE_URL, {server:{poolSize:4}});

次に、モデルを作成するときにその接続を使用します。

アプリの開始時に DB がダウンしている場合、インスタンスでの save() 呼び出しはエラーなしでサイレントに失敗します。DB が復旧すると、書き込まれることはありません。

したがって、接続が発生しなかったことを検出し、アプリが実行時にそれを認識できるようにして、何らかの方法で処理できるようにする必要があります。

アプリの起動後に DB がダウンしても、save() 呼び出しはまだエラーを引き起こしませんが、キューに入れられ、DB が戻ったときに書き込まれます。

DB がダウンしているときにイベントを取得し、キューに保存されている数を照会するために API にフックしたいことを除いて、それは問題ないようです。ある時点で、キューに入れられたイベントが非常に多くなり、新しいイベントの作成をやめてアプリを元に戻したいと思うかもしれません。

4

2 に答える 2

13

ケース #1: アプリの起動時にデータベースがダウンしています。この使用例を妨げる小さなバグがあり、現在修正中です。ただし、回避策は次のとおりです。

var db = mongoose.createConnection();
db.on('error', function (err) {
  if (err) // couldn't connect

  // hack the driver to allow re-opening after initial network error
  db.db.close();

  // retry if desired
  connect();
});

function connect () {
  db.open('localhost', 'dbname');
}

connect();

https://gist.github.com/2878607

醜いが機能する要点。最初にmongoをシャットダウンしてから、このgistを実行します。

接続障害に注意してください。

次に、mongo を起動し、キューに入れられたすべての挿入が完了し、コンソールにダンプされたことを確認します。書き込みと検索が開始されます。

mongo をシャットダウンします。insert と find が試行されていますが、コールバックが実行されていないことに注意してください。

モンゴを再起動します。キューに入れられたすべての挿入と検索が完了していることに注意してください。

于 2012-06-05T22:45:05.227 に答える
6

データベースがダウンしているときにサーバーへのすべてのリクエストを失敗させたい場合は、ネイティブドライバーが再接続イベントを発行します。これはミドルウェアで感知できます。

これは機能し、再接続イベントを正常に発行します (mongodb ネイティブ ドライバー 1.3.23)

mongoose.connection.db.on('reconnect', function (ref) {
    connected=true;
    console.log('reconnect to mongo server.');
});

したがって、私の dbconnection ミドルウェアは接続/エラー/再接続を探します (イベントのいくつかは冗長ですが、害はありません!) PS. 上記のaaronheckmannの回答のように、最初の接続失敗は再試行によって処理する必要があります。

mongoose.connection.on('open', function (ref) {
    connected=true;
    console.log('open connection to mongo server.');
});

mongoose.connection.on('connected', function (ref) {
    connected=true;
    console.log('connected to mongo server.');
});

mongoose.connection.on('disconnected', function (ref) {
    connected=false;
    console.log('disconnected from mongo server.');
});

mongoose.connection.on('close', function (ref) {
    connected=false;
    console.log('close connection to mongo server');
});

mongoose.connection.on('error', function (err) {
    connected=false;
    console.log('error connection to mongo server!');
    console.log(err);
});

mongoose.connection.db.on('reconnect', function (ref) {
    connected=true;
    console.log('reconnect to mongo server.');
});
于 2014-01-24T21:38:19.297 に答える