什么是服务的幂等?为什么要实现幂等?

目录

什么是幂等?

读和写请求都需要做幂等吗?

系统的哪部分需要做幂等?

数据访问层的增删改查都需要做幂等处理吗?

数据库的修改做幂等(age++的情况展开讨论)

分布式系统的ID如何生成?


什么是幂等?

系统中的重复操作,不管执行多少次,都产生一样的效果,或返回一样的结果。

读和写请求都需要做幂等吗?

读请求不需要做幂等(因为读请求不会对数据发生改变)。

写请求需要做幂等(对数据发生改变了就根据需要做幂等)。

系统的哪部分需要做幂等?

因为数据访问层和数据库直接联系,涉及到数据的增删改查,所以需要在数据访问层做幂等处理。

什么是服务的幂等?为什么要实现幂等?_第1张图片

数据访问层的增删改查都需要做幂等处理吗?

数据访问层的增删改查:

    增:主键分业务主键(唯一)、自增主键(最好不用,自增主键不好做幂等)。如果是唯一主键,那么就是天然幂等(重复插入会报错)。

    读:不会改变数据,所以不需要做幂等处理。

    改:set age=18或set age++,age++不能保证幂等(主要讨论这种情况)。

    删:where uid=58或者where uid in bottom 10。删除最后10条,不幂等(不推荐这种做法)。推荐根据id删除,这样不管删除多少次结果都是一样的。

数据库的修改做幂等(age++的情况展开讨论)

这种情况,一般都是先查询,再进行修改,例如:update db set age++ where age=18 (伪代码)

或者将相对值改为绝对值的修改:set age=19

 

修改做幂等通常伴随着分布式事务的问题:

例如银行转账,A给B转账500元,这种就需要做幂等处理。(这里涉及到分布式事务,以后再写一篇文章专门介绍分布式事务)

通常的转账流程:

1.A发起转账500的请求,生成流水号。

2.A账户冻结500元,该单号状态设置为正在转账的状态。

3.B帐号增加500元,该单号状态设置为转账成功状态。

数据库的幂等也可以用分布式锁来进行处理。

分布式系统的ID如何生成?

这里推荐一个Twitter用的snowflake来生成分布式系统的ID。

你可能感兴趣的:(架构-理论,分布式)