接口幂等设计

news2024/11/22 20:03:59

文章目录

  • 如何设计幂等
  • 幂等设计的基本流程
    • 建防重表
    • 根据状态机
    • 分布式锁
    • 获取 token

如何设计幂等

既然这么多场景需要考虑幂等,那我们如何设计幂等呢?

幂等意味着 一条请求的唯一性。不管是你哪个方案去设计幂等,都需要一个全局唯一的ID,去标记这个请求是独一无二的。

  • 如果你是利用唯一索引控制幂等,那唯一索引是唯一的
  • 如果你是利用数据库主键控制幂等,那主键是唯一的
  • 如果你是悲观锁的方式,底层标记还是全局唯一的ID

全局的唯一性ID
uuid–redis自增–雪花算法等

幂等设计的基本流程

过滤一下已经收到的请求,当然,请求一定要有一个全局唯一的ID标记哈。
然后,怎么判断请求是否之前收到过呢?把请求储存起来,收到请求时,先查下存储记录,记录存在就返回上次的结果,不存在就处理请求

在这里插入图片描述

建防重表

有时候表中并非所有的场景都不允许产生重复的数据,只有某些特定场景
才不允许。这时候,直接在表中加唯一索引,显然是不太合适的。
针对这种情况,我们可以通过建防重表来解决问题。
该表可以只包含两个字段:id 和 唯一索引唯一索引可以是多个字段比如:name、code 等组合起来的唯一标识,例如:susan_0001
具体流程图如下
在这里插入图片描述
具体步骤:

  1. 用户通过浏览器发起请求,服务端收集数据。
  2. 将该数据插入 mysql 防重表
  3. 判断是否执行成功,如果成功,则做 mysql 其他的数据操作(可能还有其他的业务逻辑)。
  4. 如果执行失败,捕获唯一索引冲突异常,直接返回成功。需要特别注意的是:防重表和业务表必须在同一个数据库中,并且操作要在
    同一个事务中

根据状态机

很多时候业务表是有状态的,比如订单表中有:1-下单、2-已支付、3-完成、4-撤销等状态。
如果这些状态的值是有规律的,按照业务节点正好是从小到大,我们就能通过它来保证接口的幂等性
假如 id=123 的订单状态是已支付,现在要变成完成状态。

update `order` set status=3 where id=123 and status=2;

第一次请求时,该订单的状态是已支付,值 2,所以该 update 语句可以正常更新数据,sql 执行结果的影响行数是 1,订单状态变成3

后面有相同的请求过来,再执行相同的 sql 时,由于订单状态变成了 3,再用 status=2 作为条件,无法查询出需要更新的数据,所以最终 sql 执行

结果的影响行数是 0,即 不会真正的更新数据。但为了保证接口幂等性,
影响行数是 0 时,接口也可以直接返回成功。
具体流程图如下:
在这里插入图片描述
具体步骤:

  1. 用户通过浏览器发起请求,服务端收集数据。
  2. 根据 id 和当前状态作为条件,更新成下一个状态
  3. 判断操作影响行数,如果影响了 1 行,说明当前操作成功,可以进行其他数据操作。
  4. 如果影响了 0 行,说明是重复请求,直接返回成功。
    主要特别注意的是,该方案仅限于要更新的表有状态字段,并且刚好要更新
    状态字段的这种特殊情况,并非所有场景都适用

分布式锁

防止重复下单(redis+数据库唯一索引requestId实现幂等)

获取 token

springboot + redis + 注解 + 拦截器用Token 实现接口幂等性

使用 token 的方案。该方案跟之前的所有方案都有点不一样,需要两次请求才能完成一次业务操作。

  1. 第一次请求获取 token
  2. 第二次请求带着这个 token,完成业务操作

在这里插入图片描述
具体步骤:

  1. 用户访问页面时,浏览器自动发起获取 token 请求。
  2. 服务端生成 token,保存到 redis 中,然后返回给浏览器。
  3. 用户通过浏览器发起请求时,携带该 token。
  4. 在 redis 中查询该 token 是否存在,如果不存在,说明是第一次请求,做则后续的数据操作。
  5. 如果存在,说明是重复请求,则直接返回成功。
  6. 在 redis 中 token 会在过期时间之后,被自动删除。
    以上方案是针对幂等设计

如果是防重设计,流程图要改改
在这里插入图片描述

需要特别注意的是:token 必须是全局唯一的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【第五部分 | JS WebAPI】2:DOM 元素操作

目录 1-1 改变元素内容(去除html和空格换行) 1-2 改变元素内容(保留html和空格换行 用的最多) 1-3 获取元素的内容 [ 更多其它可操作的元素属性 ] 2-1 修改元素的属性 2-2 修改表单元素属性 2-3 使用this指向函数调用者 3…

day35 XSS跨站反射存储DOM盲打劫持

前言 #知识点: 1、XSS跨站-原理&攻击&分类等 2、XSS跨站-反射型&存储型&DOM型等 3、XSS跨站-攻击手法&劫持&盗取凭据等 4、XSS跨站-攻击项目&XSS平台&Beef-XSS 1、原理 指攻击者利用网站程序对用户输入过滤不足,输…

redis<二>spring使用redis,配置远程登录和密码

使用默认的redis配置 改pom, 加入redis依赖,版本可以不需要写&#xff0c;由spring的父工程控制。 <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --> <!--整合redis--> <dependency><groupId>…

Spring Bean基础-4

1. 定义Bean: 什么是BeanDefinition? 什么是BeanDefinition?BeanDefinition 是 Spring Framework 中定义 Bean 的配置元信息接口, 包含: Bean 的类名Bean 行为配置元素, 如作用域、自动绑定的模式、生命周期回调等其他 Bean 引用, 又可称作合作者 (Collaborators) 或者依赖 …

Feign的简介及使用

一、Feign简介 Feign是一个声明式的http客户端&#xff0c;官方地址:https://github.com/OpenFeign/feign 其作用就是帮助我们优雅的实现http请求的发送&#xff0c;解决代码可读性差&#xff0c;编程体验不统一、参数复杂URL难以维护的问题。 二、使用Feign的步骤 1.引入依赖…

网络原理(Java网络编程)

1.局域网和广域网 局域网LAN: 即 Local Area Network,简称LAN. 局域网内的主机之间能方便的进行网络通信,又称为内网;局域网和局域网之间在没有连接的情况下,是无法通信的.局域网一般可以由交换机或路由器组建. 广域网WAN: 即 Wide Area Network,简称WAN. 广域网是将多个局域网…

【28-业务开发-基础业务-属性管理-SKU和SPU基本概念-SKU和SPU关联关系-属性实体之间的关联关系-批量菜单创建】

一.知识回顾 【0.三高商城系统的专题专栏都帮你整理好了&#xff0c;请点击这里&#xff01;】 【1-系统架构演进过程】 【2-微服务系统架构需求】 【3-高性能、高并发、高可用的三高商城系统项目介绍】 【4-Linux云服务器上安装Docker】 【5-Docker安装部署MySQL和Redis服务】…

力扣(LeetCode)32. 最长有效括号(C++)

栈模拟 合法的括号序列满足两条性质&#xff1a; 1.左括号数等于右括号数 2.任意前缀里&#xff0c;左括号数大于等于右括号数。 括号匹配和栈很般配&#xff0c;遇到左括号&#xff0c;下标入栈&#xff0c;遇到右括号&#xff0c;弹栈匹配。 这题的前缀里有两种不合法&…

【LSTM回归预测】attention机制LSTM时间序列回归预测【含Matlab源码 1992期】

⛄一、attention机制LSTM预测 1 总体框架 数字货币预测模型分为两部分&#xff0c;由LSTM模块和Attention模块组成。 2 LSTM模块 长短期记忆网络&#xff08;LSTM&#xff09;是一种特殊的递归神经网络&#xff08;RNN&#xff09;模型&#xff0c;是为了解决RNN模型梯度消失…

【Codeforces Round #835 (Div. 4)】A——G题解

文章目录A Medium Number题意思路代码B Atillas Favorite Problem题意思路代码C Advantage题意思路代码D Challenging Valleys题意思路代码E Binary Inversions题意思路代码F Quests题意思路代码G SlavicGs Favorite Problem题意思路代码A Medium Number 题意 三个数&#xf…

窗口-视口转换(详细)

在QPainter中&#xff0c;绘制图像使用逻辑坐标绘制&#xff0c;然后再转化为绘图设备的物理坐标。 窗口&#xff08;window&#xff09;&#xff1a;表示逻辑坐标下的相同矩形视口&#xff08;viewport&#xff09;&#xff1a;表示物理坐标下的指定的一个任意矩形默认情况&am…

中国互联网大会天翼云展区大揭秘!

11月15日&#xff0c;由工业和信息化部、深圳市人民政府主办&#xff0c;中国互联网协会、广东省通信管理局、深圳市工业和信息化局等单位承办的2022&#xff08;第二十一届&#xff09;中国互联网大会在深圳开幕。本届大会以“发展数字经济 促进数字文明”为主题&#xff0c;聚…

单商户商城系统功能拆解34—应用中心—分销应用

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

在IDEA中搭建Spring5.2.x版本源码(~附带完整过程和图示~)

1.开发环境 JDK8IntelliJ IDEA 2019.1.4 gradle 5.6.4git 2.33.0 2.操作步骤 下载并安装git 进入https://git-scm.com/downloads&#xff0c;下载对应操作系统的git版本一直点击next安装即可记得配置环境变量 获取Spring源码 使用clone的方式将源码拉取到本地&#xff0c;方便…

Java递归查询树形结构(详解)

一.数据准备 数据库表结构如下所示&#xff0c; INSERT INTO jg_user.com_type(type_id, parent_id, type_name) VALUES (1, 0, 合伙企业); INSERT INTO jg_user.com_type(type_id, parent_id, type_name) VALUES (2, 0, 有限公司); INSERT INTO jg_user.com_type(type_id, p…

力扣(LeetCode)878. 第 N 个神奇数字(C++)

二分查找数论 数论知识——辗转相除法、容斥原理。 辗转相除求最大公约数&#xff0c;两数相乘除以最大公约数&#xff0c;就是最小公倍数。 容斥原理求最多不重复元素&#xff0c;最大不重复面积。 <小学数奥> 从数据范围里&#xff0c;用容斥原理找 a/ba/ba/b 的倍数个…

Pytorch 下 TensorboardX 使用

这里引用一下在其他地方看到的一些话&#xff1a; tensorboard做为Tensorflow中强大的可视化工具&#xff0c;已经被普遍使用。 但针对其余框架&#xff0c;例如Pytorch&#xff0c;以前一直没有这么好的可视化工具可用&#xff0c;PyTorch框架自己的可视化工具是Visdom&…

实验九 数据微积分与方程数值求解(matlab)

实验九 数据微积分与方程数值求解 1.1实验目的 1.2实验内容 1.3流程图 1.4程序清单 1.5运行结果及分析 1.6实验的收获与体会 1.1实验目的 1&#xff0c;掌握求数值导数和数值积分的方法&#xff1b; 2&#xff0c;掌握代数方程数组求解的方法&#xff1b; 3&a…

【Mysql】Centos 7.6安装Mysql8

这里centos为阿里云默认镜像。 一、卸载历史历史版本 1、检查是否有服务启动 # service mysqld status 2、停止mysql服务 # service mysqld stop 3、查看mysql历史安装组件 # rpm -qa|grep mysqlmysql-libs-5.1.71-1.el6.x86_64 4、卸载组件 # rpm -e --nodeps mysql…

2022世界VR产业大会圆满收官,酷雷曼惊艳亮相!

11月14日&#xff0c;由工业和信息化部、江西省人民政府联合主办的全球VR领域规模最大、规格最高、影响最广的年度盛会——2022世界VR产业大会在江西南昌圆满落下帷幕。 本次大会得到了党中央、国务院的高度重视&#xff0c;国务委员王勇出席大会开幕式并讲话&#xff1b;大会邀…