幂等(idempotent)是一个数学与计算机科学概念,它指的是一个操作、方法或函数在被多次执行时,其结果与执行一次相同,即多次执行不会产生额外的影响。这个概念在分布式系统、网络通信、API设计等领域非常重要,用于确保系统的稳定性和数据的一致性。
幂等的定义
- 数学定义:在数学中,幂等元素是指被自己重复运算(或对于函数是为复合)的结果等于它自己的元素。例如,乘法下仅有两个幂等实数,为0和1。
f ( x ) = f ( f ( x ) ) f(x)=f(f(x)) f(x)=f(f(x))
如求绝对值 a b s ( x ) = a b s ( a b s ( x ) ) abs(x)=abs(abs(x)) abs(x)=abs(abs(x)) 就是幂等的 - 计算机科学定义:在编程中,幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。
这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。
一个接口,不管我调多少次,只要参数不变,结果也应该不变。
GET请求一般要求幂等。
幂等的重要性
幂等性在设计分布式系统、网络通信、API设计等方面具有非常重要的应用。例如,在交易支付系统中,下订单是一个常见的业务场景,如果不做幂等性设计,用户多次点击提交按钮可能会导致重复下单,从而造成资源浪费或数据不一致。
幂等的实现方式
幂等性判断
- 使用防重Token令牌:在客户端发起请求之前,生成一个唯一的防重Token令牌,并将令牌携带在请求中。服务端在接收到请求后,校验令牌,如果令牌已经被使用过,则说明该请求是重复请求,直接返回已处理过的结果。
- 基于唯一键的幂等:通过为每个操作分配一个唯一的标识符(如订单ID、用户ID等),并在数据库中检查该标识符是否存在,来确保操作的唯一性。
通过理解幂等性的概念、重要性以及实现方式,我们可以更好地设计出稳定、可靠的系统,避免因重复操作导致的数据不一致等问题。
加锁
并发控制,先加锁,然后进行幂等性判断(可以基于状态机、流水表、唯一性索引等等进行重复操作的判断),最后进行数据的更新,将数据进行持久化。
建议使用Redis实现分布式锁,因为他是非阻塞的高效率的互斥锁。非常适合在幂等控制场景中。
数据库唯一性约束
数据库的唯一性约束都要加好,这是系统的最后一道防线。万一前面的锁失效了,这里也能控制得住不会产生脏数据。
使用数据库唯一主键完成幂等性:需要注意的是,该主键一般来说并不是使用数据库中自增主键,而是使用分布式 ID 充当主键,这样才能能保证在分布式环境下 ID 的全局唯一性。
版本号+乐观锁