幂等性是分布式系统设计中十分重要的概念,具有这一性质的接口在设计时总是秉持这样的一种理念:调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。
一、什么是接口幂等性
幂等性原本是数学上的概念,即使公式:f(x)=f(f(x)) 能够成立的数学性质。用在编程领域,则意为对同一个系统,使用同样的条件,一次请求和重复的多次请求对系统资源的影响是一致的。
幂等性是分布式系统设计中十分重要的概念,具有这一性质的接口在设计时总是秉持这样的一种理念:调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。
幂等有两个维度:一是空间维度上的幂等,即幂等对象的范围,是个人还是机构,是某一次交易还是某种类型的交易,二是时间维度上的幂等,即幂等的保证时间,是几秒、几分钟还是永久性的。
不同的需求,会有不一样的解决方案,难度和成本也不一样。
二、为什么需要幂等性
业务开发中,经常会遇到重复提交的情况,无论是由于网络问题无法收到请求结果而重新发起请求,或是前端的操作抖动而造成重复提交情况。 在交易系统,支付系统这种重复提交造成的问题有尤其明显,比如:
- 用户在APP上连续点击了多次提交订单,后台应该只产生一个订单;
- 向支付宝发起支付请求,由于网络问题或系统BUG重发,支付宝应该只扣一次钱。 很显然,声明幂等的服务认为,外部调用者会存在多次调用的情况,为了防止外部多次调用对系统数据状态的发生多次改变,将服务设计成幂等。
三、幂等的不足
幂等是为了简化客户端逻辑处理,却增加了服务提供者的逻辑和成本,是否有必要,需要根据具体场景具体分析,因此除了业务上的特殊要求外,尽量不提供幂等的接口。
1. 增加了额外控制幂等的业务逻辑,复杂化了业务功能;
2. 把并行执行的功能改为串行执行,降低了执行效率。
延伸阅读
保证幂等性的方法
按钮只可操作一次,一般是提交后把按钮置灰或者loading状态,按钮置灰或loading状态可以使用一些js组件实现,消除用户因为重复点击而产生的副作用,比如添加操作,由于点击两次而产生的两条记录。
token机制
产品上允许重复提交,但要保证重复提交不产生副作用,比如点击n次只产生一条记录;具体实现就是进入页面时申请一个token,然后后面所有的请求带上这个token,根据token来避免重复请求;
使用Post/Redirect/Get模式
在提交后执行页面重定向,这就是所谓的Post-Redirect-Get(PRG)模式,简言之,当用户提交了表单后,去执行一个客户端的重定向,转而提交成功信息页面,这样避免用户按f5刷新导致的重复提交,而其也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进和后退按导致的同样重复提交的问题;
在Session中存放特殊标志
在服务器端,生成一个少数的标识符,将它存入session,同时将他写入表单的隐藏中,然后将表单页面发给浏览器,用户输入信息后点击提交,在服务器端,获取表单中隐藏的字段的值,与session中的少数标识符相比较,相等说明是首次提交,就处理本次请求,然后将session中的少数标识符移除,不相等则表示重复提交,不再做处理
文章标题:什么是接口幂等性,发布者:E.Z,转载请注明出处:https://worktile.com/kb/p/62280