当前位置:网站首页>幂等性实践操作,基于业务讲解幂等性
幂等性实践操作,基于业务讲解幂等性
2022-04-23 03:15:00 【小道仙97】
之前面试也提到过关于幂等的问题,自己百度查了关于它的概念倒是很简单,但就一直不是很理解,今天和人讨论一下,然后再自己结合实际理解了一下。
-
幂等概念来自数学,表示N次变换和1次变换的结果是相同的。这里讨论在某些场景下,客户端在调用服务没有达到预期结果时,会进行多次调用,为避免多次重复的调用对服务资源产生副作用,服务提供者会承诺满足幂等。
-
HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的副作用(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。
-
简单来说就是:多次调用同一个接口,返回的结果是同样的。
其实我们在实际代码中可能已经做过了幂等但是因为不知道这个概念导致我们不清楚(其实这样的情况还挺多)
单说概念可能大家并不是很理解,下面举两个例子,一个是我同事给我讲的,一个是我之前的实际例子。
一、
在工单系统里面有一个接单的操作,一个工单可以派发给多个人,每个人都可以接单,规则是谁先接到就算谁的。
如果我们不对其进行幂等处理那就会发生第二个人覆盖了第一个人的接单。
错误操作如下:
工单下派给A、B两个人,然后A、B同时进入接单界面,这时候A接单了,但是B来电话了,他去接电话,接完电话他还停留在接单界面,然后他也接单了。
改造如下:
- 每次进来先获取Redis里面的 key,判断是否存在,如果不存在就继续往下走
- 判断当前工单的状态,是否等于待接收,如果是继续往下走
- 使用工单id作为 key 存入Redis里面去(分布式锁实现)
- 执行一系列的业务逻辑
- 删除Redis里面的key
伪代码实现:
public String fun(String id) {
if (RedisUtils.get(id) != null) {
return "该工单已被接收";
}
RedisUtils.put(id,id);
if (testDao.getStateById(id) != 3) {
return "该工单已被接收";
}
// 执行具体的业务逻辑
//......
if (RedisUtils.get(id) != null) {
RedisUtils.delete(id);
}
return "操作成功";
}
二、
这是一个典型的支付场景:用户支付下单场景,理论上一个订单用户只能支付一次,但是如果不做幂等处理就可能支付多次。
错误操作如下:
因为网络或者各种原因卡住了,用户刷新页面再次点击支付,这样会造成支付两次的情况
改造如下:
- 每次点击支付后锁住按钮。(但是刷新页面会导致解开锁)
- 支付完成后返回给前端,前端跳到支付成功页面。
- 每次进来先获取Redis里面的 key,判断是否存在,如果不存在就继续往下走
- 判断当前订单的状态,是否等于待支付,如果是继续往下走
- 使用订单id作为 key 存入Redis里面去(分布式锁实现)
- 执行一系列的业务逻辑
- 删除Redis里面的key
这个和上面的代码实现如出一辙就不再写了。
版权声明
本文为[小道仙97]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Tomwildboar/article/details/118807634
边栏推荐
- 2022山东省安全员C证上岗证题库及在线模拟考试
- Chapter 9 of C language programming (fifth edition of Tan Haoqiang) analysis and answer of exercises for users to establish their own data types
- Source generator actual combat
- The backtracking of stack is used to solve the problem of "the longest absolute path of file"
- 《C语言程序设计》(谭浩强第五版) 第7章 用函数实现模块化程序设计 习题解析与答案
- Configuration table and page information automatically generate curd operation page
- Iotos IOT middle platform is connected to the access control system of isecure center
- Mysql database, inconsistent index character set, slow SQL query, interface timeout
- Fundamentals of software testing and development
- Use of ADB command [1]
猜你喜欢

be based on. NETCORE development blog project starblog - (1) why do you need to write your own blog?

编码电机PID调试(速度环|位置环|跟随)

数据挖掘系列(3)_Excel的数据挖掘插件_估计分析

Course design of Database Principle -- material distribution management system

“如何实现集中管理、灵活高效的CI/CD”在线研讨会精彩内容分享

Xutils3 corrected a bug I reported. Happy

手机连接电脑后,QT的QDIR怎么读取手机文件路径

2022G2电站锅炉司炉考试题库及在线模拟考试

Yes Redis using distributed cache in NE6 webapi

PID debugging of coding motor (speed loop | position loop | follow)
随机推荐
准备一个月去参加ACM,是一种什么体验?
研讨会回放视频:如何提升Jenkins能力,使其成为真正的DevOps平台
使用split来解决“最常见的单词”问题
js递归树结构计算每个节点的叶子节点的数量并且输出
Huawei mobile ADB devices connection device is empty
This new feature of C 11, I would like to call it the strongest!
[MySQL] left function | right function
Tencent video price rise: earn more than 7.4 billion a year! Pay attention to me to receive Tencent VIP members, and the weekly card is as low as 7 yuan
First in the binary tree
手机连接电脑后,QT的QDIR怎么读取手机文件路径
2022山东省安全员C证上岗证题库及在线模拟考试
C syntax sugar empty merge operator [?] And null merge assignment operator [? =]
Laravel8- use JWT
Use split to solve the "most common words" problem
C read / write binary file
Mise en service PID du moteur de codage (anneau de vitesse | anneau de position | suivant)
A set of C interview questions about memory alignment. Many people make mistakes!
svg标签中利用<polygon/>循环数组绘制多边形
全网最全,接口自动化测试怎么做的?精通接口自动化测试详解
Aspnetcore configuration multi environment log4net configuration file