高并发下接口幂等性解决方案

高并发下接口幂等性解决方案

1. 幂等性概念:

①. 一个幂等操作指任意多次执行所产生的影响跟一次执行的影响相同.②. 幂等函数(幂等方法):a. 可以使用相同参数重复执行,并能获得相同结果的函数.b. 这些函数不会影响数据状态,也不用担心重复执行会对数据造成改变.c. 如:"getUsername()"、"setTrue()"就是一个幂等函数.③. 总结:幂等就是一个操作不论执行多少次,产生的效果和返回的结果都是一样的.

2. 业务场景:

①. 前端重复提交选中的数据,后台只能产生一个反应结果.
②. 发起一笔付款请求,只能扣用户账户一次钱,当遇到网络重发或系统bug重发,也只能扣一次钱.
③. 发送短信、极光推送等消息,也只能发一次.
④. 创建业务订单,一次业务请求只能创建一个.

3. 技术场景:

(1). mysql:

①. 查询操作:a. 在数据不变的情况下,查询一次和多次的结果是一样的.b. select是天然的幂等操作.②. 删除操作:a. 删除一次和多次都是把数据删除,会体现在返回结果不一样.b. 删除的数据不存在,返回0.c. 删除的数据多条,返回多条值.③. 唯一索引:a. 防止新增脏数据.b. 如:支付宝每个用户只能有一个资金账户,将资金账户表的用户ID加唯一索引,可以防止给用户创建资金账户多个.c. 唯一索引或唯一组合索引是用来防止新增数据存在脏数据.④. 悲观锁:a. 加锁获取数据:select * from table_xxx where id='xxx' for update;b. 注:id字段一定是主键或唯一索引,否则会锁表.c. 悲观锁使用时,一般伴随事务一起使用,数据锁定时间可能会很长(根据实际情况选用).⑤. 乐观锁:a. 只在更新数据那一刻锁表,其它时间不锁表.b. 相对于悲观锁,效率更高.c. 实现方式可以通过version或其他状态条件:1. 通过版本号实现:update table_name set name=xx, version=version+1 where id=#id# and version=xxx2. 通过条件限制实现:update table_name set avai_amount=avai_amount-#subAmount# where  id=#id#  and  avai_amount-#subAmount# >= 0要求:quality-#subQuality# >= ,这个情景适合不用版本号,只更新是做数据安全校验,适合库存模型,扣份额和回滚份额,性能更高;d. 注:乐观锁的更新操作,最好加主键或唯一索引来更新,这样是行锁,否则更新时会锁表.(2). redis:

①. token机制:
a. 防止页面重复提交.
b. 当客户端请求页面时,服务器会生成一个随机数Token保存到redis或session中,再将Token发给客户端(hidden表单).
c. 下次客户端提交请求时,Token会随着表单一起提交到服务器端.
d. 服务器端第一次验证相同通过后,会将Token值更新,若是用户重复提交,第二次的验证判断将会失败.


(3). 分布式锁:

如果是分布是系统,构建全局唯一索引比较困难,例如唯一性的字段没法确定,这时候可以引入分布式锁,通过第三方的系统(redis或zookeeper),在业务系统插入数据或者更新数据,获取分布式锁,然后做操作,之后释放锁,这样其实是把多线程并发的锁的思路,引入多多个系统,也就是分布式系统中得解决思路。要点:某个长流程处理过程要求不能并发执行,可以在流程执行之前根据某个标志(用户ID+后缀等)获取分布式锁,其他流程执行时获取锁就会失败,也就是同一时间该流程只能有一个能执行成功,执行完成后,释放分布式锁(分布式锁要第三方系统提供);


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

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

相关文章

Crocoddyl: 多接触最优控制的高效多功能框架

系列文章目录 前言 我们介绍了 Crocoddyl(Contact RObot COntrol by Differential DYnamic Library),这是一个专为高效多触点优化控制(multi-contact optimal control)而定制的开源框架。Crocoddyl 可高效计算给定预定…

太阳能供电+4G摄像头搭建EasyCVR鱼塘养殖远程视频监控方案

一、背景需求 随着我国农业的快速发展,以及对新兴技术的应用,养殖业、农牧业、种植业等也面临着全新的挑战与机遇。对鱼塘养殖行业来说,养殖区域面积大、管理难,经常会遇到偷钓者、盗窃鱼苗、非法入侵等监管难题。在国家大力扶持…

2023年OceanBase开发者大会-核心PPT资料下载

一、峰会简介 2023年OceanBase开发者大会主要涵盖了OceanBase的最新技术进展、产品更新以及开发者工具的发布。大会发布了OceanBase 4.1版本,公布了两大友好工具,升级了文档的易用性,并统一了企业版和社区版的代码分支。这些举措全面呈现了O…

基于局域网和广域网训练推理加速策略

一、基于局域网的多GPU上并行训练 TensorFlow 的 MirroredStrategy 和 PyTorch 的 DistributedDataParallel 它们可以帮助您在多个 GPU 或多个计算节点上训练大型模型。这些策略的核心目标是提高训练速度,同时保持模型的准确性和稳定性。 加速的底层原理 TensorFlow 的 Mirro…

Android Studio导出Excel的一些感悟

目前,我一共用了四种依赖。分别用于导出Excel。 第一种: // https://mvnrepository.com/artifact/net.sourceforge.jexcelapi/jxlimplementation group: net.sourceforge.jexcelapi, name: jxl, version: 2.6.12 缺点:1、已经很久没有更新…

一文教会pandas

今天的笔试题令我感触很深,回顾一下之前写的都是低代码想想都。。。 anareport[[reportid,anndt,stockid]].drop_duplicates().rolling(window10,min_periods1).sum().groupby([anndt,stockid])[reportid].count() dfanareport[[reportid,anndt,stockid]].drop_dup…

构建高效持久层:深度解析 MyBatis-Plus(02)

目录 引言1. 逻辑删除1.1 概述1.2 逻辑删除的优势1.3.为什么使用逻辑删除1.4 综合案例 2. 乐观锁和悲观锁2.1.什么是乐观锁和悲观锁2.2.乐观锁和悲观锁的区别2.3.综合案例 3. 分页插件总结 引言 在现代软件开发中,数据库操作是不可或缺的一环。为了提高系统的性能、…

awk统计日志

部分日志文本格式内容 [2023-12-18 22:40:52.301][INFO ][221][com.excellent.common.core.security.filter.UrlRedirectFilter.doFilter:131] ----------------->>> 请求进入拦截器,IP:14.111.199.218, CLIENT:ANDROID&#xff0c…

避坑指南:uni-forms表单在uni-app中的实践经验

​🌈个人主页:前端青山 🔥系列专栏:uni-app篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:uni-app中forms表单的避坑指南篇 该篇章已被前端圈子收录,点此处进入即可查看更多优质内…

LeetCode-152. 乘积最大子数组

问题描述 原题链接 给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。 测试用例的答案是一个 32-位 整数。 子数组 是数组的连续子序列。 问题分析 …

计算机网络考研辨析(后续整理入笔记)

文章目录 体系结构物理层速率辨析交换方式辨析编码调制辨析 链路层链路层功能介质访问控制(MAC)信道划分控制之——CDMA随机访问控制轮询访问控制 扩展以太网交换机 网络层网络层功能IPv4协议IP地址IP数据报分析ICMP 网络拓扑与转发分析(重点…

Distilling the Knowledge in a Neural Network 中文版 (含: bibtex格式的引用)

bibtex格式的引用 article{hinton2015distilling,title{Distilling the knowledge in a neural network},author{Hinton, Geoffrey and Vinyals, Oriol and Dean, Jeff},journal{arXiv preprint arXiv:1503.02531},year{2015} }摘要 提高几乎所有机器学习算法性能的一个非常简…

阶段十-springsecurity总结

jwt认证流程 SpringSecurity 认证过程 第一步: 创建一个类实现UserDetailsService接口,重写其中的方法 通过重写 public UserDetails loadUserByUsername(String username) 方法 从数据库校验用户输入的用户名 配置SecurityConfig Bean注入 Passwor…

面试题总结(十一)【C++】【华清远见西安中心】

C和C的区别有哪些? C 和 C 是两种不同的编程语言,它们有以下一些区别: 1. 语言起源和发展:C 语言是由贝尔实验室的 Dennis Ritchie 在 1972 年开发的,主要用于系统编程和底层开发;而 C 语言是在 C 语言的基…

类中成员函数及普通函数地址获取方式

文章目录 代码准备测试演示注意事项成员函数类型申明测试演示总的打印输出 代码准备 头文件:Calc.h #pragma onceclass Calc { public:int add(int,int);//函数声明static int sub(int,int);//函数声明 public:int b;//定义了一个成员变量static int a;//声明了一个静态成员变…

SG3524控制的恒流源电路图

SG3524简介 SG3524是开关电源脉宽调制型控制器。应用于开关稳压器,变压器耦合的直流变换器,电压倍增器,极性转换器等。采用固定频率,脉冲宽度调制(脉宽调制)技术。输出允许单端或推挽输出。芯片电路包括电…

lvs负载均衡

lvs负载均衡群集 群集 特点:由多台主机构成,都干同一件事,对外显示一个整体 企业集群分类 负载均衡群集高可用群集高性能运算群集 负载均衡群集(LB) 负载均衡的作用 提高应用系统的响应能力可以处理更多的访问请…

Bifrost 中间件 X-Requested-With 系统身份认证绕过漏洞复现

0x01 产品简介 Bifrost是一款面向生产环境的 MySQL,MariaDB,kafka 同步到Redis,MongoDB,ClickHouse等服务的异构中间件 0x02 漏洞概述 Bifrost 中间件 X-Requested-With 存在身份认证绕过漏洞,未经身份认证的攻击者可未授权创建管理员权限账号,可通过删除请求头实现身…

动态加载库

no_mangle 不要改标识符 首先是认识这个标注:mangle,英文的含义“撕裂、碾压”。我第一次把这个单次误以为是manage,说实话两个单词还挺像的。 RUS中函数或静态变量使用#[no_mangle]这个标注属性后,编译器就不会修改它们的名字了…

Home Assistant 如何开启SSH服务

环境: Home Assistant 11.2 SSH & Web Terminal 17.0 问题描述: Home Assistant 如何开启SSH服务 解决方案: 通过添加一个名为Terminal & SSH的插件来在 Home Assistant 中启用 SSH 服务 下面是启用 SSH 服务的大致步骤&#x…