幂等性 详解

article/2025/9/25 10:22:52

目录

一、幂等概念 

1、幂等的数学概念

2. 幂等的业务概念 

 二、幂等概述

三、幂等场景

四、解决方案

 1、token + redis机制

 2、乐观锁机制

3、唯一主键机制

4、去重表机制

5、门票机制 


一、幂等概念 

1、幂等的数学概念


如果在一元运算中,x 为某集合中的任意数,如果满足 f(x) = f(f(x)) ,那么该 f 运算具有幂等性。

绝对值运算 abs(a) = abs(abs(a)) 就是幂等性函数

如果在二元运算中,x 为某集合中的任意数,如果满足 f(x,x) = x,前提是 f 运算的两个参数均为 x,那么我们称 f 运算也有幂等性。

求大值函数 max(x,x) = x 就是幂等性函数 

2. 幂等的业务概念 

就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。

场景1:支付场景

用户购买商品使用支付宝支付,支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了。因此需要对于每一笔订单,操作多次,也只能扣一次钱。

场景2:一键三连

小破站有一个一键三连的功能,长按可以对up主进行激励,每个人对每个视频只有一个一键三连的机会。就算再喜欢某个视频,多次操作,也只能有一键三连一次。

场景3:统计DAU/MAU

DAU/MAU,又叫日活/月活,是用于反映网站、互联网应用或网络游戏的运营情况的统计指标。所以一个用户当天或者当月登录多次(或者达到某种活跃用户判断机制多次),也只能看作一个活跃用户,不能重复计算。

在增删改查4个操作中,尤为注意就是增加或者修改,
(1) 查询对于结果是不会有改变的,
(2) 删除只会进行一次,用户多次点击产生的结果一样,
(3) 修改在大多场景下结果一样
(4) 增加在重复提交的场景下会出现

 

 二、幂等概述

生产环境经常出现过重复的数据?在排查问题的时候,数据又是正常的。这个是何解呢?怎么会出现这种情况,而且还很难排查问题。 

原因 :产生重复数据或数据不一致(假定程序业务代码没问题),绝大部分就是发生了重复的请求重复请求是指同一个请求因为某些原因被多次提交。导致这个情况会有几种场景:(本质上:多次请求

1)微服务场景,在我们传统应用架构中调用接口,要么成功,要么失败。但是在微服务架构下,会有第三个情况【未知】,也就是超时。如果超时了,微服务框架会进行重试。
2)用户交互的时候多次点击。如:快速点击按钮多次。
3)MQ消息中间件,消息重复消费
4)第三方平台的接口(如:支付成功回调接口),因为异常也会导致多次异步回调。
5)其他中间件/应用服务根据自身的特性,也有可能进行重试。

 接口幂等:接口的幂等性实际上就是 接口可重复调用,在调用方多次调用的情况下,接口最终得到的结果是一致的。更准确的讲:多次调用对系统的产生的影响是一样的,即对资源的作用是一样的,但是返回值允许不同。

 

三、幂等场景

1、查询,select * from user where xxx,不会对数据产生任何变化,具备幂等性

2、新增,insert into user(userid, name) values(1, 'a')

如 userid 为唯一主键,即重复操作上面的业务,只会插入一条用户数据,具备幂等性

如 userid 不是主键,可以重复,那上面业务多次操作,数据都会新增多条,不具备幂等性

3、修改,区分直接赋值和计算赋值

直接赋值,update user set point = 20 where userid = 1,不管执行多少次,point都一样,具备幂等性

计算赋值,update user set point = point + 20 where userid = 1,每次操作 point 数据都不一样,不具备幂等性

4、删除,delete from user where userid = 1,多次操作,结果一样,具备幂等性

 

上面场景中,我们发现新增没有唯一主键约束的数据,和修改计算赋值型操作都不具备幂等性 

 

四、解决方案

 1、token + redis机制

token + redis 的幂等方案,适用于绝大部分场景。主要思想:

token作为请求的唯一性标示

redis作为存储token的数据库

每次请求先去redis查看token是否存在

不存在,将返回结果缓存到redis

存在,直接返回缓存结果

设置缓存有效期

具体Java代码实现,可以参考我另一篇文章

Java 幂等 实现_苏格拉帝的博客-CSDN博客_java redis幂等实现基于 redis 实现API操作幂等,为更新类接口添加特定的注解,增加幂等参数ClientToken,在基于ClientToken唯一的情况下先检查redis里是否有响应的结果,否则去请求service层再将结果放入redis,来达到请求幂等的效果。https://blog.csdn.net/sugelachao/article/details/122046863

 2、乐观锁机制

乐观锁这里解决了计算赋值型的修改场景

update user set point = point + 20, version = version + 1 where userid=1 and version=1

 加上了版本号后,就让此计算赋值型业务,具备了幂等性

缺点:就是在操作业务前,需要先查询出当前的version版本。

3、唯一主键机制

这个机制是利用了数据库的主键唯一约束的特性,解决了在insert场景时幂等问题。但主键的要求不是自增的主键,这样就需要业务生成全局唯一的主键 ---------> 分布式唯一主键ID

如果是分库分表场景下路由规则要保证相同请求下落地在同一个数据库和同一表中,要不然数据库主键约束就不起效果了,因为是不同的数据库和表主键不相关。

因为对主键有一定的要求,这个方案就跟业务有点耦合了,无法用自增主键了

4、去重表机制

 这个方案业务中要有唯一主键,这个去重表中只要一个字段就行,设置唯一主键约束,当然根据业务自行添加其他字段。主要流程上图:

上面的主要流程就是 把唯一主键插入去重表,再进行业务操作,且他们在同一个事务中。这个保证了重复请求时,因为去重表有唯一约束,导致请求失败,避免了幂等问题

 这里要注意的是,去重表和业务表应该在同一库中,这样就保证了在同一个事务,即使业务操作失败了,也会把去重表的数据回滚。这个很好的保证了数据一致性

这个方案也是比较常用的,去重表是跟业务无关的,很多业务可以共用同一个去重表,只要规划好唯一主键就行了。

5、门票机制 

支付场景:单次支付请求,也就是直接支付了,不需要额外的数据库操作了,这个时候发起异步请求创建一个唯一的ticketId,就是门票,这张门票只能使用一次就作废。

具体步骤:

1.异步请求获取门票
2.调用支付,传入门票
3.根据门票ID查询此次操作是否存在,如果存在则表示该操作已经执行过,直接返回结果;如果不存在,支付扣款,保存结果
4.返回结果到客户端

如果步骤4通信失败,用户再次发起请求,那么最终结果还是一样的.


http://chatgpt.dhexx.cn/article/Xow9sAcN.shtml

相关文章

幂等 (idempotence) 的概念

幂等 (idempotence) 的概念 幂等的数学概念 幂等是源于一种数学概念。其主要有两个定义 如果在一元运算中,x 为某集合中的任意数,如果满足 f(x) f(f(x)) ,那么该 f 运算具有幂等性,比如绝对值运算 abs(a) abs(abs(a)) 就是幂…

偏度

偏度公式如下: 现在想解决如何从图像上解决为正为负的问题,如图所示: 个人理解:偏度中的偏是针对变量相对于中心点(期望值)距离的一种描述;如果厚尾的话,就说明有很多点距离中心点比…

偏度(skewness)

偏度 偏度(skewness),是统计数据分布偏斜方向和程度的度量,是统计数据分布非对称程度的数字特征。定义上偏度是样本的三阶标准化矩。 偏度定义中包括正态分布(偏度0) 算术平均值 中位数 众数,…

策略梯度

Policy Gradient Methods for Reinforcement Learning with Function Approximation(PG) 在强化学习的算法中存在两种算法,一个是基于价值函数的算法,另一个是基于策略梯度的算法。为什么要提出策略梯度算法呢? 基于策略的学习可能会具有更好…

推荐系统中的偏差

推荐系统消偏 推荐系统中的偏差IPW ——逆概率加权DICE ——区分兴趣和偏差建模因果推断 推荐系统中的偏差 预估问题 我们一般会注重两种误差,偏差和方差, 方差与模型泛化能力有关:通常关注模型的复杂度与是否过拟合;偏差则表现为…

特征偏度和异常值处理

(一)机器学习基础 - 偏度、正态化以及 Box-Cox 变换 https://my.oschina.net/mathinside/blog/4942126 对于数据挖掘、机器学习中的很多算法,往往会假设变量服从正态分布。例如,在许多统计技术中,假定误差是正态分布…

推荐系统去偏(Debiased Recommendation)研究进展概述

©作者 | 张景森 学校 | 中国人民大学信息学院硕士 文章来源 | RUC AI Box 引言 推荐系统作为解决信息过载的一种重要手段,已经在不同的应用场景下取得了不错的效果。近些年来关于推荐系统的研究主要集中在如何设计更好的模型来适应用户行为数据,进而…

【综述】推荐系统偏差问题 去偏最新研究进展(Bias and Debias in Recommender System)

文章目录 1. 推荐系统的反馈回路1.1 User -> Data1.2 Data -> Model1.3 Model -> User 2. 推荐系统中的Bias2.1 数据偏差(data bias)2.1.1 选择偏差(Selection Bias)2.1.2 曝光偏差(Exposure Bias)2.1.3 一致性偏差(Conformity Bias)2.1.4 位置偏差(Position Bias) 2.…

数据偏度介绍和处理方法

偏度(skewness)是用来衡量概率分布或数据集中不对称程度的统计量。它描述了数据分布的尾部(tail)在平均值的哪一侧更重或更长。偏度可以帮助我们了解数据的偏斜性质,即数据相对于平均值的分布情况。 有时,正…

【期权系列】基于偏度指数的择时分析

【期权衍生指标系列】基于偏度指数的择时分析 本篇文章是基于研究报告的复现作品,旨在记录个人的学习过程和复现过程中的一些思路。 感谢中信期货研究员前辈的宝贵思路。 一、偏度指数 1.偏度指数简介 偏度是描述数据分布形态的统计量,其描述的是统…

对于偏度的理解

偏度公式如下: 现在想解决如何从图像上解决为正为负的问题,如图所示:? 个人理解:偏度中的偏是针对变量相对于中心点(期望值)距离的一种描述;如果厚尾的话,就说明有很多点…

量化策略研究:股票中的偏度效应

2022年4月份以来,加密货币市场的暴跌强调了市场中性策略的重要性;基于此,有部分Quanter提出了基于加密货币的偏度策略:“Skewness/Lottery Trading Strategy in Cryptocurrencies”。 为此,小编不禁好奇:偏…

Maven安装和配置(详细版)

Maven安装和配置 Maven安装1、安装链接:2、配置环境变量: Maven配置1、修改Maven仓库下载镜像及修改仓库位置:2、在Idea上配置Maven: 测试Maven安装能否安装jar包 Maven安装 1、安装链接: Maven – Download Apache …

Maven 安装/学习入门详解!

Maven安装: Maven 软件的下载 为了使用 Maven 管理工具,我们首先要到官网去下载它的安装软件。通过百度搜索“Maven 点击 Download 链接,就可以直接进入到 Maven 软件的下载页面: 我们当时使用的是 apache-maven-3.5.2 版本&a…

Maven安装(超详解)

2.4.1 下载 下载地址:Maven – Download Apache Maven 在提供的资料中,已经提供了下载好的安装包。如下 : 2.4.2 安装步骤 Maven安装配置步骤: 解压安装 配置仓库 配置Maven环境变量 1、解压 apache-maven-3.6.1-bin.zip&a…

Maven安装教程详解

一、准备工作 1、确定电脑上已经成功安装jdk7.0以上版本 2、win10操作系统 3、maven安装包 下载地址:http://maven.apache.org/download.cgi 二、解压Maven安装包 在上述地址中下载最新的Maven版本,解压到指定目录(此处根据自己的…

Maven安装及配置(附带安装包)

Maven安装及配置 目录 Maven安装及配置 一: 安装包准备: 二: 安装配置 三: Maven 依赖地址更改为阿里镜像 四: idea中配置maven 一: 安装包准备: apache-maven-3.6.3-bin 链接&#xff1…

Maven安装和使用(详细版)

目录 演示版本: 安装 1.下载和解压 2.安装配置 IDEA使用Maven 1.IDEA配置Maven环境 2.新建maven项目 演示版本: maven:apache-maven-3.6.1 IEDA:2021.3 Windows:11 安装 1.下载和解压 1.下载去maven官网下载…

Maven安装与环境配置(Windows)

注意:Maven3以上版本要求安装jdk1.7以上版本。1、下载安装包 在Maven官网下载最新版的安装包:http://maven.apache.org/download.cgi 2、解压安装包 3、配置Maven环境变量 配置M2_HOME环境变量,指向maven的安装目录,并将bin目…

maven安装jar包

解决问题 主要解决开发过程中jar包依赖无法通过中央仓库、阿里云仓库等地方直接下载或者说对应的仓库中没有对应的jar包,比如 java-1.0.2.jar 这个jar包,很难从maven中央仓库中下载。这个时候我们就需要把对应的jar包给copy到本地,然后通过m…