Je crée une sorte de système de file d'attente de travaux en arrière-plan avec MongoDB comme magasin de données. Comment puis-je «écouter» les insertions d'une collection MongoDB avant de générer des travailleurs pour traiter le travail? Dois-je interroger toutes les quelques secondes pour voir s'il y a des changements par rapport à la dernière fois, ou existe-t-il un moyen pour mon script d'attendre les insertions? Il s'agit d'un projet PHP sur lequel je travaille, mais n'hésitez pas à répondre en Ruby ou en langage agnostique.
200
Réponses:
Ce à quoi vous pensez ressemble beaucoup à des déclencheurs. MongoDB ne prend pas en charge les déclencheurs, cependant certaines personnes ont "roulé les leurs" en utilisant quelques astuces. La clé ici est l'oplog.
Lorsque vous exécutez MongoDB dans un jeu de réplicas, toutes les actions MongoDB sont enregistrées dans un journal des opérations (appelé oplog). L'oplog est simplement une liste en cours d'exécution des modifications apportées aux données. Les jeux de répliques fonctionnent en écoutant les modifications sur cet oplog, puis en appliquant les modifications localement.
Cela vous semble-t-il familier?
Je ne peux pas détailler l'ensemble du processus ici, il s'agit de plusieurs pages de documentation, mais les outils dont vous avez besoin sont disponibles.
D'abord quelques articles sur l'oplog - Brève description - Présentation de la
local
collection (qui contient l'oplog)Vous voudrez également utiliser les curseurs disponibles . Ceux-ci vous fourniront un moyen d'écouter les changements au lieu de les interroger. Notez que la réplication utilise des curseurs disponibles, c'est donc une fonctionnalité prise en charge.
la source
--replSet
option et il créera / remplira leoplog
. Même sans secondaire. C'est certainement la seule façon «d'écouter» les changements dans la base de données.MongoDB a ce qu'on appelle
capped collections
ettailable cursors
qui permet à MongoDB de pousser les données vers les écouteurs.A
capped collection
est essentiellement une collection de taille fixe et n'autorise que les insertions. Voici à quoi cela ressemblerait pour en créer un:Curseurs MongoDB Tailable ( message original de Jonathan H. Wage )
Rubis
PHP
Python (par Robert Stewart)
Perl (par Max )
Ressources supplémentaires:
Ruby / Node.js Tutorial qui vous guide à travers la création d'une application qui écoute les insertions dans une collection plafonnée MongoDB.
Un article qui parle plus en détail des curseurs disponibles.
Exemples PHP, Ruby, Python et Perl d'utilisation de curseurs disponibles.
la source
Depuis MongoDB 3.6, il y aura une nouvelle API de notifications appelée Change Streams que vous pouvez utiliser pour cela. Voir cet article de blog pour un exemple . Exemple:
la source
Découvrez ceci: Modifier les flux
10 janvier 2018 - Version 3.6
* EDIT: j'ai écrit un article sur la façon de procéder https://medium.com/riow/mongodb-data-collection-change-85b63d96ff76
https://docs.mongodb.com/v3.6/changeStreams/
C'est nouveau dans mongodb 3.6 https://docs.mongodb.com/manual/release-notes/3.6/ 2018/01/10
Pour utiliser changeStreams, la base de données doit être un jeu de réplication
Votre base de données sera un " autonome " par défaut.
L' exemple suivant est une application pratique de la façon dont vous pouvez l'utiliser.
* Spécifiquement pour Node.
Liens utiles:
https://docs.mongodb.com/manual/tutorial/convert-standalone-to-replica-set
https://docs.mongodb.com/manual/tutorial/change-streams-example
https://docs.mongodb.com/v3.6/tutorial/change-streams-example
http://plusnconsulting.com/post/MongoDB-Change-Streams
la source
MongoDB version 3.6 inclut désormais des flux de modifications qui sont essentiellement une API au-dessus de l'OpLog permettant des cas d'utilisation de type déclencheur / notification.
Voici un lien vers un exemple Java: http://mongodb.github.io/mongo-java-driver/3.6/driver/tutorials/change-streams/
Un exemple NodeJS pourrait ressembler à quelque chose comme:
la source
Vous pouvez également utiliser la méthode Mongo FindAndUpdate standard et, dans le rappel, déclencher un événement EventEmitter (dans Node) lorsque le rappel est exécuté.
Toute autre partie de l'application ou de l'architecture écoutant cet événement sera informée de la mise à jour, et toutes les données pertinentes y seront également envoyées. C'est un moyen très simple d'obtenir des notifications de Mongo.
la source
Beaucoup de ces réponses ne vous donneront que de nouveaux enregistrements et non des mises à jour et / ou sont extrêmement inefficaces
La seule manière fiable et performante de le faire est de créer un curseur disponible sur la collection db: oplog.rs locale pour obtenir TOUTES les modifications de MongoDB et faire avec ce que vous voulez. (MongoDB le fait même plus ou moins en interne pour prendre en charge la réplication!)
Explication de ce que contient l'oplog: https://www.compose.com/articles/the-mongodb-oplog-and-node-js/
Exemple d'une bibliothèque Node.js qui fournit une API autour de ce qui est disponible pour être fait avec l'oplog: https://github.com/cayasso/mongo-oplog
la source
Il existe un ensemble impressionnant de services disponibles appelé MongoDB Stitch . Examinez les fonctions / déclencheurs de points . Notez qu'il s'agit d'un service payant basé sur le cloud (AWS). Dans votre cas, sur un insert, vous pouvez appeler une fonction personnalisée écrite en javascript.
la source
Il existe un exemple de java fonctionnel qui peut être trouvé ici .
La clé est QUERY OPTIONS donnée ici.
Vous pouvez également modifier la requête de recherche, si vous n'avez pas besoin de charger toutes les données à chaque fois.
la source
En fait, au lieu de regarder la sortie, pourquoi vous ne recevez pas d'avis quand quelque chose de nouveau est inséré en utilisant un middleware fourni par le schéma mangouste
Vous pouvez attraper l'événement d'insérer un nouveau document et faire quelque chose après cette insertion
la source
Après 3.6, on est autorisé à utiliser la base de données, les types de déclencheurs de base de données suivants:
Connectez-vous à votre compte Atlas et sélectionnez l'
Triggers
interface et ajoutez un nouveau déclencheur:Développez chaque section pour plus de paramètres ou de détails.
la source