防重复提交

转自:http://patrick002.iteye.com/blog/2197521

看到一篇关于防重复提交的文章,记录一下:

#防重复处理总结
##背景
在业务开发中,我们常会面对防止重复请求的问题。当服务端对于请求的响应涉及数据的修改,或状态的变更时,可能会造成极大的危害。重复请求的后果在交易系统、售后维权,以及支付系统中尤其严重。

前台操作的抖动,快速操作,网络通信或者后端响应慢,都会增加后端重复处理的概率。

前台操作去抖动和防快速操作的措施,我们首先会想到在前端做一层控制。当前端触发操作时,或弹出确认界面,或disable入口并倒计时等等,此处不细表。

但前端的限制仅能解决少部分问题,且不够彻底,后端自有的防重复处理措施必不可少,义不容辞。

在接口实现中,我们常要求接口要满足幂等性,来保证多次重复请求时只有一次有效。

查询类的接口几乎总是幂等的,但在包含诸如数据插入,多模块数据更新时,达到幂等性会比较难,尤其是高并发时的幂等性要求。比如第三方支付前台回调和后台回调,第三方支付批量回调,慢性能业务逻辑(如用户提交退款申请,商家同意退货/退款等)或慢网络环境时,是重复处理的高发场景。

##尝试

这里针对“用户提交退款申请”的例子,说明一下尝试过的防重复处理方法的效果。

后端防重复处理的方式,我们先后尝试了三种:

####1)基于DB中退款订单状态的验证

这种方式简单直观,从DB查询出来的退款详情(包括状态)往往还可以用在后续逻辑中,没有花额外的工作专门应对重复请求的问题。

这种查询状态后进行验证的逻辑,从代码上线后就一直存在于所有含状态的业务逻辑处理中,必不可少。但对于防重复处理效果并不好:在前端添加防重复提交前,每周平均在25笔;前端优化后,每周降到7笔。这个数量占总退款申请数的3%%,一个仍然无法接受的比例。

理论上,任意次请求只要在数据状态更新之前都完成了查询操作,则业务逻辑的重复处理就会发生。如下图所示。优化的方向是减少查询到更新之间业务处理时间,可降低空档期的并发影响。极致情况下如果查询和更新变成了原子操作,则就不存在我们当前的问题。

image

 

####2)基于缓存数据状态的验证
Redis存储查询轻量快速。在request进来的时候,可以先记录在缓存中。后续进来的request每次进行验证。整个流程处理完成,清除缓存。以退款为例子:

    I.  每次退款发起申请,读取缓存中是否有以orderId为key的值II. 没有,则往缓存中写入以orderId为key的valueIII.有,则说明有该订单的退款正在进行。IV. 操作完清缓存,或者缓存存值的时候设置生命周期

与1)的发放相比,数据库换成响应更快的缓存。但是仍然不是原子操作。插入和读取缓存还是有时间间隔。在极致的情况下还是存在重复操作的情况。
此方法优化后,每周1笔重复操作。

image

 

####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进来则往表里面插入数据:

——成功,则可以继续操作(相当于获取锁);
——失败,则说明有操作在进行。

操作完成后,删除此条记录。(相当于释放锁)
目前已经上线,等待下周的数据统计。

image

####4)基于缓存的计数器验证:

由于数据库的操作比较消耗性能,了解到redis的计数器也是原子性操作。果断采用计数器。既可以提高性能,还不用存储,而且能提升qps的峰值。

还是以订单退款为例子:

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

如果>1(不能获得锁): 说明有操作在进行,删除。如果=1(获得锁): 可以操作。

操作结束(删除锁):删除这个计数器。
要了解计数器,可以参考:

http://redis.io/commands/incr

image

 

##总结:

PHP语言自身没有提供进程互斥和锁定机制。因此才有了我们上面的尝试。

网上也有文件锁机制,但是考虑到我们的分布式部署,建议还是用缓存。

在大并发的情况下,程序各种情况的发生。特别是涉及到金额操作,不能有一分一毫的差距。所以在大并发要互斥的情况下可以考虑3、4两种方案。

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

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

相关文章

如何解决重复提交造成的数据重复

理解HTTP幂等性 基于HTTP协议的Web API是时下最为流行的一种分布式服务提供方式。无论是在大型互联网应用还是企业级架构中,我们都见到了越来越多的SOA或RESTful的Web API。为什么Web API如此流行呢?我认为很大程度上应归功于简单有效的HTTP协议。HTTP协…

中大计算机研究生华为,考上中山大学很厉害吗?毕业后有机会去华为吗?本文有答案...

原标题:考上中山大学很厉害吗?毕业后有机会去华为吗?本文有答案 声明:本文转载自网络,如有侵权,请在后台留言联系我们进行删除,谢谢! 中山大学是全国知名985高校,也是广东…

到底要不要报考“通信工程”?

作者 | 小枣君 来源 | 鲜枣课堂 “通信工程”是干嘛的 通信工程,英文全称叫做Communication Engineering,是一门重要的工学基础学科。 根据教育部《学位授予和人才培养学科目录设置与管理办法》,“通信工程”属于二级学科,归属于“…

我通过了软考高项,有些话想说

文章目录 1. 软考成绩2. 备考过程与经验3. 遇到的坑4. 论文准备5. 资料及寄语 1. 软考成绩 昨天下午得到了一个振奋人心的消息,我的软考通过了,感觉努力没有白费很欣慰,也感觉有很多话要说(真不是得瑟)。可能很多人不…

大学报考计算机相关专业,这份指南收好,最新数据

2022年的高考已经结束了,但却并不代表高考落幕了,因为后面的报考学校和专业更是一轮重头戏,几年的寒窗苦读自然是要考上一个好学校好专业,才算真正给自己生涯划上句号。 今天给大家分享的计算机相关专业的实际情况,包…

测试高考分数能上什么大学的软件,测你能考上哪所大学软件是什么

测你能考上哪所大学软件是什么,小编整理了相关信息,来看一下! 测你能考上哪所大学软件 蝶变志愿 蝶变志愿是是为帮助高三考生和家长学习高考志愿填报知识,查询院校和专业信息的软件。软件包含教育部公布的所有大学的信息和1800多种…

某程序员自述:我,三十多岁,逃离北上广,通过技术移民到加拿大!

本文转载自 程序员八卦 在北上广的巨大压力下,许多人选择逃离,有人“逃”回了老家,有人则“逃”到了国外,之前我们分享过一个“逃”到新加坡的程序员故事,今天再来分享一个“逃”到加拿大的程序员故事。 这是一位已经…

2019全球数据新闻奖揭晓

大数据文摘授权转载自RUC新闻坊 编辑:刘长宇、刘畅、段钇男、葛书润、肖鳕桐、姚思妤、欧阳婕、马冰莹 2019年全球数据新闻奖于当地时间6月14日(北京时间6月15日)在希腊揭晓,本次评选共收到参赛作品607件,经过初选&…

全球最大NFT交易平台OpenSea

文章目录 全球最大NFT交易平台OpenSea背景什么是OpenSea发展历史OpenSea都支持哪些公链 参考 全球最大NFT交易平台OpenSea 背景 Ethereum上NFT销售额在2021年已超过90亿美元,比2020年的总销售额增长了2500%。2021年作为NFT元年,同时出现在牛市周期的背…

加拿大java技术移民_加拿大技术移民分析贴之新手入门级!

释放双眼,带上耳机,听听看~! 加拿大技术移民分析贴之新手入门级! 能力 学历 申请能力 学历 申请能力 学历 申请 移民加拿大有很多种方式,加拿大技术移民是最主要的方式之一,也是加拿大移民重要组成部分&…

科技巨头打响第一枪!“我们将要被AI取代”?

来源:量子位 “这不是演习,AI让人失业来真的了!” 就在这个劳动节假期,科技巨头IBM宣布: 暂缓可以被AI取代的岗位的招聘,约7800人将被永久淘汰。 尽管“我们要被AI取代”的唬人消息不是第一次出现了&#x…

如何用AI技术实现和马斯克实时视频聊天

前言 在直播盛行、短视频横飞、主播满地的今天,个人上传自己的生活视频来记录日常已经屡见不鲜了。拿起手机拍个视频,并且在上传前顺便美颜一下,乐此不疲。 但是最近看到的一些AI诈骗新闻却不得不令人担忧,网上你以为的帅哥美女、…

这段视频火爆外网,谷歌把AI视频造假搞得太真太简单了

来源:量子位 家人们,AI做视频这事今天又被推向了舆论的风口浪尖。 起因是有人在网上发布了这么一只小企鹅的视频: 而这个近50秒视频的诞生,靠的仅仅是6句话! 陆陆续续的,网友们还在发布着这个AI的其它杰作&…

2020AI顶会的腾讯论文解读 | 多模态学习、视频内容理解、对抗攻击与对抗防御等「AI核心算法」

关注:决策智能与机器学习,深耕AI脱水干货 报道 | 腾讯AI实验室 计算机视觉领域三大顶会之一的 ECCV(欧洲计算机视觉会议)今年于 8 月 23-28 日举办。受新冠肺炎疫情影响,今年的 ECCV 与 CVPR 一样是完全的线上会议。近…

豪气!华为放话:3年培养100万AI人才!网友神回应了

大家经常把BAT挂在嘴边,但是可能有些人还不知道,华为的体量早已超越了这三巨头,只是迟迟不肯上市。华为的创始人任正非曾说表:上不上市不重要,最重要的是要让中国华为的技术能够称霸全球! 华为对技术的重视…

豪投10亿!华为放话:3年培养100万AI人才!网友神回应了

近期,AI测试权威软件AI Benchmark的测试数据显示,中国华为研发的7nm旗舰手机芯片麒麟810的AI分数,远远超过美国高通骁龙855了! 麒麟810芯片AI分数是3300多,名列第一。而骁龙855手机则是2700多。 大家振奋的同时&#…

ETH今日全网算力上涨3.14%

消息面:BTC全网算力123.098EH/s,挖矿难度16.85T,目前区块高度642856,理论收益0.00000809/T/天。 ETH全网算力201.064TH/s,挖矿难度2535.06T,目前区块高度10622682,理论收益0.00911583/100MH/天。 BSV全网算力2.305EH/s,挖矿难度0.32T,目前区块高度647319,理论收益0.0…

一分钟配置Openai api接口代理

目录 目录 目录一、首先需要一个国外的云服务器二、搭建步骤1.连接服务器2.安装宝塔2.服务器安装以及配置 答疑合作 一、首先需要一个国外的云服务器 这里推荐这个。链接:衡天云 二、搭建步骤 1.连接服务器 可使用xshell或者自带的vnc直接连接,账号密…

ChatGPT预示着人类文明的终结?丨小智ai

ChatGPT丨小智ai丨chatgpt丨人工智能丨OpenAI丨聊天机器人丨AI语音助手丨GPT-3.5丨OpenAI ChatGPT|GPT-4|GPT-3|人机对话|ChatGPT应用|小智ai|小智ai|小智ai|小智ai|小智AI|chatgpt小智AI 人工智能(AI)的快速发展和广泛应用给我们的社会带来了前所未有的…

跟ChatGPT聊天、需求润色优化,禅道OpenAI 插件发布

禅道插件上新了,OpenAI 禅道集成,可提供神奇海螺聊天、需求润色功能。 神奇海螺 “章鱼哥,你为什么不问问神奇海螺呢?”——海绵宝宝 那么,就让我们问一问神奇 海螺吧!禅道上线神奇海螺功能,…