幂等是什么?
百度百科:
幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。
在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的.更复杂的操作幂等保证是利用唯一交易号(流水号)实现.
幂等来源于数学概念:
单目运算中,x为某集合中的任意数,f为运算子,如果满足f(x)=f(f(x)),那么f运算就是幂等的。
幂等性是系统接口的一种承诺,承诺只要调用接口成功,多次相同的输入会有相同的结果反馈和等同一次处理的影响力。声明为幂等的接口会认为外部调用失败是常态,并且失败后必然会有重试。
简单的说,幂等测试就是验证数据一致性和事务完整性,通常我们会说防重放。
为什么要做幂等测试?
用户重复提交——非常容易发生,前端、后端均需要控制;
网络重发——容易遗漏,但有可能发生;
消息重发——容易遗漏,但有可能发生;
系统间重试——需要根据业务情况来判断是否需要重试,哪些情况哪些系统需要重试;
所以说保证接口的幂等性是非常重要的。
怎么做幂等?
在涉及资金的系统中,如:银行、电商系统,幂等问题有着十分重要的地位,比如我们定义一个接口withdraw,
bool withdraw(accountId, amount)
withdraw的语义是从accountId对应的账户中扣除amount数额的钱;如果扣除成功则返回true,账户余额减少amount;如果扣除失败则返回false,账户余额不变。
一种典型的情况是withdraw请求已经被服务器端正确处理,但服务器端的返回结果由于网络等原因被丢掉了,导致客户端无法得知处理结果。如果是在交互设计或者前端展示上处理的不够好,用户会以为这次操作执行失败,然后刷新页面或者重复提交请求,这就导致了withdraw被调用两次,账户也被多扣了一次钱。整个过程如下图所示:
为解决此问题,需要对接口进行幂等性改造,增加一个唯一ID参数,如:
bool idempotent_withdraw(uniqId,accountId,amount)
这个ID需要全局唯一的标识一次请求,客户端的同一个业务请求只有一个uniqId,服务端在收到请求后去检查一下是否已存在这个 uniqId并且执行成功了,如果执行成功就不会再处理第二次的调用请求,如此就避免了重复扣款的问题。
总体而言,在技术实现上,控制幂等问题的关键在于唯一键+状态机。首先,调用者在请求中携带一个唯一ID,这个ID唯一的标识一个工作单元,这个工作单元只允许被成功执行一次。
其次,接受者在收到请求,获得唯一ID时,要先去查询这个ID所标识的工作单元是否被执行过。 检查是否执行的逻辑通常是根据唯一请求ID ,在服务端查询请求是否有记录,是否有对应的响应信息,如果有,直接把响应信息查询后返回;如果没有,那么就当做新请求去处理。
幂等测试关注点
(1)需要更多的关注业务性质和产品设计上,是否需要做到幂等,是时间维度的幂等还是空间维度的幂等;
(2)接口的幂等测试一定不能遗漏,由于幂等场景相对容易制造出来,幂等测试的难度远远小于并发测试,因此在做接口测试时不妨对每个接口都思考一下是否需要幂等,需要的话就测试一下其幂等性;
(3)业务场景,特别是涉及到资金流动的业务场景,对失败重试机制一定要慎重;
(4)前端幂等测试,注意按钮的多次快速点击;
(5)后端幂等测试,就是接口的幂等测试,使用postman或jmeter多次发送同一参数的请求,查看服务端响应。
参考文档:
共同学习,写下你的评论
评论加载中...
作者其他优质文章