Comment faire pour contourner l'absence de transactions dans MongoDB?

Je sais qu'il y a des questions similaires ici, mais ils sont soit de me dire pour revenir à la régulière systèmes SGBDR si j'ai besoin d'opérations ou d'utiliser les opérations atomiques ou validation à deux phases. La deuxième solution semble le meilleur choix. Le troisième, je ne veux pas les suivre, car il semble que beaucoup de choses pourraient aller mal et je ne peux pas le tester dans tous les aspects. Je vais avoir un moment difficile de refactoring mon projet pour effectuer des opérations atomiques. Je ne sais pas si cela vient de mon point de vue limité (j'ai seulement travaillé avec des bases de données SQL jusqu'à présent), ou si elle en fait ne peut pas être fait.

Nous aimerions tester MongoDB au sein de notre société. Nous avons choisi un relativement simple projet d'une passerelle SMS. Il permet à notre logiciel d'envoi de SMS pour le réseau cellulaire et la passerelle ne le sale boulot: en fait, la communication avec les fournisseurs via différents protocoles de communication. La passerelle gère également la facturation des messages. Chaque client qui s'applique pour le service de a à acheter des crédits. Le système diminue automatiquement de l'équilibre de l'utilisateur lorsqu'un message est envoyé et refuse l'accès si le solde est insuffisant. Aussi parce que nous sommes des clients de tiers fournisseurs de SMS, nous pouvons aussi nous avons notre propre soldes avec eux. Nous devons garder la trace de ceux aussi bien.

J'ai commencé à penser comment je peux stocker les données requises avec MongoDB si j'ai coupé une certaine complexité (facturation externe, en file d'attente d'envoi de SMS). Venant du monde SQL, je voudrais créer un tableau distinct pour les utilisateurs, une autre pour les messages SMS, et une pour stocker les transactions concernant les utilisateurs de l'équilibre. Disons que je créer des collections pour tous ceux dans MongoDB.

Imaginer un SMS l'envoi de la tâche avec les étapes suivantes dans ce système simplifié:

  1. vérifier si l'utilisateur dispose de suffisamment d'équilibre; refuser l'accès si il n'y a pas assez de crédit

  2. d'envoyer et de stocker le message dans la collection de SMS avec les détails et le coût (dans le système live le message aurait un status attribut et d'une tâche de ramasser pour la livraison et le prix des SMS en fonction de son état actuel)

  3. diminuer les utilisateurs de l'équilibre par le coût du message envoyé

  4. journal de la transaction dans l'opération de collecte de

Maintenant, quel est le problème avec ça? MongoDB peut faire les mises à jour atomiques sur un seul document. Dans la précédente flux, il pourrait arriver qu'une erreur se glisse dans et le message est stocké dans la base de données, mais l'équilibre de l'utilisateur n'est pas à jour et/ou de la transaction n'est pas connecté.

Je suis venu avec deux idées:

  • Créer une collection unique pour les utilisateurs, et de stocker le reste comme un champ, l'utilisateur opérations et les messages que sous les documents de l'utilisateur dans le document. Parce que nous pouvons mettre à jour les documents de façon atomique, cela résout le problème de transaction. Inconvénients: si l'utilisateur envoie beaucoup de SMS, la taille du document pourrait devenir grand et le 4 MO document limite pourrait être atteint. Je peux peut-être créer de l'historique des documents dans de tels scénarios, mais je ne pense pas que ce serait une bonne idée. Aussi, je ne sais pas à quelle vitesse le système serait si je pousse de plus en plus de données pour le même document.

  • Créer une collection pour les utilisateurs, et un pour les transactions. Il peut y avoir deux types de transactions: achat de crédit avec un solde positif de changement et messages envoyés avec un solde négatif de changement. Transaction peut avoir un sous-document; par exemple, dans messages envoyés les détails de la SMS peut être inclus dans la transaction. Inconvénients: je n'ai pas de magasin de l'utilisateur actuel de la balance donc je dois le calculer à chaque fois qu'un utilisateur tente d'envoyer un message pour dire si le message peut passer ou pas. J'ai peur que ce calcul est devenu lent que le nombre de transactions stockées augmente.

Je suis un peu confus au sujet de la méthode à choisir. Existe-il d'autres solutions? Je ne pouvais pas trouver toutes les meilleures pratiques en ligne sur la façon de contourner ce genre de problèmes. Je suppose que beaucoup de programmeurs qui tentent de se familiariser avec le monde NoSQL sont confrontés à des problèmes similaires dans le début.

  • Pardonnez-moi si je me trompe, mais il semble que ce projet va utiliser une banque de données NoSQL, indépendamment de savoir si il va en bénéficier ou non. NoSQL ne sont pas une alternative à SQL comme une "mode" choix mais pour quand la technologie relationnelle du SGBDR ne correspond pas au problème de l'espace & un magasin de données non relationnel n'. Beaucoup de votre question "Si c'était SQL puis ..." & que les anneaux de sonnette d'alarme pour moi. Tout le NoSQL est venu d'un besoin de résoudre un problème que SQL ne pouvait et ensuite, ils ont été un peu généralisé pour le rendre plus facile à utiliser & puis, bien sûr, le train commence à rouler.
  • Je suis conscient que ce projet n'est pas exactement le meilleur pour essayer de NoSQL. Cependant, j'ai peur si l'on commence à l'utiliser avec d'autres projets (disons une collection de la bibliothèque de logiciels de gestion, parce que nous sommes dans la gestion de la collection) et tout à coup une sorte de demande qui doit transactions (et c'est réellement là, imaginez que l'un des livres est transféré à partir d'une collection à l'autre) nous avons besoin de savoir comment pouvons-nous surmonter le problème. Peut-être que c'est juste moi qui est l'esprit étroit et pense qu'il ya toujours un besoin pour les transactions. Mais il pourrait être un moyen de surmonter ces quelque sorte.
  • Je suis d'accord avec PurplePilot, vous devez choisir une technologie qui s'adapte à une solution, ne pas essayer de greffer une solution qui n'est pas appropriée à un problème. La modélisation des données pour le graphique de bases de données est un tout autre paradigme que le SGBDR de conception et vous avez oublier tout ce que vous savez et réapprendre la nouvelle façon de penser.
  • Je ne comprends pas pourquoi je devrais utiliser l'outil approprié pour la tâche. Mais pour moi, quand j'ai lu les réponses comme celle - ci, il semble que le NoSQL n'est pas bon pour quoi que ce soit où des données est critique. C'est bon pour Facebook ou Twitter, où si certains commentaires se perd, le monde passe, mais rien au-dessus de qui est hors de l'entreprise. Si c'est vrai, je ne comprends pas pourquoi les autres le soin au sujet de la construction par exemple. une boutique en ligne avec MongoDB: kylebanker.com/blog/2010/04/30/mongodb-and-ecommerce Il mentionne que la plupart des opérations peuvent être surmontés avec des opérations atomiques. Ce que je cherche, c'est le comment.
  • Vous dites "il semble que le NoSQL n'est pas bon pour quoi que ce soit où des données est critique" n'est pas le cas lorsqu'il n'est pas bon (peut-être) est transactionnelle de l'ACIDE type de traitement transactionnel. Aussi NoSQL sont conçus pour la distribution de magasins de données SQL magasins de type peut être très difficile à réaliser lorsque vous entrez dans le maître-esclave de réplication de scénarios. NoSQL ont des stratégies pour la cohérence des résultats et de s'assurer que la dernière série de données est utilisé, mais pas ACIDE.
  • Il y a des cas où le droit de la technologie de l'application n'existe tout simplement pas. Je viens d'un SQL de fond et suis en train d'écrire une application qui aura besoin de la transaction et de la base de données de la structure qui conviendrait parfaitement à un SQL DB. donc mon choix est évident ? Bien que pas si, j'ai aussi de très gros volumes de Données et de très haute Lectures et les écritures. Maintenant, après avoir passé quelques temps à la gestion de MySql, Informix et DB2, je sais que la mise à l'échelle est un gros travail, tout en NoSQL DB ont l'avantage de faciliter les opérations de mise à l'échelle. Pour revenir à la question, quel est le "Moins objectable" manière de mettre en place une sorte de transaction avec mongodb ?
  • Merci Dan pour la correction du texte!

InformationsquelleAutor NagyI | 2011-07-09