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

从零开始利用MATLAB进行FPGA设计(六)用ADC采集信号教程1 用AN9238采集信号的方法(1),包含PLL、FIFO、ILA的基础教程。 阅读详情

1 引言

在实际开发中,经常遇到这样的场景:无论做多少次操作,都应该产生一样的效果或是返回同样的结果。如:

  • 用户发起一笔付款请求,应该只扣除用户一次余额,无论是因为网络重发或是系统bug,都应该只扣除一次
  • 发送通知消息,应该只发一次,要是用户重复收到通知会引起客户反感
  • 分销系统中给推广者计算佣金,每个周期内的佣金只能入库一次,要是重复入库难免会造成财务损失

2 幂等性的概念

幂等(idempotence)是一个数学与计算机概念,常见于抽象代数中。在计算机编程中,一个幂等操作的特点是其任意多次执行所产生的效果与一次执行相同。在比较复杂的场景中幂等操作常常是通过唯一交易号(流水号)实现的。

3 幂等操作的技术实现方案

3.1 查询操作

查询一次和查询多次结果相同,在数据不变的情况下,查询结果相同。SELECT是天然的幂等操作。

3.2 删除操作

DELETE操作也是幂等的,对若干条数据删除一次和删除多次效果相同(注意返回结果不同,删除成功则返回成功删除的条数,删除的数据不存在则返回0)。

3.3 唯一索引

防止新增脏数据。比如支付宝用户账户,当新用户注册手机号成为新用户之后需要创建一个支付宝账户,给手机号设置一个唯一索引,这样就防止同个手机号被重复注册了(当使用唯一索引时,为了防INSERT时报错影响用户体验,所以需要在插入时使用try{…}catch(){…}体,并捕获异常DuplicateKeyException)。

3.4 悲观锁

获取数据的时候加锁。SELECT * FROM table t WHERE t.id=#{} for update;注意,id字段一定是主键或者是唯一索引,不然会锁表,高并发的时候会出现服务宕机的。悲观锁一般是伴随着事务一起使用。

3.5 乐观锁

乐观锁只是在更新那一刻锁表,其它时候不锁表,所以相对于悲观锁效率更高。乐观锁可以通过版本号和其它字段状态实现:

1. UPDATE table SET username=#{newVal},version=2 WHERE username=#{originVal},version=1
2. UPDATE table SET username=#{newVal} WHERE username=#{originVal}

第2种实现适合不用版本号,更新时只做数据安全校验的场景,适合库存模型:如扣除份额和回滚份额,性能更高。
乐观锁的更新操作,最好是用主键或者唯一索引来更新,这样是行锁,否则更新时会锁表。上述语句改成以下效果更好:

1. UPDATE table SET id=#{newVal},version=2 WHERE id=#{originVal},version=1
2. UPDATE table SET id=#{newVal} WHERE id=#{originVal}

3.6 分布式锁

分布式锁只要是为了解决分布式条件下,某一流程只能由一个系统执行,此时由于构造全局的唯一索引比较困难,例如唯一性字段不好确定,此时就需要引入分布式锁。如果说3.3节的唯一索引是将请求拦截在下游,分布式锁就是将请求拦截在上层。实现机制是:通过Redis或者Zookeeper构造分布式锁(如Redis的setnx()指令),在业务系统插入或更新数据时需要先获取分布式锁,由于锁只能由一个系统获取,所以其它系统都将被拒绝,获取锁的进程执行完之后释放分布式锁。

3.7 token机制

主要是为了防止页面重复提交。

在这里插入图片描述

注意:token每次都需要申请,有效性只有一次,可以限流。也可以通过SELECT+DELETE的机制来校验token,但这种方式存在并发问题,效率较低。

3.8 SELECT+INSERT

并发不高的后台系统为了支持幂等性,支持重复执行,简单的逻辑是:先查询一下关键数据,判断是否已经执行过,再进行业务处理就可以了。但是该方法不支持高并发的场景。

3.9 对外提供的API接口

比如支付宝提供的付款接口:为了保证幂等性,需要在客户提交请求时附带两个参数:source(来源)和seq(序列号)。用source+seq在数据库里面做联合唯一索引,防止重复支持。

4 小结

幂等操作与是不是分布式和高并发没有关系。幂等性是一个合格的程序员的一个基因,在设计系统时是首要考虑的问题,尤其是在像支付宝、银行、互联网金融公司等涉及金钱的系统,既要高效,又要保证数据准确。

点点关注,不会迷路

数据分享:中国历年省、市、县行政区划shp(1949~2023年共计75年) 中华人民共和国县级以上行政区沿革》(三册,1949-1983年)“The Atlas of Changes of Administrative Regions of China”;《中华人民共和国行政区划沿革地图集》The yearly publications of “The Administrative Regions”, 1985-2014;每年的出版行政区划简册(1985-2014年)行政区划网:www.xzqh.org。行政区划网:www.xzqh.org。 阅读详情

相关推荐

硬件单板类机考复习提纲

6、 功率晶体管低导通损耗时处于的状态(饱和状态、放大状态、截止状态)(放大器的采样频率特性)总结:元器件特性(电阻、电容、二极管、三极管、晶体、晶振、MOS、磁珠等)信号质量问题产生根因(单调性、边沿过缓、毛刺、回沟、抖动等)3、 几种电容容量范围大小(超级电容、钽电容、陶瓷电容、铝电容)66、背板连接器接触设计的接触顺序(先导向、再地针、最后信号针)28、逻辑电平接口的特性(CMOS、TTL、ECL、PECL)76、差分电平(lvpecl、RS-422/485、cml)

2303_79562407的博客 1万+

分布式系统面试 - 幂等性设计

分布式系统面试 - 幂等性设计 面试题 分布式服务接口的幂等性如何设计(比如不能重复扣款)? 面试官心理分析 从这个问题开始,面试官就已经进入了实际的生产问题的面试了。 一个分布式系统中的某个接口,该如何保证幂等性?这个事儿其实是你做分布式系统的时候必须要考虑的一个生产环境的技术问题。啥意思呢? 你看,假如你有个服务提供一个接口,结果这服务部署在了 5 台机器上,接着...

YunWisdom 807

用4690张图片搞定物流仓储难题:手把手教你训练YOLOv8纸箱检测模型(附完整源码)

本文详细介绍了如何利用YOLOv8目标检测技术解决物流仓储中的纸箱识别难题。通过4690张图片构建高质量数据集,提供完整的训练教程和源码,实现98.7%的mAP@0.5准确率。文章涵盖数据采集、模型训练、调参技巧到边缘计算部署的全流程,帮助读者快速构建智能仓储检测系统。

weixin_28717939的博客 377

dubbo接口幂等性

https://www.jianshu.com/p/6189275403ed

sun_flower_x的博客 2370

通信算法之267 : DJI无人机 云哨 DroneID 640ms

消费级无人机可以用于高级航拍、物流和人道主义救援等等。但是其广泛使用给安全、安保和隐私带来了许多风险。例如,攻击方可能会使用无人机进行监视、运输非法物品,或通过侵入机场上方的封闭空域造成经济损失。为了防止恶意使用,无人机制造商采用多种对策来强制安全可靠地使用无人机,例如对速度和高度施加软件限制,或使用地理围栏实施禁飞区。作为对传统对策的补充,市场领导者大疆(DJI)为无人机实施了一种称为 DroneID 的跟踪协议,该协议旨在将无人机及其操作员的位置传输给授权实体,例如执法部门或关键基础设施的运营商。

leegang12的专栏 3308

基于 Qt 的轻量化工业组态软件设计与实现

本文设计并实现了一种基于Qt框架的轻量化工业组态软件,解决了传统组态软件体积庞大、部署复杂等问题。该软件采用模块化架构,集成可视化图形编辑、设备数据采集、脚本扩展等核心功能,具有跨平台运行、资源占用低、启动速度快等特点。通过关键技术优化,实现了高效稳定的数据采集、脚本控制和网络通信,可广泛应用于工业机器人HMI、小型PLC监控等轻量化场景。测试结果表明,该软件体积约30MB,运行内存占用60-80MB,启动时间1.2秒,满足工业轻量化监控需求。未来可扩展更多工业组件和协议支持,进一步提升应用价值。

谢谢大家的关注和点赞!这里只有纯纯的知识干货,没有一句废话。希望能实实在在帮到大家~要是觉得有用,别忘了给我点支持哟,你 140

服务调用(Dubbo等RPC)如何保证幂等性?

1、数据库的唯一索引 对于插入性操作,新增记录等 2、基于redis实现一套幂等性防重框架 适用于 更新操作 思路: 将请求的方法名及参数 组合成一个key存到redis中 校验这个key是否存在 但需要考虑 虽然key在redis中 但是 确实执行失败了 需要再次执行,不能拦截 解决思路: try-catch中将key删掉 3、业务逻辑来控制 ...

雪落南城的博客 3838

Python爬虫:招聘网站岗位要求、薪资与求职者数据爬取与分析

通过本文的教程,我们学习了如何通过 Python 编写招聘数据爬虫,爬取招聘网站上的岗位要求、薪资和求职者数据,并通过数据存储、清洗、分析和可视化,获取有价值的信息。网站如智联招聘、猎云网、前程无忧等,都提供了大量的招聘信息,包括岗位要求、薪资范围、工作经验、学位要求、招聘公司等。本文将介绍如何通过 Python 编写爬虫,爬取招聘网站上的岗位要求、薪资、求职者数据,并通过数据存储、分析和可视化等手段,为求职者或招聘者提供实用的信息和决策支持。通过循环抓取多个页面的数据,可以获取不同岗位的信息。

2201_76125261的博客 723

Dubbo分布式接口调用怎么设计幂等

在平时开发中,由于是分布式系统,同一个接口重复请求了多次,这个时候如果是付款接口会导致付款多次,那么我们怎么实现幂等呢,请往下看↓↓↓↓↓↓

酷爱编程的小猿同学 544

Unity中实现俄罗斯方块

二:实现思路 ——创建每一个方块可移动到的位置点,可以理解为创建一个游戏地图,从(0,0)点开始依次向x轴和y轴延伸,例如x最大为9,y最大为19,则创建了一个20行10列的地图 ——制作每一个形状的预制体,Shape是每一个整体形状,Block是每一块小方块,CenterPos代表这个形状的旋转中心 ——创建GameController脚本控制游戏逻辑,挂载到面板物体上。创建Block脚本控制每个形状的操作,挂载到每个形状上 ——在GameController脚本中编...

L的博客 8559

2026滑块验证码终极实战:缺口检测算法+人机轨迹模拟,识别率从60%飙升至95%全方案

**摘要:2026年AIGC技术发展导致传统验证码失效,滑块验证码成为主流防护手段。本文深入分析了传统方案识别率低的原因,并提出多级检测融合和行为拟合优化方案。通过图像预处理优化、三级缺口检测引擎(差分图像法、Hu矩轮廓匹配、YOLOv8n模型兜底)将识别率提升至99.2%。同时针对轨迹模拟环节,设计了包含抖动特征、时间随机性和个体差异的行为模型,使通过率从12%提升至87%。该方案解决了传统方法在缺口定位精度和轨迹真实性方面的核心痛点,为应对新一代验证码风控提供了完整的技术框架。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1899

常用幂等解决方法

常用幂等解决方法

weixin_40587144的博客 475

PyTorch深度学习实战(41)——循环神经网络与长短期记忆网络

循环神经网络 (Recurrent Neural Network, RNN) 通过将前一个时间步的隐藏状态作为当前时间步的输入,实现对序列数据的建模,由于循环连接的存在,RNN 能够捕获时间依赖关系,然而,RNN 在处理长期依赖性问题时会遇到困难。为了解决这个问题,提出了 LSTM,通过引入门控机制改进 RNN 来有效地处理长期依赖关系。在本节中,了解了 LSTM 和 RNN 的基本原理,并介绍了如何在 PyTorch 中实现 LSTM。

盼小辉丶的博客 1万+

高并发场景下的接口幂等性保证:一站式解决方案

高并发场景下的接口幂等性保证:一站式解决方案 去发现同类优质开源项目:https://gitcode.com/ 在现代互联网应用中,高并发场景下的接口幂等性保证是一个不容忽视的问题。无论是电商平台的订单处理,还是社交应用的用户操作,幂等性都是确保数据一致性和系统稳定性的关键。本文将为您详细介绍一个综合性的解决方案,帮助您在高并发环境下轻松实现接口的幂等性。 项目介绍 本项目旨在为开发者提供一套完整...

gitblog_06684的博客 984

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

xuan2717的博客 145

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

后端笔记06 | 高并发下的接口幂等性解决方案总结

结合一些技术博客,学习接口幂等性概念、场景、类型、并发问题下的实现方案

2201_75974870的博客 1900

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: 【数据结构与算法精炼】LeetCode No.169 : Majority Element,由一道算法题想到的关于多数投票算法(Boyer-Moore Voting)的使用
下一篇: Java并发编程(一):了解Thread
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值