美文网首页
3.3:幂等设计

3.3:幂等设计

作者: 今年花开正美 | 来源:发表于2020-07-13 00:00 被阅读0次

在分布式场景下,我们经常会有需要实现幂等的场景,幂等分为请求幂等业务幂等

请求幂等

下面将从以下三步来整理请求幂等的知识点:

  • 请求幂等的本质
  • 怎么做请求幂等
  • 如何生成业务主键

1、请求幂等的本质

场景介绍:

用户A给用户B转100W
1).用户A请求超时
2).用户A重试
请求幂等需保证:用户A的同一个请求多次重试,最终只会转账一次。

请求幂等本质

保证请求重复执行和执行一次结果相同,用公式来表示的话就是:f...f(f(x)) = f(x)。

请求分类分析

1.读:Read/Select,读请求是天然幂等的。
2.写:涉及数据变更的请求,分为:insert、update、delete,写请求需要做幂等。

在哪里做请求幂等

假设系统架构按如下分层:

  • 反向代理(Nginx)
  • 网关层
  • 业务逻辑层
  • 数据访问层
  • 数据库

从上述层次结构中可以直到,请求幂等我们需要在数据访问层数据库来实现,因为请求重试不管在那一层都有可能出现,因此我们只要保证对数据操作的这一层请求是幂等的即可。

2、怎么做请求幂等

下面我们仍然根据请求的分类来分析怎么实现请求幂等吧。前面说了读请求时天然幂等的,所以就只需要看Insert、Update、Delete三种情况下面如何实现请求幂等。

Insert

针对Insert操作,有以下几种情况:
1.主键为业务主键,插入是幂等的,因为同一个请求业务主键肯定是一样的(后续说明如何生成业务主键)。
2.主键为自增主键且有唯一索引,此时插入是幂等的,与第一点类似,借助的都是数据库的唯一性来保证请求的幂等。
3.主键是自增主键且没有唯一索引,此时插入不是幂等的,也就是说同一个请求时可以多次插入的,最终导致数据错误。

从以上三点可以看出,插入数据的幂等性重点在于主键是不是自增主键且没有唯一索引。因此我们只需要保证主键是业务主键,或者包含唯一索引

Update

对update的分析要从单线程还是多线程来分析:
1.单线程重发请求,也就是说请求的重发是同一个线程触发的,此时线程的Update条件是一致的,因此不管执行一次还是多次结果都是一样的。因此此时修改是幂等的
2.多线程重发请求,这时候会出现经典的ABA问题,比如以下SQL在多线程下面就会出现ABA问题:
1). A:update user set sex=18 where uid = 66
2). B:update user set sex=19 where uid = 66
3). A:update user set sex=18 where uid = 66
这时候,因为ABA问题的存在,Update操作请求就不是幂等的了

解决ABA问题的最常见手段就是版本号了,也就是在条件中加上版本号来判断是否已有其他线程操作过相同记录。比如上述SQL可以优化为:
1). A:update user set sex=18,v++ where uid = 66 and version = 1
2). B:update user set sex=19,v++ where uid = 66 and version = 1
3). A:update user set sex=18,v++ where uid = 66 and version = 1

通过使用版本号,我们就可以保证Update请求也是幂等的了。

Delete

Delete的幂等实现和Update是一样的,就不在详细说明了。

3、如何生成业务主键

系统生成业务主键可以从以下三个步骤来实现:

1.客户端在发送业务请求前,先获得一个唯一请求ID,该请求ID生成接口可独立提供。

2.客户端获得请求唯一ID后,发送业务请求。业务逻辑层生成业务ID,并在redis记录请求唯一ID与业务唯一ID的映射关系。

3.后续改请求重发过来到redis查询对应的业务唯一ID即可。

通过以上三步实现较为通用的业务主键生成功能。

相关文章

  • 3.3:幂等设计

    在分布式场景下,我们经常会有需要实现幂等的场景,幂等分为请求幂等和业务幂等。 请求幂等 下面将从以下三步来整理请求...

  • 幂等设计

    为什么要做幂等? 幂等就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的。 例如 1、 前端重复提交选...

  • 幂等设计

    一种通过避免使用对象成员作为函数返回值的幂等设计 这样函数是独立的,无依赖 1.幂等设计减少了重复及嵌套调用的设计...

  • 03知识点

    05服务幂等设计 幂等定义 请求层面幂等 保证请求重复执行和执行一次的结果一致 业务层面幂等 同一用户不重复下单 ...

  • 数据幂等

    在系统设计的时候,操作幂等设计是一点需要考虑的点。 幂等(idempotent、idempotence)是一个数学...

  • 幂等系统设计

    1.系统为什么需要幂等 前端用户的操作问题导致表单重复提交,不做幂等控制会导致创建多个记录,例如用户下单,可能会导...

  • 幂等性设计

    1、概念 任意多次执行产生的影响与一次执行产生的影响相同,无 副作用。 幂等函数/幂等方法==使用相同参数重复执行...

  • 分布式锁:高并发下的幂等问题的"答案"

    写在前面:本文讨论的幂等问题,均为并发场景下的幂等问题。即系统本存在幂等设计,但是在并发场景下失效了。 一 摘要 ...

  • 分布式服务 API 的幂等设计方案 & Spring Boot

    分布式服务 API 的幂等设计方案 & Spring Boot + Redis 拦截器实现实例 什么是幂等? 简...

  • 第三方支付微服务幂等设计

    目录 1.背景 2.第三方支付的幂等场景 3.什么是幂等 4.怎么做幂等设计 -4.1应用程序 -4.2数据库...

网友评论

      本文标题:3.3:幂等设计

      本文链接:https://www.haomeiwen.com/subject/sihocktx.html