hi,你好!欢迎访问本站!登录
本站由简数采集腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - PHP教程 - 正文 请牢记本站网址www.sosophp.cn

防定单反复提交战略要领【php教程】

2019-12-01PHP教程搜搜PHP网112°c
A+ A-

背景

在营业开辟中,我们常会面临防备反复请求的题目。当服务端关于请求的相应触及数据的修正,或状况的变动时,可能会形成极大的伤害。反复请求的后果在交易体系、售后维权,以及付出体系中特别严峻。

前台操纵的发抖,疾速操纵,收集通信或许后端相应慢,都邑增添后端反复处置惩罚的几率。前台操纵去发抖和防疾速操纵的步伐,我们起首会想到在前端做一层掌握。当前端触发操纵时,或弹出确认界面,或disable进口并倒计时等等,此处不细表。但前端的限定仅能处理少部分题目,且不够完全,后端自有的防反复处置惩罚步伐必不可少,责无旁贷。

在接口完成中,我们常请求接口要满足幂等性,来保证屡次反复请求时只需一次有用。

查询类的接口险些老是幂等的,但在包含诸如数据插进去,多模块数据更新时,到达幂等性会比较难,特别是高并发时的幂等性请求。比方第三方付出前台回折衷背景回调,第三方付出批量回调,慢机能营业逻辑(如用户提交退款请求,商家赞同退货/退款等)或慢收集环境时,是反复处置惩罚的多发场景。

尝试

这里针对“用户提交退款请求”的例子,申明一下尝试过的防反复处置惩罚要领的结果。后端防反复处置惩罚的体式格局,我们前后尝试了三种:

(1)基于DB中退款定单状况的考证

这类体式格局简朴直观,从DB查询出来的退款概况(包含状况)每每还能够用在后续逻辑中,没有花分外的事情特地应对反复请求的题目。

这类查询状况后举行考证的逻辑,从代码上线后就一向存在于一切含状况的营业逻辑处置惩罚中,必不可少。但关于防反复处置惩罚结果并不好:在前端增加防反复提交前,每周平均在25笔;前端优化后,每周降到7笔。这个数目占总退款请求数的3%%,一个依然没法接收的比例。

理论上,恣意次请求只需在数据状况更新之前都完成了查询操纵,则营业逻辑的反复处置惩罚就会发作。如下图所示。优化的方向是削减查询到更新之间营业处置惩罚时刻,可下降空档期的并发影响。极致状况下假如查询和更新变成了原子操纵,则就不存在我们当前的题目。

(2)基于缓存数据状况的考证

Redis存储查询轻量疾速。在request进来的时刻,能够先纪录在缓存中。后续进来的request每次举行考证。全部流程处置惩罚完成,消灭缓存。以退款为例子:

  • I. 每次退款提议请求,读取缓存中是不是有以orderId为key的值
  • II. 没有,则往缓存中写入以orderId为key的value
  • III.有,则申明有该定单的退款正在举行。
  • IV. 操纵完清缓存,或许缓存存值的时刻设置生命周期

与1)的发放比拟,数据库换成相应更快的缓存。然则依然不是原子操纵。插进去和读取缓存照样有时刻距离。在极致的状况下照样存在反复操纵的状况。此要领优化后,每周1笔反复操纵。

(3)应用唯一索引机制的考证

须要原子性操纵,想到了数据库的唯一索引。新建一个TradeLock表:

CREATE TABLE `TradeLock` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`type` int(11) NOT NULL COMMENT '锁范例',
`lockId` int(11) NOT NULL DEFAULT '0' COMMENT '营业ID',
`status` int(11) NOT NULL DEFAULT '0' COMMENT '锁状况',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='Trade锁机制';

● 每次request进来则往表内里插进去数据:

胜利,则能够继承操纵(相当于猎取锁);
失利,则申明有操纵在举行。

● 操纵完成后,删除此条纪录。(相当于开释锁)。

现在已上线,守候下周的数据统计。

(4)基于缓存的计数器考证

因为数据库的操纵比较斲丧机能,相识到redis的计数器也是原子性操纵。坚决采纳计数器。既能够进步机能,还不必存储,而且能提拔qps的峰值。

照样以定单退款为例子:

● 每次request进来则新建一个以orderId为key的计数器,然后+1。

假如>1(不能取得锁): 申明有操纵在举行,删除。
假如=1(取得锁): 能够操纵。

● 操纵完毕(删除锁):删除这个计数器。

要相识计数器,能够参考:http://www.redis.cn/commands/incr.html

总结:

PHP言语本身没有供应历程互斥和锁定机制。因而才有了我们上面的尝试。网上也有文件锁机制,然则斟酌到我们的分布式布置,发起照样用缓存。在大并发的状况下,顺序各种状况的发作。特别是触及到金额操纵,不能有一分一毫的差异。所以在大并发要互斥的状况下能够斟酌3、4两种计划。

爱迪生尝试了1600多种材料挑选了钨丝发清楚明了灯胆,实践出真知。遇到题目,和题目奋斗,末了处理题目是一个最大提拔自我的历程,不只加宽本身的学问广度,更加深了本身的妙技深度。到达目的以后的成就感更是显而易见。

以上就是防定单反复提交战略要领的细致内容,更多请关注ki4网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
防定单反复提交战略要领【php教程】

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
标签: