摘要:每年支付宝在双和双的活动中,都展示了绝佳的技术能力。对于异步并发重复消息的处理亦是如此,加深对状态机的判断后还可以处理消息乱序问题。
每年支付宝在双11和双12的活动中,都展示了绝佳的技术能力。这个能力不但体现在处理高TPS量的访问,更体现在几乎不会出错,不会出现重复支付的情况,那这个是怎么做到的呢?
诚然,为了实现在高并发下仍不会出错的技术目标,支付宝下了很多功夫,比如幂等性的处理,分布式事务的使用等等,但是个人觉得其中最关键的一点就是“一锁二判三更新”这句看似毫不起眼的口诀。
何为“一锁二判三更新”? 简单来说就是当任何一个并发请求过来的时候
我们先锁定关联单据
然后判断关联单据状态,是否之前已经更新过对应状态了
如果基于第2步判断,之前并没有请求更新过对应状态,则本次请求可以更新并完成相关业务逻辑。如果之前已经有更新过状态了,则本次不能更新,也不能完成业务逻辑。
示意图
话不多说,我们直接上代码:
//第1步锁当前支付单 PaymentInfo resultPaymentInfo = commonPayCoreService .queryPaymentForUpdate(createPaymentInfo.getId()); if (resultPaymentInfo.isFinalStatus()) { //第2步,判断当前支付单状态,如果是终态,则直接返回 //不做任何更新 return resultPaymentInfo; } //第3步更新当前支付单状态到终态,并完成相关业务逻辑(支付成功) payCoreService.updateRequestResult(payChannelResult);
基于以上方案可以100%确保在并发情况下不会出现重复更新问题,按理论来说,就是每次状态机变更前,都要在并发安全情况下判断状态是否已经发生过变更了。
如果第1步或第2步缺失了,会发生什么问题,我们来看一下:
第1步缺失
第2步缺失
只要把这3步作为我们的代码规范,则可以避免大部分的并发重复操作问题。对于异步并发重复消息的处理亦是如此,加深对状态机的判断后还可以处理消息乱序问题。
对于锁的使用可根据实际情况选择悲观锁和乐观锁。
关于悲观锁(数据库行锁),乐观锁(数据库版本锁或分布式锁)的实现方式和坑我们以后再详细说。
可能有人会问不管是悲观锁还是乐观锁对系统的并发量都是有影响的,这个怎么解决?我的观点是在现代分布式系统中,如果追求高可用和稳定则必须在方案上优先满足,对于性能可以通过优化代码逻辑,优化技术架构,扩展数据库资源等方式来解决。
在之前蚂蚁金服的压测中,我负责的结算系统内部有10次左右SQL调用以及一次远程调用(约花费100ms),总流程花费180ms左右。在一台4核8G的机器上压测,java服务并发可以达到150TPS,结果还是令人满意的,通过水平服务器扩展完全没有问题。
在整个支付宝技术架构中,只有一个场景是没有用锁和判断直接更新的,就是2016年的春节五福红包,高达上百万的TPS访问,为了保证用户的顺畅体验,牺牲了状态判断的安全性,在事后再做一次对账(虽然就算出错也于事无补了 :))
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70427.html
摘要:每年支付宝在双和双的活动中,都展示了绝佳的技术能力。对于异步并发重复消息的处理亦是如此,加深对状态机的判断后还可以处理消息乱序问题。 每年支付宝在双11和双12的活动中,都展示了绝佳的技术能力。这个能力不但体现在处理高TPS量的访问,更体现在几乎不会出错,不会出现重复支付的情况,那这个是怎么做到的呢? 诚然,为了实现在高并发下仍不会出错的技术目标,支付宝下了很多功夫,比如幂等性的处理,...
摘要:解决幂等问题的三部曲,也是作者的思考框架。这是解决幂等问题的第二部曲列出并减少副作用的分析维度。所以在并发执行的维度,将并发重复执行变成串行重复执行是最好的幂等解决方案。 纲要 文章目的:本文旨在提炼一套分布式幂等问题的思考框架,而非解决某个具体的分布式幂等问题。在这个框架体系内,会有一些方案举例说明。文章目标:希望读者能通过这套思考框架设计出符合自己业务的完备的幂等解决方案。文章内容...
要了解 VPS 存在的原因,我们可能应该退后一步,先看看服务器。服务器是通过网络向其他计算机提供文件或数据的计算机。服务器可以通过鼠标或键盘直接访问,也可以是所谓的无头服务器,只能远程访问。整个互联网的核心不过是大量互连服务器的集合。要在线执行任何操作,例如启动 How-To Geek 之类的网站或运行天气应用程序等服务,您需要在服务器上运行程序或托管文件。没有服务器,没有站点。但问题是,服务器是...
阅读 694·2021-11-17 09:33
阅读 3725·2021-09-01 10:46
阅读 1736·2019-08-30 11:02
阅读 3260·2019-08-29 15:05
阅读 1381·2019-08-26 11:39
阅读 2245·2019-08-23 17:04
阅读 1957·2019-08-23 15:43
阅读 1353·2019-08-23 14:12