Maison >Java >JavaQuestions d'entretien >Intervieweur : Dans l'interface de paiement, l'argent ne peut être déduit qu'une seule fois pour les paiements répétés pour la même commande. Comment faire ?
Intervieweur : Dans l'interface de paiement, l'argent ne peut être déduit qu'une seule fois pour les paiements répétés pour la même commande. Comment faire ?
Hier, alors que je faisais une simulation d'interview pour un ami, comment mettre en œuvre l'idempotence d'interface ? Le ton de sa réponse montre qu'il est en train de mémoriser un essai à huit pattes.
Donc, afin de permettre à chacun de découvrir facilement l'implémentation idempotente de l'interface, frère Tian
a organisé cet article aujourd'hui .
Cet article a un total de neuf contenus principaux :
1. Le concept d'idempotence L'imdempotence, en termes simples, est une interface qui initie plusieurs fois la même requête . Il faut s'assurer que l'opération ne peut être exécutée qu'une seule fois, par exemple :
Interface de commande, les commandes ne peuvent pas être créées plusieurs fois
Interface de paiement, les paiements répétés pour la même commande ne peuvent être déduits qu'une seule fois
Interface de rappel Alipay, il peut y avoir plusieurs rappels, les rappels répétés doivent être traités
Interface de soumission de formulaire ordinaire, cliquez sur Soumettre plusieurs fois en raison d'un délai d'attente du réseau et d'autres raisons, ne peut réussir qu'une seule fois et ainsi de suite
2. Solutions communes
Index unique - empêcher nouvelles données sales
mécanisme de jeton - pour empêcher les soumissions répétées de pages
verrouillage pessimiste - verrouillage lors de l'acquisition de données (verrouillage de la table ou de la ligne de verrouillage)
verrouillage optimiste - implémenté en fonction du numéro de version, lorsque mise à jour des données Vérifier les données à un moment donné
Verrouillage distribué - implémentation de redis (jedis, redisson) ou zookeeper
machine d'état - changement d'état, juger de l'état lors de la mise à jour des données
3. Implémentation de cet article
Cet article utilise la deuxième façon de l'implémenter, c'est-à-dire d'implémenter la vérification de l'idempotence de l'interface via le mécanisme Redis + token.
4. Idées de mise en œuvre
Créez un identifiant unique pour chaque demande qui doit garantir l'idempotencetoken, 先获取token, 并将此token存入redis, 请求接口时, 将此token放到header或者作为请求参数请求接口, 后端接口判断redis中是否存在此token :
S'il existe, traitez la logique métier normalement et supprimez-la de redisjeton, alors, s'il s'agit d'une requête répétée, en raison de jeton a été supprimé, il ne peut pas passer la vérification et renvoie Veuillez ne pas répéter l'opérationPrompttoken, 那么, 如果是重复请求, 由于token已被删除, 则不能通过校验, 返回请勿重复操作提示
如果不存在, 说明参数不合法或者是重复请求, 返回提示即可
五、项目简介
Spring Boot
Redis
@ApiIdempotent注解 + 拦截器对请求进行拦截
@ControllerAdvice全局异常处理
压测工具: Jmeter
S'il n'existe pas, cela signifie que le paramètre est illégal ou qu'il s'agit d'une requête répétée, renvoyez simplement le prompt
5. Introduction au projet
🎜Spring Boot🎜🎜🎜🎜Redis🎜🎜🎜🎜@ApiIdempotent annotation + intercepteur intercepte les requêtes 🎜🎜🎜🎜@ControllerAdviceGestion globale des exceptions🎜🎜🎜🎜Outil de test de stress : Jmeter🎜🎜🎜🎜Explication :🎜🎜🎜Cet article se concentre sur l'implémentation de base de l'idempotence, sur la façon dont Spring Boot Les détails de l'intégration de redis, ServerResponse, ResponseCode et d'autres détails dépassent le cadre de cet article.🎜
Dans l'image ci-dessus, vous ne pouvez pas simplement supprimer le jeton directement sans vérifier si la suppression est réussie, car il y aura des problèmes de sécurité de concurrence, car, Il est possible que plusieurs threads puissent atteindre la ligne 46 en même temps, le jeton n'a pas été supprimé, donc l'exécution continue si le résultat de la suppression de jedisUtil.del(token) n'est pas vérifié et directement publié, le problème de la répétition. la soumission aura toujours lieu, même s'il n'y a en réalité qu'une véritable opération de suppression, reproduisez-la ci-dessous.
Modifiez légèrement le code :
Demande à nouveau
Regardez à nouveau la console
Bien qu'un seul des jetons soit réellement supprimé, le résultat de la suppression n'étant pas vérifié, il reste toujours Les problèmes de concurrence doivent donc être vérifiés
9. Résumé
En fait, l'idée est très simple, c'est-à-dire que chaque demande est garantie unique, donc 保证幂等性, 通过拦截器+注解, 就不用每次请求都写重复代码, 其实也可以利用Spring AOP réalisée.
D'accord, je vais le partager ici aujourd'hui.
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!
Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer