我想要使用的MongoDB作为网络范围内的配置存储。 此相同的应用程序在网络上的多台机器上运行,每就会从当地的MongoDB其配置。 该mongodbs的同步。 我想是获得一个回调/通知在所有的N-1个应用程序,如果一个应用程序更改任何的配置值。 就是这种设置的可能吗?
(这将节省我做网络传输/ syncronisation等我。)
我想要使用的MongoDB作为网络范围内的配置存储。 此相同的应用程序在网络上的多台机器上运行,每就会从当地的MongoDB其配置。 该mongodbs的同步。 我想是获得一个回调/通知在所有的N-1个应用程序,如果一个应用程序更改任何的配置值。 就是这种设置的可能吗?
(这将节省我做网络传输/ syncronisation等我。)
MongoDB中还没有触发,但你可以连接你的应用程序尾巴断OPLOG收集和做一些事情,每次文档已被删除(或更新,或插入等)
这里的3部分博客文章可能是关于如何做到这一点有所帮助: http://www.kchodorow.com/blog/2010/10/12/replication-internals/
你是什么意思的是,mongodbs会同步? 他们在实际复制数据的彼此之间? 我认为不是,因为它听起来好像要管理该synching。
在过去,我已经完成了与MongoDB的和ASP类似的东西,需要一个集中的蒙戈实例(副本对等)。 基本上,每一个变化是当地实际情况作出的时间,对中央实例封顶集合也更新了配置值的新版本,当该值上次更新和服务器更新值的时间戳。
一个单独的线程,然后在单独的服务器,其保持了tailable光标对中央实例开上运行。 每当一个新的记录被光标检索,新的值是针对本地实例的时间戳进行比较,并相应地(或没有)更新。 比较这些时间戳和进行了更改,以确保您不更新风暴风“授权”服务器时一定要小心。 您还需要了解的更新是否是因为有人居然改变了价值还是它的,因为值“复制” - 你不希望如果更新复制更新来更新中央实例。
由于MongoDB的3.6的,你现在可以钩行动,改变流。 这给你一个tailable光标,你可以用它来收听特定集合上的变化(例如CRUD操作)。
该变换流是建立在OPLOG的顶部,是正在使用该OPLOG任何访问。 更改流是可恢复的,也可以采用聚集的运营商,如$匹配,$项目中使用...
这里更多的信息(Java示例): http://mongodb.github.io/mongo-java-driver/3.6/driver/tutorials/change-streams/
这里是从片段https://www.mongodb.com/mongodb-3.6 (JAVA):
// 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();
如果你是工作在C#,可以发现的例子在这里 :
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);