2014-09-16 4 views
1

Je suis complètement nouveau à node.js et mongodb et j'ai une question concernant la synchronisation de plusieurs demandes qui se produisent dans la même période. J'ai déjà lu quelques discussions concernant ce sujet, mais je ne l'ai pas trouvé une réponse satisfaisante encore ...mongodb synchroniser les demandes

Je le scénario suivant:

Les documents dans ma collection ont une propriété de l'État. Sur demande, je sélectionne un document basé sur l'état et met à jour l'état par la suite. Le problème est maintenant s'il y a plusieurs demandes en même temps toutes les demandes sélectionneraient le même document parce que la première mise à jour n'est pas encore écrite à la DB mais chaque demande devrait obtenir un "propre document" pour travailler avec.

Est-ce que c'est une bonne idée d'utiliser node.js et mongodb pour cette exigence ou devrais-je m'en tenir aux approches «classiques» du SGBDR?

Mon objectif principal est l'évolutivité, c'est la raison pour laquelle j'ai choisi node.js et mongodb en premier lieu.

Je suis très thankfull pour chaque conseil que vous pourriez me donner, Cordialement

+0

Assurez-vous que "commander" dans les opérations de la base de données est quelque chose qui n'est pas si facile. Dans ce cas, vous pouvez envisager d'utiliser un contrôleur Singleton et des opérations de blocage (commande synchronisée dans Java par exemple). Parce que Node.js est Event Driven, il est plus difficile de contrôler l'ordre dans lequel l'événement sera traité. Faire quelque chose de similaire dans Node.js ira à l'encontre de sa nature. –

+0

ok, merci pour votre info! J'ai pensé quelque chose comme ça ... alors je vais utiliser un contrôleur Singleton – metabolic

Répondre

1

Vous pouvez modéliser ce modèle d'accès simultané totalement dans le client (contrôleur singleton, etc.) ou en utilisant des capacités MongoDB. Pour ce modèle dans la base de données, envisager une structure de document comme suit (exemples réalisés dans la coquille mongo):

{ "_id" : 1, "type" : "bathroom", "occupied" : false } 

Quand le fil 65 a besoin d'utiliser la salle de bain, il émet une requête findAndModify et marque la salle de bains, il est retourné comme occupé:

> var thread65_wc = db.restrooms.findAndModify(
     { "query" : { "type" : "bathroom", "occupied" : false }, 
      "update" : { "$set" : { "occupied" : true } } }) 

findAndModify est atomique. Il récupère le document et définit occupied : true sans possibilité pour un autre thread d'essayer d'utiliser la même salle de bains ou de le modifier une fois que thread65 commence à le regarder (en supposant que les autres threads vérifient occupied). fil maintenant 65 peut utiliser la salle de bain et, une fois fait avec elle, quitter et potentiellement modifier d'autres propriétés:

> db.restrooms.update({ "_id" : thread65_wc._id }, 
         { "$set" : { "occupied" : false, "dirty" : "very" } }) 

En utilisant findAndModify et un drapeau occupied vous pouvez assurer que chaque thread obtient un document à travailler avec et que ce document n'est pas touché par un autre fil pendant l'utilisation du fil d'origine.

Questions connexes