什么是幂等(idempotent)
百度百科:
“
幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。
”
“
在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。
”
“
这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的。更复杂的操作幂等保证是利用唯一交易号(流水号)实现。
”
幂等的数学概念
幂等是源于一种数学概念。其主要有两个定义
如果在一元运算中,x 为某集合中的任意数,如果满足 ,那么该 f 运算具有幂等性,比如绝对值运算 就是幂等性函数。
如果在二元运算中,x 为某集合中的任意数,如果满足 ,前提是 f 运算的两个参数均为 x,那么我们称 f 运算也有幂等性,比如求大值函数 就是幂等性函数。
幂等的业务概念
幂等性不仅仅只是一次或多次操作对资源没有产生影响,还包括第一次操作产生影响后,以后多次操作不会再产生影响。并且幂等关注的是是否对资源产生影响,而不关注结果。
举例:服务端会进行重试等操作或客户端有可能会进行多次点击提交。如果这样请求多次的话,那最终处理的数据结果就一定要保证统一,如支付场景。此时就需要通过保证业务幂等性方案来完成。
幂等的维度
-
时间
-
空间
时域唯一性
定义幂等的有效期。有些业务需要永久性保证幂等,如下单、支付等。而部分业务只要保证一段时间幂等即可。你希望在多长时间内保证某次操作的幂等?
空域唯一性
定义了幂等的范围,如生成订单的话,不允许出现重复下单。一次操作=服务方法+传入的业务数据
同时对于幂等的使用一般都会伴随着出现锁的概念,用于解决并发安全问题。
HTTP 协议语义幂等性
引用自:
-
Http/1.1 文档 https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html
-
https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE
“
安全方法对于
GET
和HEAD
方法而言,除了进行获取资源信息外,这些请求不应当再有其他意义。也就是说,这些方法应当被认为是“安全的”。客户端可能会使用其他“非安全”方法,例如POST
,PUT
及DELETE
,应该以特殊的方式(通常是按钮而不是超链接)告知客户可能的后果(例如一个按钮控制的资金交易),或请求的操作可能是不安全的(例如某个文件将被上传或删除)。但是,不能想当然地认为服务器在处理某个GET
请求时不会产生任何副作用。事实上,很多动态资源会把这作为其特性。这里重要的区别在于用户并没有请求这一副作用,因此不应由用户为这些副作用承担责任。副作用假如在不考虑诸如错误或者过期等问题的情况下,若干次请求的副作用与单次请求相同或者根本没有副作用,那么这些请求方法就能够被视作“幂等 (idempotence)”的。GET
,HEAD
,PUT
和DELETE
方法都有这样的幂等属性,同样由于根据协议,OPTIONS
,TRACE
都不应有副作用,因此也理所当然也是幂等的。假如一个