每个工程师都应该了解的:聊聊幂等

现在这个时代大家可能最关心的就是钱了,那么有没有想过你银行转账给你没有一次是转多的,要么失败,要么成功,为什么不能失误一下多转一笔呢?醒醒吧年轻人,别做梦了,做银行的能那么傻x吗?

今天我们就来谈一谈为什么银行转账不能多给我转一笔?关乎到钱的问题,小伙伴们打起精神!!!

要想要理解上述的疑惑,不得不提的一个概念就是幂等性,至于什么是幂等性,如何通过代码实现幂等性,下面将会详细讲述。

 什么是幂等性          

所谓幂等性通俗的将就是一次请求和多次请求同一个资源产生相同的副作用。用数学语言表达就是f(x)=f(f(x))。

维基百科的幂等性定义如下:

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。
在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。
幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。
例如,“setTrue()”函数就是一个幂等函数,无论多次执行,其结果都是一样的,更复杂的操作幂等保证是利用唯一交易号(流水号)实现.
 

为什么需要幂等性       

在系统高并发的环境下,很有可能因为网络,阻塞等等问题导致客户端或者调用方并不能及时的收到服务端的反馈甚至是调用超时的问题。总之,就是请求方调用了你的服务,但是没有收到任何的信息,完全懵逼的状态。比如订单的问题,可能会遇到如下的几个问题:

1. 创建订单时,第一次调用服务超时,再次调用是否产生两笔订单?

2. 订单创建成功去减库存时,第一次减库存超时,是否会多扣一次?

3. 订单支付时,服务端扣钱成功,但是接口反馈超时,此时再次调用支付,是否会多扣一笔呢?

作为消费者,前两种能接受,第三种情况就MMP了,哈哈哈!!!这种情况一般有如下两种解决方式:

1. 服务方提供一个查询操作是否成功的api,第一次超时之后,调用方调用查询接口,如果查到了就走成功的流程,失败了就走失败的流程。

2. 另一种就是服务方需要使用幂等的方式保证一次和多次的请求结果一致。

 

HTTP的幂等性       

GET:只是获取资源,对资源本身没有任何副作用,天然的幂等性。

HEAD:本质上和GET一样,获取头信息,主要是探活的作用,具有幂等性。

OPTIONS:获取当前URL所支持的方法,因此也是具有幂等性的。

DELETE:用于删除资源,有副作用,但是它应该满足幂等性,比如根据id删除某一个资源,调用方可以调用N次而不用担心引起的错误(根据业务需求而变)。

PUT:用于更新资源,有副作用,但是它应该满足幂等性,比如根据id更新数据,调用多次和N次的作用是相同的(根据业务需求而变)。

POST:用于添加资源,多次提交很可能产生副作用,比如订单提交,多次提交很可能产生多笔订单。

 

幂等性的实现方式        

对于客户端交互的接口,可以在前端拦截一部分,例如防止表单重复提交,按钮置灰,隐藏,不可点击等方式。但是前端进行拦截器显然是针对普通用户,懂点技术的都可以模拟请求调用接口,所以后端幂等性很重要。

后端的幂等性如何实现?将会从以下几个方面介绍。

1. 数据库去重表

在往数据库中插入数据的时候,利用数据库唯一索引特性,保证数据唯一。比如订单的流水号,也可以是多个字段的组合。

实现比较简单,读者可以自己实现看看,这里不再提供demo了。


2. 状态机

很多业务中多有多个状态,比如订单的状态有提交、待支付、已支付、取消、退款等等状态。后端可以根据不同的状态去保证幂等性,比如在退款的时候,一定要保证这笔订单是已支付的状态。

业务中常常出现,读者可以自己实现看看,不再提供demo。

3. TOKEN机制

针对客户端连续点击或者调用方的超时重试等情况,例如提交订单,此种操作就可以用Token的机制实现防止重复提交。

TOKEN机制如何实现?简单的说就是调用方在调用接口的时候先向后端请求一个全局ID(TOKEN),请求的时候携带这个全局ID一起请求,后端需要对这个全局ID校验来保证幂等操作,流程如下图:

主要的流程步骤如下:

1. 客户端先发送获取token的请求,服务端会生成一个全局唯一的ID保存在redis中,同时把这个ID返回给客户端。

2. 客户端调用业务请求的时候必须携带这个token,一般放在请求头上。

3. 服务端会校验这个Token,如果校验成功,则执行业务。

4. 如果校验失败,则表示重复操作,直接返回指定的结果给客户端。

通过以上的流程分析,唯一的重点就是这个全局唯一ID如何生成,在分布式服务中往往都会有一个生成全局ID的服务来保证ID的唯一性,但是工程量和实现难度比较大,UUID的数据量相对有些大,此处陈某选择的是雪花算法生成全局唯一ID

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

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

相关文章

《架构之美》阅读笔记四

书中提到了ruby on rails,所以百度了下,介绍如下: 题外话:Ruby on rails 它是一种可以使你开发,部署和维护的WEB应用程序变得简单的框架,以简化web开发为目标,它简洁,易懂,框架里的配…

Docker基础:Docker 常用命令梳理

目录 1、Docker环境信息命令 2、镜像仓库命令 3、本地镜像管理命令 4、容器生命周期管理命令

Docker基础:Docker可视化面板portainer介绍

今天给大家分享Docker可视化面板portainer工具介绍,希望对大家能有所帮助! 1、什么是portainer? Portainer是Docker的图形化管理WEB工具,由GO语言编写的,提供状态显示、应用模板快速部署、对于Docker(容器、镜像、网络、数据卷)的基本操作、日志显示、容器控制台等功能。…

时间复杂度与O(1), O(n), O(logn), O(nlogn) 的区别

在描述算法复杂度时,经常用到O ( 1 ) , O ( n ) , O ( l o g n ) , O ( n l o g n ) O(1), O(n), O(logn), O(nlogn)O(1),O(n),O(logn),O(nlogn)来表示对应复杂度程度, 不过目前大家默认也通过这几个方式表示空间复杂度 。 那么,O ( 1 ) , O ( n ) , O …

Win10技巧:Win10任务管理器知识介绍

Win10操作系统的任务管理器应该是大家比较熟悉的软件,尤其是在你的电脑卡掉的时候,不得不打开任务管理器,结束掉进程卡死的进程,然后电脑就可以恢复正常使用,任务管理器作为Windows操作系统上一款使用频率非常高的软件…

git保护--git分支创建

因为机缘巧合,我接手了一个项目,阴差阳错的,我竟然又成了这个项目的半个负责人。而这个项目呢,由我们团队和别的团队一起合作,这就遇到一个问题了,我们的核心技术在上传到项目中的时候就会暴露给别的团队了…

什么是局部性原理?

什么是局部性原理? 局部性原理的逻辑是这样的: 内存读写块,磁盘读写慢,而且慢很多; 磁盘预读:磁盘读写并不是按需读取,而是按页预读,一次会读一页的数据,每次加载更多的…

哈希(hash)比树(tree)更快,索引结构为什么要设计成树型?

加速查找速度的数据结构,常见的有两类: 哈希,例如HashMap,查询/插入/修改/删除的平均时间复杂度都是O(1); 树,例如平衡二叉搜索树,查询/插入/修改/删除的平均时间复杂度都是O(lg(n))&#xff1…

安装Oracle数据库操作步骤

第一步: 第二步: 第三步: 第四步: 第五步:输入密码 第六步:继续 第七步: 第八步:进入主页后 第九步:登录进去后是这样子 第十步: 第十一步: 第十二…

电脑软件:推荐几款常用的浏览器

目录 1、微软官方的Edge浏览器 2、谷歌浏览器 3、华为浏览器 4、火狐浏览器 5、360极速浏览器 不知道大家在使用浏览器过程中,有没有遇到弹出窗口、各种广告、还有各种游戏推荐的情况?有的浏览器在安装的时候甚至还捆绑了其他软件。别着急&#xff…

OSI网络七层模型

OSI网络七层模型 在说RPC和HTTP的区别之前,我觉的有必要了解一下OSI的七层网络结构模型(虽然实际应用中基本上都是五层),它可以分为以下几层:(从上到下) 第一层:应用层。定义了用于…

TCP 的有限状态机

TCP 有限状态机的图中每一个方框都是 TCP 可能具有的状态。 每个方框中的大写英文字符串是 TCP 标准所使用的 TCP 连接状态名。 状态之间的箭头表示可能发生的状态变迁。 箭头旁边的字,表明引起这种变迁的原因,或表明发生状态变迁后又出现什么动作。 图…

数据库技巧:整理SQLServer非常实用的脚本

今天给大家分享自己在工作当中用到的SQLServer一些常用的脚本,希望能对大家有所帮助! 1、 查询数据库所有表结构 通过该脚本可以快速查找表字段,或者生成数据库设计文档、进行数据库对比。 SELECT obj.name 表名, col.colorder AS 序号 , co…

运维:Centos8安装supervisor守护Nginx进程笔记

目录 supervisor介绍 1.1 简介 1.2 工作原理 1.3 运行环境 1.4 supervisor 组成 2、

字节流与字符流的区别详解

字节流与字符流的区别详解 先来看一下流的概念: 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。 程序中的输入输出都是以…

HTTPS与HTTP的一些区别

HTTPS与HTTP的一些区别 HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的…

Docker知识:数据卷技术介绍

目录 Docker数据管理 1.2 Docker数据持久化 1.2 容器中数据管理的方式 2、数据卷的介绍 2.1 数据卷作用 2.2 卷的概念 2.3 数据卷的特点 3、Docker数据卷常见的作用 4、操作数据卷 4.1 常用命令 4.2 挂载数据卷 今天给大家简单聊聊Docker中的数据卷知识。 Docker数据管理 大家在…

Dubbo背景和简介

Dubbo背景和简介 Dubbo开始于电商系统,因此在这里先从电商系统的演变讲起。 单一应用框架(ORM) 当网站流量很小时,只需一个应用,将所有功能如下单支付等都部署在一起,以减少部署节点和成本。 缺点:单一的系统架构&…

2/19 福建四校联考

1.设计图案 给你一个n*m的矩阵&#xff0c;每个格子必须填或者不能填&#xff0c;要用环和1*2的小方块填满它&#xff0c;求方案数。 比如3*2&#xff0c;每个格子都必须填 有6种填法。 n*m<300 当时一看就觉得不可做然后就放弃了..... 题解&#xff1a;有个结论&#xff…