分布式-解决幂等问题

幂等问题

    • 什么是幂等
    • 幂等和防重有什么区别
    • 幂等分为几种
    • 常见的业务场景
    • 常见的解决方案
    • 基于数据库唯一索引实现幂等解决重复支付问题
    • 源码分享

什么是幂等

  1. 幂等是一个数学与计算机学概念,常见于抽象代数中,在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。
    百度百科解释

幂等和防重有什么区别

  1. 防重是防止一个接口地址被截获后,客户端重复提交请求一次或多次,对系统造成异常,这种异常可能有多种情况:性能下降、系统奔溃、业务数据异常
  2. 幂等主要是防止重复请求导致业务数据异常,更侧重于业务,而且可能针对得不只是接口,也可能是一个监听某个队列的消费者函数

幂等分为几种

我理解的幂等由外到内主要分为两种:接口幂等、底层业务幂等

  1. 接口幂等:一个接口如果有一个业务号在执行,这时再进来相同的业务号则直接返回不进行处理;
  2. 底层业务幂等:通过接口幂等有时候还不能完全保证整个业务的幂等,这时候要在底层,比如数据库层保证业务幂等;

常见的业务场景

  1. 支付场景,用户手动重复提交支付请求,业务保证需要幂等;
  2. 分布式支付场景下,微服务间接口请求处理响应超时后,调用方发起请求重试,业务需要保证幂等;

常见的解决方案

  1. 利用redis分布式锁实现接口幂等;
  2. 利用操作日志实现接口幂等。
  3. 利用数据库唯一索引实现业务幂等;
  4. 利用数据库版本号叠加的方式实现业务幂等;

基于数据库唯一索引实现幂等解决重复支付问题

  1. 用户发起一次支付请求,会携带订单编号,我们可以设计一个订单支付去重表,以订单编号为唯一建;
  2. 当用户发起第一次支付请求时,首先判断订单状态是否为未支付,如果是,我们将订单编号插入到去重表;
  3. 插入去重表成功:
    3.1. 执行真实的支付操作,
    3.2. 支付失败,则回滚整个事务,无影响;
    3.3. 支付成功,则更新订单状态为已成功并且删除去重表订单编号记录;
  4. 插入去重表失败:
    4.1. 返回用户提示信息“订单正在支付中”,无影响。

源码分享

你可能感兴趣的:(分布式)