分布式系统中的幂等性

分布式系统中的幂等性

1.幂等性介绍

幂等的概念来自数学,比如对于一元函数来说满足:f(f(x))=f(x)

即可称为满足幂等性

在计算机科学中,一个操作如果多次执行产生的影响与一次执行产生的影响相同,这样的操作即符合幂等性

在分布式系统中,服务消费方调用服务提供方的接口,多次调用的结果应该与一次调用的结果一样,这正是分布式环境下幂等性的语义。

为什么幂等性对于分布式系统而言如此重要?

因为子啊分布式环境下,服务调用方一般采用http协议或rpc或MQ的方式,即双方需要通过网络进行通信,而因为网络故障或者消息超时的存在,可能服务消费方已经成功调用了服务提供方的服务接口,但是消费方没有收到来自对方的成功响应,导致消费方以为服务调用失败从而再次进行调用,也就是网络的不可靠性导致了服务接口被多次调用的可能。

分布式系统必须保证在这种情况下,即使接口被多次调用,它对系统产生的影响应该与该接口只被调用一次的结果一样

2.幂等性场景

在微服务架构下,不同的微服务间会有大量的基于http,rpc或MQ消息的网络通信,接口的重复调用以及消息的重复消费可能会经常发生,比如以下情况

  • 调用订单创建接口,第一次调用超时,调用方又尝试了一次,但其实第一次调用已经成功,只是调用方没有及时收到响应
  • 订单支付成功后,需要向MQ发送一条消息,但该消息重复发送两条
  • 网络波动导致服务方的接口被调用了两次
  • 用户在使用产品时,无意地触发多笔交易
  • 某些未关闭的重试机制

微服务架构应该具有幂等性,当接口被重复调用时,消息被重复消费时,对系统的产生的影响应该和接口被调用一次,消息被消费时一样

3.crud操作的幂等性分析

  • 新增请求:不具备幂等性
  • 查询请求:重复查询不会影响系统状态,查询天然具有幂等性
  • 基于主键的更新请求
    要更新的值依赖于前值,不具备幂等性
    要更新的值不依赖于前值,具有幂等性
  • 删除请求
    基于主键的物理删除具有幂等性
    基于主键的逻辑删除也具有幂等性

总结:通常只需要对新增请求和更新请求作幂等性保证

4.如何解决幂等性问题

  • 全局唯一ID
    根据业务生成一个全局唯一ID,在调用接口时会传入该ID,接口提供方会从相应的存储系统,比如redis中去检索这个全局ID是否存在,如果存在则说明该操作已经执行过了,将拒绝本次服务请求;否则将相应该服务请求并将全局ID存入存储系统中,之后包含相同业务ID参数的请求将拒绝
  • 去重表
    这种方法适用于在业务中有唯一标识的插入场景。比如支付场景中,一个订单只会支付一次,可以建立一张去重表,将订单ID作为唯一索引。把支付并且写入支付单据到去重表放入一个事务中,这样当出现重复支付时,数据库就会抛出唯一约束异常,操作就会回滚。这样保证了订单只会被支付一次
  • 多版本并发控制
    适合对更新请求作幂等性控制,比如要更新商品的名字,这是就可以在更新的接口中增加一个版本号来做幂等性控制
  • 状态机控制
    适合有状态机流转情况下,比如订单的创建和付款,订单的创建肯定是在付款之前。这是可以添加一个int类型的字段来表示订单状态,创建状态为0,付款成功为100,付款失败为99。
  • 插入或更新
    在MySQL数据库中,如果insert语句后面带上ON DUPLICATE KEY UPDATE子句,而要插入的行与表中现有记录的唯一索引或者主键索引产生重复值,则对旧值进行更新;否则执行新纪录的插入
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章