2010-06-24 1 views
1

scénario est simple à décrire, mais pourrait avoir une réponse complexe:MySQL: comment assurer l'intégrité dans l'architecture lecture multiple ne

Imaginez un cas où vous avez une écriture seule base de données MySQL. Ensuite, vous avez environ 5 ou 6 bases de données en lecture seule. La base de données d'écriture a un compte pour un inventaire particulier. Vous avez des centaines de milliers d'utilisateurs qui claquent sur cet article en particulier, mais seulement en quantité limitée. Pour l'amour de l'argument, disons 10 éléments.

Quelle est la meilleure façon de s'assurer que seulement 10 articles sont vendus? S'il y a même un delta de 200 ms entre le moment où les esclaves en lecture seule sont mis à jour, l'intégrité du compte ne peut-elle pas disparaître, et donc vendre un inventaire que vous n'avez pas?

Comment pourriez-vous résoudre/mettre à l'échelle ce problème?

+0

Inventaire allant en dessous de zéro est commun dans la réalité - le truc est en rupture de stock. En tant qu'entreprise, n'accepteriez-vous vraiment $ que parce que vous n'avez pas l'article en main? ;) –

+0

Plus ou moins c'est un problème avec ma question plus que tout. J'ai juste inventé un scénario hypothétique dont je voulais en savoir plus. – randombits

+0

@OMG Poneys: tout dépend de l'activité. Si l'article est rare et en rupture de stock et s'il y a des délais de livraison, vous ne voudrez peut-être pas risquer d'accepter $ :) –

Répondre

1

La solution de base pour les utilisateurs simultanés couvrira probablement cela aussi. À un certain moment dans la transaction «acheter», vous devez décrémenter l'inventaire (sur le serveur d'écriture). Quelle que soit la méthode utilisée, l'inventaire ne peut pas être inférieur à zéro.

S'il reste un article et que deux personnes tentent de l'acheter, il n'y aura pas de chance.

La latence de réplication est exactement la même chose. Deux utilisateurs voient un produit disponible, mais au moment où ils essayent de l'acheter, c'est parti. Une bonne solution pour ce scénario couvre à la fois la latence de réplication et un utilisateur qui arrache simplement le dernier élément d'un autre utilisateur.

0

Tout dépend de quand et de quelle fenêtre vous décidez de verrouiller la table principale pour la mise à jour.

A. Si vous devez être sûr à 100% qu'un article sera acheté seulement quand il est sûrement disponible. Vous devrez verrouiller l'article pour l'utilisateur particulier dès que vous le listerez (ce qui signifie que vous diminuerez temporairement le stock de stock).

B. Si vous êtes autorisé à en montrer un "Désolé, nous venons de épuisé "message. vous devriez verrouiller l'article juste avant de facturer (bien, vous pourriez le faire après que la transaction soit terminée, mais au prix d'un client très furieux)

Je choisirais l'approche A pour le verrouillage, et pourrait être un «vendeur bientôt "avertissement pour les articles avec des stocks très bas à gauche. (Si c'est une situation très fréquente, vous pouvez aussi compter le nombre d'utilisateurs simultanés qui touchent l'objet et donner un avertissement plus précis)

Du point de vue commercial, vous ne voudriez pas être si peu en stock (inférieur au nombre d'acheteurs simultanés) Ceci est inévitable bien sûr à "noël" fois quand il est possible d'être en rupture de stock :)

Questions connexes