2012-04-04 5 views
7

私はネットワークワイド構成ストレージとしてmongodbを使用しようとしています。これは同じアプリがネットワーク上の複数のマシン上で実行され、それぞれがローカルmongodbからその設定を取得します。 mongodbsが同期されています。私が望むのは、1つのアプリケーションが設定値を変更した場合、すべてのn-1アプリでコールバック/通知を受け取ることです。 このような設定は可能ですか?mongodbで変更されたドキュメントの通知を取得

(それは、などのネットワーク転送/ syncronisationをやってから自分自身を私を保存します。)

答えて

9

のMongoDBはまだトリガを持っていませんが、あなたはoplogコレクションオフ尾にアプリケーションをフックし、何かを毎回行うことができます文書が

削除(または更新、または挿入された、など)され、ここで3一部のブログポストはこれを行う方法の役に立つかもしれません: http://www.kchodorow.com/blog/2010/10/12/replication-internals/

+1

そのリンクは現在死んでいます。 – captncraig

+1

それを指摘してくれてありがとう。私はポストでそれを修正しました。 – Sid

2

あなたはmongodbsが同期されていることを何を意味するのですか?実際にデータを複製していますか?私はあなたがその同期を管理したいと思うように聞こえるので、私は仮定しません。

これまで、私はMongoDBとaspと同様のことを達成しました。これは集中型mongoインスタンス(複製ペアなど)を必要とします。基本的には、ローカルインスタンスに変更が加えられるたびに、セントラルインスタンスのキャップ付きコレクションも新しいバージョンのconfig値と、その値が最後に更新された時刻と値を更新したサーバーのタイムスタンプで更新されます。

別のスレッドが個々のサーバー上で実行され、中央インスタンスに対してカーソルを開いたままにします。新しいレコードがカーソルによって取り出されるたびに、新しい値がローカルインスタンスのタイムスタンプと比較され、それに応じて更新されます(または更新されません)。これらのタイムスタンプと変更を加えた "権限"のサーバーを比較して、更新の嵐に巻き込まれないように注意する必要があります。また、値が「複製」されているために誰かが実際に値を変更したかどうか、つまり更新が複製更新の場合は中央インスタンスを更新したくないため、更新が行われているかどうかを知る必要があります。

0

mongodb 3.6以降、変更ストリームにアクションをフックできるようになりました。これにより、特定のコレクションの変更(例えば、粗い操作)を聴くために使用できるカーソルが表示されます。

変更ストリームはoplogの上に構築され、oplogを使用しているものでアクセス可能です。 変更ストリームが再開可能であり、また、そのような$マッチ、$プロジェクトとして集計演算子で使用することができます...ここ

詳細情報(Javaの例): http://mongodb.github.io/mongo-java-driver/3.6/driver/tutorials/change-streams/

そして、ここではhttps://www.mongodb.com/mongodb-3.6(Javaからの抜粋です):あなたがC#で作業している場合

// 1. The database for reactive, real-time applications 
MongoClient mongoClient; 

// Create a new MongoClient with a MongoDB URI string. 
if (args.length == 0) { 
// Defaults to a localhost replicaset on ports: 27017, 27018, 27019 
    mongoClient = new MongoClient(new 
    MongoClientURI("mongodb://localhost:27017,localhost:27018,localhost:27019")); 
} else { 
    mongoClient = new MongoClient(new MongoClientURI(args[0])); 
} 

// Select the MongoDB database. 
MongoDatabase database = mongoClient.getDatabase("testChangeStreams"); 
database.drop(); 
sleep(); 

// Select the collection to query. 
MongoCollection<Document> collection = database.getCollection("documents"); 

// Create the change stream cursor. 
MongoCursor<Document> cursor = collection.watch().iterator(); 

、例がhereを見つけることができます:

var inventory = database.GetCollection<BsonDocument>("inventory"); 

    var document = new BsonDocument("x", 1); 
    inventory.InsertOne(document); 
    new Thread(() => 
    { 
     Thread.Sleep(TimeSpan.FromMilliseconds(100)); 
     var filter = new BsonDocument("_id", document["_id"]); 
     var update = "{ $set : { x : 2 } }"; 
     inventory.UpdateOne(filter, update); 
    }) 
    .Start(); 

    // Start Changestream Example 2 
    var options = new ChangeStreamOptions { FullDocument = ChangeStreamFullDocumentOption.UpdateLookup }; 
    var enumerator = inventory.Watch(options).ToEnumerable().GetEnumerator(); 
    enumerator.MoveNext(); 
    var next = enumerator.Current; 
    enumerator.Dispose(); 
    // End Changestream Example 2 

    var expectedFullDocument = document.Set("x", 2); 
    next.FullDocument.Should().Be(expectedFullDocument); 
関連する問題