Maison > Article > base de données > Résoudre le problème de l'inventaire survendu dans Redis
MQ est utilisé entre les biens et les services de commande
Lorsque l'inventaire des biens et services change, le service de commande l'inventaire est notifié via le changement MQ.
Processus de synchronisation d'origine
// 原始的MySQL同步流程// 判断此代金券是否加入抢购SeckillVouchers seckillVouchers = seckillVouchersMapper.selectVoucher(voucherId);AssertUtil.isTrue(seckillVouchers == null, "该代金券并未有抢购活动");// 判断是否有效AssertUtil.isTrue(seckillVouchers.getIsValid() == 0, "该活动已结束");// 插入数据库seckillVouchersMapper.save(seckillVouchers);
Recommandé (gratuit) : redis
Déduire l'inventaire directement lorsqu'une commande est générée. C'est le système de déduction d'inventaire le plus original. Il est relativement simple, mais il y a des
problèmes<.>
Asynchronisation MQ
Considérez d'abord l'asynchrone uniquement l'étape 4.
Analyse2 et 4 sont toutes des opérations sur la base de données. L'étape 4 n'attend plus. Les commentaires seront donnés à l'utilisateur immédiatement après le succès des étapes 1. , 2 et 3.
Après cela, la commande sera passée de manière asynchrone via le service de notification de message. Si le placement de commande asynchrone échoue à l'étape 4, réessayez l'opération et essayez de régénérer la commande. Les messages MQ peuvent également être retracés.
Une fois la commande créée, elle est dans l'état de file d'attente, puis le service publie un événement dans la file d'attente des messages.
Autrement dit, le service de commande envoie un message au monde extérieur : j'ai créé une commande, qui a été transmise par MQ au service qui a souscrit au message. Order Created
Si le service produit reçoit le message de création de commande, il effectuera l'opération de déduction des stocks. Notez que la déduction des stocks peut échouer en raison de certains facteurs de force majeure. Quel que soit le succès ou l'échec, le service produit enverra un message de déduction des stocks à MQ, et le contenu du message est le résultat de la déduction des stocks.
已确认
Si la déduction d'inventaire échoue, modifiez le statut de la commande en 已取消
L'inventaire est enregistré dans Redis
先扣redis库存
不扣除mysql库存
Lorsque l'inventaire Redis est déduit, le produit ne peut pas être commandé et la commande échouera, la couche externe est donc bloquée. 扣除redis库存成功后
出库过程
: 扣除mysql库存
avant le paiement est
, est, c'est le processus de verrouillage de l'inventaire 预扣
Il est effectivement déduit après le paiement, 扣redis库存
, garantissant que l'inventaire est finalement cohérent 扣mysql库存
Cependant, dans dans les cas extrêmes, il y aura des incohérences de données
L'inventaire de la base de données et l'inventaire Redis sont incohérents, comment le détecter ? Si une incohérence est détectée, comment synchroniser Je n'ai pas trouvé de bon plan Il s'agit d'un problème avec le mécanisme de mise à jour du cache de synchronisation de la base de données 12306<.> pour déduire d'abord l'inventaire dans le cache. Une fois la déduction réussie, l'inventaire dans MySQL peut ensuite être déduit. Si l'inventaire dans le cache ne parvient pas à être déduit, il sera bloqué et un inventaire insuffisant sera renvoyé. Ces requêtes ne seront pas perforées dans MySQL, bloquant la majeure partie de la pression des requêtes.
Une méthode plus violente consiste à trouver un période de pointe faible, comme à 1 heure du matin, couverture forcée périodique. Cependant, dans des cas extrêmes, il peut encore y avoir des inexactitudes après la synchronisation. Par exemple, pendant le processus de synchronisation, une commande est payée avec succès, l'inventaire MySQL est déduit pendant le processus sortant, mais le paiement est effectué. L'inventaire Redis n'est pas déduit
C'est un problème de conception logique cohérente缓存数 = 数据库库存数 - 待扣数
Bien sûr, il y en a. d'autres solutions, ainsi que des considérations En fonction du niveau d'exigences de cohérence, des solutions simples ou complexes peuvent être utilisées
Cela dépend de la complexité du système. Plus le système est grand, plus il sera détaillé
Pour. exemple, le numéro à déduire peut être placé dans une file d'attente ou mis en cache Il y a aussi un décompte à l'intérieur, il suffit de lire le décompte directement
Par exemple, si vous le mettez en mongo, la quantité qui a été payée et qui doit être Les expéditions ne sont généralement pas très volumineuses. Si vous le comptez, vous ne perdrez pas grand-chose
Par conséquent, le système général ne peut pas être complètement Pour garantir que la chaîne de données ne commet pas d'erreurs, il doit y avoir une compensation, c'est-à-dire des erreurs. peut être corrigé
Le coût pour s'assurer qu'il n'y a pas d'erreurs est évidemment trop élevé
La synchronisation a un mécanisme de rafraîchissement, qui peut être planifié, soit via MQ, soit par surveillance Non synchronisé et ainsi de suite. . .
Également appelé assurer la fraîcheur des données mises en cache
Généralement, cela ne prend pas trop de temps, cela peut prendre une demi-heure ou quelques minutes Différents scénarios ont des besoins différents Lors du cache. l'inventaire est supérieur à l'inventaire de la base de données. S'il y en a trop, il apparaîtra qu'il y a des tickets dans la requête, mais la commande ne peut pas être passée. Lors de la passation de la commande, il est dit que le stock est insuffisant. entraînera une pression excessive sur la base de données. Cependant, 12306 devrait avoir d'autres moyens pour éviter ce problème, mais j'ai effectivement rencontré une situation où j'avais des billets lors de la vérification, mais je ne pouvais pas passer de commande.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!