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é:
-
vérifier si l'utilisateur dispose de suffisamment d'équilibre; refuser l'accès si il n'y a pas assez de crédit
-
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) -
diminuer les utilisateurs de l'équilibre par le coût du message envoyé
-
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!
Vous devez vous connecter pour publier un commentaire.
De 4.0, MongoDB multi-document de transactions ACID. Le plan est de permettre à ceux dans le jeu de réplicas déploiements en premier, suivie par la fragmenté clusters. Les Transactions dans MongoDB, vous vous sentirez comme les transactions les développeurs connaissent à partir de bases de données relationnelles - ils être multi-déclaration, avec la même sémantique et la syntaxe (comme
start_transaction
etcommit_transaction
). Surtout, les changements de MongoDB qui permettent les transactions n'ont pas d'incidence sur les performances pour les charges de travail qui ne nécessitent pas d'eux.Pour plus de détails, voir ici.
Vivre Sans Transactions
Prise en charge des Transactions L'ACIDE propriétés, mais bien qu'il n'existe pas de transactions en
MongoDB
, nous avons des opérations atomiques. Ainsi, les opérations atomiques signifie que lorsque vous travaillez sur un document unique, que les travaux seront terminés avant tout le monde voit le document. Ils vont en voir de toutes les modifications que nous avons apportées ou aucun d'eux. Et à l'aide d'opérations atomiques, vous pouvez souvent faire la même chose que nous aurions accompli à l'aide de transactions dans une base de données relationnelle. Et la raison en est que, dans une base de données relationnelle, nous avons besoin de faire des changements sur plusieurs tables. Généralement, les tables qui doivent être rejoint et nous voulons faire tout à la fois. Et pour le faire, car il y a plusieurs tables, nous allons commencer une transaction et de faire toutes les mises à jour et puis à la fin de la transaction. Mais avecMongoDB
, nous allons intégrer les données, puisque nous allons pré-rejoindre dans les documents et ce sont ces documents riches qui ont de la hiérarchie. On peut souvent faire la même chose. Par exemple, dans le blog exemple, si nous voulions nous assurer que nous avons mis à jour un blog de façon atomique, nous pouvons le faire parce que nous pouvons mettre à jour l'ensemble du blog à la fois. Où comme si c'était un tas de tables relationnelles, nous aurions probablement d'ouvrir une transaction afin que nous puissions mettre à jour le poste de collecte et de commentaires de la collection.Alors, quelles sont les approches que nous pouvons prendre en
MongoDB
pour pallier à un manque de transactions?Update
,findAndModify
,$addToSet
(à moins d'une mise à jour) &$push
(à moins d'une mise à jour) des opérations de fonctionner automatiquement dans un document unique.Vérifier cette, par Tokutek. Ils développent un plugin pour Mongo qui promet non seulement les transactions, mais aussi le renforcement de la performance.
L'amener au point: si l'intégrité transactionnelle est une doit, puis ne pas utiliser MongoDB, mais uniquement les composants du système à l'appui des opérations. Il est extrêmement difficile de construire quelque chose sur le dessus de la composante dans le but de fournir de l'ACIDE-une fonctionnalité similaire pour les non-ACIDE composants conformes. Selon la personne usecases il peut faire sens pour séparer les actions dans la transaction et de la non-transactionnel des actions d'une certaine façon...
Ce n'est pas vraiment un problème. L'erreur que vous avez mentionné est une logique (bug) ou IO error (réseau, panne de disque). Ce genre d'erreur peut laisser les deux transactionless et transactionnels dans les magasins de non-état cohérent. Par exemple, si elle a déjà envoyé des SMS, mais bien que le stockage de message d'erreur est survenue, il ne peut pas la restauration d'envoi de SMS, ce qui signifie qu'il ne sera pas connecté, l'utilisateur de la balance ne sera pas réduite etc.
Le vrai problème ici est que l'utilisateur peut profiter de la race, de condition et d'envoyer plus de messages que son équilibre permet. Ceci s'applique également aux SGBDR, à moins que vous ne l'envoi de SMS à l'intérieur de la transaction avec l'équilibre champ de verrouillage (ce qui serait un grand goulot d'étranglement). Une solution possible pour MongoDB serait à l'aide de
findAndModify
abord à la réduction de l'équilibre et de vérifier, si c'est négatif interdire l'envoi et de rembourser le montant atomiques (incrément). Si elle est positive, continuer à envoyer et en cas d'échec éventuel du montant du remboursement. Le solde de l'histoire de la collection peut être également maintenue pour aider à corriger/vérifier l'équilibre de terrain.Le projet est simple, mais vous devez prendre en charge les transactions de paiement, ce qui rend la chose difficile. Ainsi, par exemple, un complexe système de portail avec des centaines de collections (forum, chat, annonces, etc...) est à certains égards plus simple, parce que si vous perdez un forum ou un chat entrée, personne ne se soucie vraiment. Si vous avez, d'autre part, la perdre une opération de paiement qui est un problème grave.
Donc, si vous voulez vraiment un projet pilote pour MongoDB, choisissez-en un qui est simple dans la que respect.
Transactions sont absents dans MongoDB pour des raisons valables. C'est une de ces choses qui font de MongoDB plus rapide.
Dans votre cas, si la transaction est un must, mongo semble pas un bon ajustement.
Peut être RDMBS + MongoDB, mais qui va ajouter de la complexité et de la, il sera plus difficile à gérer et à soutenir l'application.
C'est probablement le meilleur blog que j'ai trouvé concernant la mise en œuvre de la transaction comme caractéristique pour mongodb .!
Synchronisation Drapeau: le meilleur pour juste copier les données à partir d'un document maître
Travail de la File d'attente: très polyvalent, résout 95% des cas. La plupart des systèmes ont besoin d'avoir au moins une file d'attente de travail autour de toute façon!
Deux phases de validation: cette technique s'assurer que chaque entité a toujours toutes les informations nécessaires pour arriver à un état cohérent
Journal de la Réconciliation: le plus technique robuste, idéal pour les systèmes financiers
Versions: fournit une isolation et soutient des structures complexes
Lire ceci pour plus d'info: https://dzone.com/articles/how-implement-robust-and