web应用中幂等性的学习
qnmd bd:待会劳资就去买个vpn。

在平常的工作中经常听到也用到幂等,却没有及时学习总结这个知识点,现在到时候了。
幂等性最初是一个数学上的概念:在某二元运算下,幂等元素是指被自己重复运算(或对于函数是为复合)的结果等于它自己的元素。用公式来表示就是:
\(f(x) = f(f(x))\)
数学就是这么抽象,用自己的语言去描述一个概念,置于这个概念的含义有多么丰富就看自己的领会。反正我看到这个是一脸蒙蔽的。高中做这种题目的时候就很蛋疼。
如果放在web应用,可以这么理解幂等:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击(提交请求)而产生了副作用。
如果你去网上查关于幂等的博客大多数都是这么讲的。但是我还是觉得这个有点蛋疼。
什么叫"结果一致":比如对于同一个订单来说,第一次支付请求失败了,然后重试第二次支付请求成功了,然后接着又发出了一次支付请求结果成功了。那么这个结果是不是一致的呢?其实,这里的"结果一致"是我理解错了,幂等中的结果不是对于用户来说是否支付成功的状态,而是指的业务上,一个订单至多只能有一个成功的支付请求。
所以上面说的可以分析如下几个要点:
同一操作:同一种类型的操作(增,删,改,查),参数要一样。比如,对同一个订单号进行支付就是同一操作,而记录不同时刻的水位就不是同一操作,自己理解一下。
隐含条件:就是这里被坑了一下,编程中由操作失败的时候呀,比如支付;但是\(f(x) = f(f(x))\)只要\(x\)在定义域,\(f(x)\)总是成功的。所以这里操作,其实指的是操作成功,不成功的操作总是幂等的呀,别跟我说成功了一半,去屎吧。所以这里的结果指的是操作成功的结果,不包含失败的结果。这个地方可能有争议,失败也分为很多情况,有的是操作发出去的过程中因网络不通而失败,也可能是处理请求的逻辑失败,所以失败也可能有副作用(修改了状态,或者值)。
结果一致:这个结果是业务中的一种规则,比如通常情况下,一个订单最多只有一个成功的支付请求。假如有一个操作记录表的话,这个成功的操作记录最多也只有一条。
网上的做法大概有两种:
第一种:使用ticket
- 从某个地方(服务,池或者工具类,或者其他什么地方)获取一个ticket
- 在调用服务的时候传入这个ticket
- 服务在内部处理的时候会先查询这个ticket操作是否存在,如果不存在则说明这个没有被操作过,直接执行;如果发现了这个ticket存在,则直接返回
- 服务把结果返回给客户端
第二种:查询支付状态,然后再决定是否去更新
这两种方法都会导致并发问题:
这两个方法都有一个问题,以方法一为例:
根据ticket查询此次操作是否存在,如果存在则表示该操作已经执行过,直接返回结果;如果不存在,支付扣款,保存结果
如果第二次调用的时候第一次正在处理,但是没有处理完,第二次怎么去返回结果?或者说第二次在查询此次操作的时候是不是查不到第一次的操作?
方法二也是一样的,先查后支付,那两次同时调用都查到没有支付然后去扣款,还是有并发的问题
解决这个并发问题有人提出了用分布式锁。所以分布式锁怎么实现呢?
引出话题:
- 订单和支付系统的设计
- 分布式锁
web应用中幂等性的学习的更多相关文章
- Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问
本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...
- 高访问量WEB开发中的架构模式,学习从点滴开始
当一个Web系统从日访问量10万逐步增长到1000万,甚至超过1亿的过程中,Web系统承受的压力会越来越大,在这个过程中,我们会遇到很多的问题.为了解决这些性能压力带来问题,我们需要在Web系统架构 ...
- tornado学习笔记11 Web应用中模板(Template)使用应用实践
上一篇中(Web应用中模板的工作流程分析),已经分析了模板的渲染流程,以及相关参数获取及设置原理.这篇主要讲述模板在实际应用案例. 11.1 需求 根据用户输入的两次密码,判断两次密码是否一致,并将判 ...
- HTTP学习二:Web应用中的HTTP
1 HTTP连接 1.1 TCP连接对性能的影响 TCP三次握手如下图: 如上图,建立一次TCP连接要经过三个步骤.HTTP是建立在TCP之上的,因此TCP连接的性能直接影响HTTP的性能. TCP影 ...
- spring web mvc中遇到的错误以及学习小记(持续记录)
错误:cvc-complex-type.2.4.a: 发现了以元素 'init-param' 开头的无效内容.应以 '{"http://java.sun.com/xml/ns/javaee& ...
- java web开发中遇到的问题及解决方案(个人学习日志,持续更新)
转:http://blog.csdn.net/ducexu/article/details/7529613 2012.05.02 星期三 1.问题:导入的新工程,名字上出现感叹号. 原因:工程的j ...
- SpringBoot学习(七)-->SpringBoot在web开发中的配置
SpringBoot在web开发中的配置 Web开发的自动配置类:在Maven Dependencies-->spring-boot-1.5.2.RELEASE.jar-->org.spr ...
- Java嵌入式数据库H2学习总结(三)——在Web应用中嵌入H2数据库
H2作为一个嵌入型的数据库,它最大的好处就是可以嵌入到我们的Web应用中,和我们的Web应用绑定在一起,成为我们Web应用的一部分.下面来演示一下如何将H2数据库嵌入到我们的Web应用中. 一.搭建测 ...
- 重新学习Spring一--Spring在web项目中的启动过程
1 Spring 在web项目中的启动过程 Spring简介 Spring 最简单的功能就是创建对象和管理这些对象间的依赖关系,实现高内聚.低耦合.(高内聚:相关性很强的代码组成,既单一责任原则:低耦 ...
随机推荐
- 获取jQuery版本号
今天在一个页面需要知道jquery版本号,来决定使用什么样的方法,有以下方式可以获取到 $.fn.jquery $.prototype.jquery 这两种方式都可以获取到jquery的版本号
- 【中英】mac电脑清理软件 ToolWiz Mac Boost
简单介绍: ToolWiz Mac Boost是一款适用于Mac电脑清理加速最好的终极应用, 使您的Mac电脑干净有条理, 执行飞速且稳定.始终保持最佳状态! ToolWiz Mac Boost 运用 ...
- ASCII对比表
ASCII控制字符和ASCII可显示字符 ASCII控制字符 二进制 十进制 十六进制 缩写 能够显示的表示法 名称/意义 0000 0000 0 00 NUL ␀ 空字符(Null) 0000 00 ...
- HDU 1710 Binary Tree Traversals(二叉树)
题目地址:HDU 1710 已知二叉树先序和中序求后序. #include <stdio.h> #include <string.h> int a[1001], cnt; ty ...
- IOS手机使用Fiddler抓获HTTPS报文方法
Configure Fiddler Click Tools > Fiddler Options > Connections. Click the checkbox by Allow rem ...
- Python continue
continue继续循环在循环过程中,可以用break退出当前循环,还可以用continue跳过后续循环代码,继续下一次循环.假设我们已经写好了利用for循环计算平均分的代码: L = [75, 98 ...
- taro 打包微信小程序运行失败(二)
1.报错信息 thirdScriptError sdk uncaught third Error Cannot read property 'dispatch' of null TypeError: ...
- Java之开发工具(1) - Eclipse 如何设置注释的模板
最常用的注释就是对类的说明和方法的说明,关于这类代码的注释方式,在Eclipse中可以这样进行设置: windows---preferences...---java--code style--code ...
- PHP位运算符(转)
例子 名称 结果 $a & $b And(按位与) 将在 $a 和 $b 中都为 1 的位设为 1. $a | $b Or(按位或) 将在 $a 或者 $b 中为 1 的位设为 1. $a ^ ...
- mosquitto ---配置SSL/TLS
在服务器电脑上面创建myCA文件夹, 如在/home/qa/ 文件夹下使用命令, mkdir myCA 然后执行以下命令,我们将创建并使用其他用户没有权限访问的目录. sudo chmod 700cd ...