幂等性的概念幂等性本来就是一个数学概念,即使公式:f(f(x))=f(x)可以成立为数学性质。用在编程领域,是指对于同一个系统,使用相同的条件,一次请求和重复多次请求对系统资源的影响是一样的。幂等性是系统服务对外界的承诺。它承诺只要接口调用成功,多次外部调用对系统的影响是一致的。声明为幂等的服务将假设外部调用失败是正常的,并且失败后必须重试。例如,当我们发起支付请求时,我们应该只从用户账户扣款一次。遇到网络重发或系统问题重发时,只扣一次钱。具体的幂等处理流程如下图所示:SQLSELECTcol1FROMtab1WHERcol2=1中的幂等,无论执行多少次,都不会改变状态,是天然的幂等。UPDATEtab1SETcol1=1WHEREcol2=1,无论执行多少次,状态都是一致的,所以也是幂等操作。UPDATEtab1SETcol1=col1+1WHEREcol2=1,每次执行的结果都会改变,这个不是幂等的。insertintouser(userid,name)values(123456,'kevin')如果userid是唯一的主键,即重复上面的业务,只会插入一条用户数据,是幂等的。如果userid不是主键,可以重复,那么多次操作上述业务会导致多条新的数据条目,不幂等。deletefromuserwhereuserid=123456,多次操作,结果是一样的,idempotentHTTPmethod中的idempotentHTTPmethod是指对一个资源的一次请求和多次请求应该有相同的副作用。GET方法是用来获取资源的,不应该有副作用,所以是幂等的。DELETE方法用于删除资源,有副作用,但要满足幂等性。例如:删除id为123456的帖子,调用者可以多次调用或刷新页面,不用担心出错。POST方法不是幂等的。两个相同的POST请求将在服务器端创建两个资源。他们有不同的URI。PUT方法是幂等的。相应的URI是要创建或更新的资源本身。多个PUT对URI的副作用与一个PUT相同。PATCH不是幂等的。它将请求实体中描述的一组更改应用于URI标识的资源。这组变化以“补丁文档”的形式表现出来,如果URI没有指向一个已经存在的资源,服务器可能会根据补丁文档的类型和权限创建一个新的资源。从测试的角度来看,幂等性的核心测试点包括:用户反复提交网络重发消息,系统间重发重试。重试的重点如下:1)需要关注业务和产品设计的本质,是否需要幂等取决于时间维度幂等(即幂等对象的范围,是否是幂等的)个人或机构,无论是某笔交易还是某类交易)或空间维度的幂等性(即保证幂等性的时间,无论是几秒、几分钟还是永久)。2)接口的幂等性测试,在做接口测试的时候,想想每个接口是否需要幂等性。3)对于业务场景,尤其是涉及到钱的场景,必须验证失败重试机制。
