2012-04-04 12 views
7

sto provando a utilizzare mongodb come memoria di configurazione di rete. Questa stessa app viene eseguita su più macchine sulla rete, ciascuna estrae la propria configurazione dal proprio mongodb locale. I moduli musicali sono sincronizzati. Quello che mi piacerebbe è ottenere un callback/notifica in tutte le app n-1 se un'applicazione modifica uno qualsiasi dei valori di configurazione. Questo tipo di installazione è possibile?Ricevi notifiche per i documenti modificati in mongodb

(Sarebbe salvami da fare il trasferimento della rete/syncronisation ecc me stesso.)

risposta

9

MongoDB non dispone ancora di trigger, ma è possibile agganciare l'applicazione per coda fuori la raccolta oplog e fare qualcosa ogni volta un documento viene eliminato (o l'aggiornamento, oppure inserito, ecc)

Il blog 3 parte post qui potrebbe essere utile su come fare questo: http://www.kchodorow.com/blog/2010/10/12/replication-internals/

+1

Questo link è morto ora. – captncraig

+1

Grazie per avermelo fatto notare. L'ho risolto nel post. – Sid

2

Cosa vuoi dire che i mongodbs sono sincronizzati? Stanno davvero replicando i dati tra di loro? Presumo non dal momento che sembra che tu voglia gestire questa sincronizzazione.

In passato, ho realizzato qualcosa di simile con MongoDB e asp che richiede un'istanza di mongo centralizzata (coppia di repliche, ecc.). In pratica, ogni volta che viene apportata una modifica all'istanza locale, viene aggiornata anche una raccolta limitata sull'istanza centrale con la nuova versione del valore di configurazione e un timestamp di quando quest'ultimo è stato aggiornato l'ultima volta e quale server ha aggiornato il valore.

Un thread separato viene quindi eseguito sui singoli server che mantiene un cursore tessibile aperto contro l'istanza centrale. Ogni volta che un nuovo record viene recuperato dal cursore, i nuovi valori vengono confrontati con il timestamp dell'istanza locale e aggiornati di conseguenza (o meno). Occorre fare attenzione quando si confrontano il timestamp e il server "autorevole" che ha apportato la modifica per assicurarsi che non si verifichi una tempesta di aggiornamento. È inoltre necessario sapere se l'aggiornamento è dovuto al fatto che qualcuno ha effettivamente modificato il valore o se è perché il valore è stato "replicato": non si desidera aggiornare l'istanza centrale se l'aggiornamento è un aggiornamento di replica.

0

A partire da mongodb 3.6, è ora possibile agganciare le azioni al flusso di modifiche. Questo ti dà un cursore t disponibile che puoi usare per ascoltare le modifiche (ad esempio operazioni di crudismo) su una particolare collezione.

Il flusso di modifiche è stato creato sopra l'oplog ed è accessibile a qualsiasi cosa stia utilizzando l'oplog. Modificare flussi sono resumable e può anche essere utilizzato con gli operatori di aggregazione come $ match, $ progetto ...

Maggiori informazioni qui (Java esempio): http://mongodb.github.io/mongo-java-driver/3.6/driver/tutorials/change-streams/

Ed ecco il frammento 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(); 

Se si lavora in C#, esempi possono essere trovati 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); 
Problemi correlati