为何须要幂等性?网络
若是从开发角度考虑:架构
若是要作幂等,首先对请求进行分类,通常分为读请求和写请求,读请求通常不须要作幂等,读数据自己不会改变数据,所以无需作幂等,而写请求可能对数据形成改变,全部部分写请求须要进行幂等。并发
从架构层次上,看看那些层会对数据发生改变。分布式
网关,业务逻辑通常不会修改数据ui
数据访问层可能修改数据,咱们只须要对数据访问层进行幂等性设计设计
对于数据访问层CRUD:3d
新增数据的时候,经过主键或者某个惟一标识如token,限制某条记录只能插入一次。cdn
更新数据的时候,部分幂等。部分不幂等blog
删除数据的时候,部分幂等,部分非幂等,在实际删除的时候不要经过相对值来删除,通常在删除以前首先进行一次查询,而后进行绝对删除token
真正须要处理的是update操做。如何处理呢?
业务层次的幂等如何解决呢?
好比下了一个订单,可是冗余部署了多个进程,这个时候存在并发消费的可能性。对此咱们能够尝试将并行操做转换为串行操做,采用分布式锁。
共享资源经过锁来保证。
通常在分布式系统中,全部请求都会携带一个惟一的请求流水号,requestNo,在进行操做以前判断这个requestNo是否已经入库了,若是在库中已经存在,表明已经处理过,若是不存在则继续处理。
通常一次操做对应的是一个请求流水号,若是请求流水号不一样,表明的是两次操做。