交易系统高并发下的幂等性设计原则

支付中的业务逻辑|支付幂等性 幂等性其实是一个数学上的概念,在计算机领域,幂等是指一个方法被多次重复执行的时候所期望的结果要和第一次执行所期望的结果保持一致... 阅读详情

一、介绍

幂等性就是针对同一个请求,不管该请求被提交了多少次,该请求都将被视为同一个请求,服务端不应该将同一个请求进行多次处理,以确认处理逻辑的正确性,针对交易性系统幂等性的设计尤为重要,否则由于网络或服务器处理超时等问题,就会造成交易混乱,最严重的后果就是乱扣用户的钱,造成投诉満天飞。

 

二、客户端设计原则

系统设计时,一定是要从最坏的角度上去考虑,如网络问题、服务器问题,甚至于包括人为的攻击行为,如果纯粹从服务端的角度去做实现保证,一个是系统的复杂度会加大,二个也会对系统产生更大的并发压力,因而客户端的合理设计也非常重要,举一个示例:

用户在网页端或APP端(统称为客户端)上购买一个商品,通常都是以触发按钮的行为提交该请求,如果客户端没有做请求提交控制,那么由于网络原因或者系统繁忙等原因(这是非常常见的场景),没有在用户期望的时间之内响应,那么用户就会再次点击,那么这个请求又会发往服务端,那么服务端又会再次对这个请求进行处理。

针对这种场景,服务端就会接收处理到多个订单请求,从而产生多条不合理的用户订单。此时在客户端稍微优化一下,当用户的请求提交以后,将订单提交的请求按钮置为不可用的状态,待请求成功响应后跳转到下一步处理逻辑,或者是提单请求超时后再将订单提交按钮置为可用,提示用户上一次的提交可能已经失败,并允许用户再次提交。

当然客户端这样设计并不能完全做到幂等性原则,因为用户同样可以针对相同的订单执行多次提交,服务端如果没有做控制,还是会产生多个订单,只是让错误变得优雅了一点。这个时候需增加令牌策略,在下单之间,针对当前订单从服务端获取一个Token,每次提交的时候都从把该Token带上,针对同一个订单带上相同的值,这样服务端就可以根据该Token来判断是不是一个已经处理的了订单。

说了那么多,看文字太累,还是看图方便,来一个:

 

三、服务端设计原则

根据不同的应用场景,服务端可以使用不同的解决方式,如:

1、数据库的乐观锁;
2、防重表;
3、token令牌;
4、分布式锁;
5、异步处理支付;

其中数据库的乐观锁和防重表的使用,都是涉及到数据的参与,在高并发的应用场景中,业务的判断逻辑尽量不要使用数据库参与,特别是RDBMS的参与,因为RDBMS天生具有不易扩展及事务处理属性,吞吐量上都会有相应的瓶颈,因而用数据库做业务逻辑的控制不是我的菜,这里就不会重点说这两种方式。

1、Token令牌+分布式锁的方式

Token是用于确定交易的唯一属性,也是服务端用于检验当前交易是否合法交易的依据,但是在分布式的复杂环境中,如果没有分布式锁的控制,同一笔交易就可能会被处理多次,因而为了确认交易的幂等性,Token令牌和分布式锁必须要一起使用。

实现逻辑步骤如下:

1、服务端根据交易前请求生成对应的Token,保存于服务端的Token库中,通常是缓存集群中,并将生成好的Token库下发给客户端;
2、客户端在每次请求的时候,都带上对应的Token;
3、服务端获取该Token对应的锁,如果获取成功,则继续下面的步骤;
4、判断是否该Token是否合法,如果合法则继续下一步;
5、处理真实的业务逻辑;
6、业务处理成功后,从缓存中删除该Token;
7、删除获取的分布式锁;

实现逻辑参见下图:

其中分布式锁的获取,可以通过Redis和Zookeeper实现,请参看笔者的另外两篇分别介绍通过Redis和Zookeeper实现分布式的文章:

集群环境中使用Redis实现分布式锁两种方式

集群环境中使用Zookeeper实现分布式幂等控制

2、异步处理

异步处理,通常的做法是将认为需要消费的交易,提交到消息队列中,并注册监听事件,待交易被处理完后,再由处理交易的应用回调注册的监听事件反馈处理的结果。交易处理的调度应用,需要负责对交易的处理符合幂等性的原则,将重复请求的交易请求做去重处理。

实现逻辑见下图:

从逻辑处理上可以看到,只要交易处理器足够多,处理速度也不一定会受到多少的影响,交易生产者和交易接收者甚至可以同步返回结果,当交易接收者接收处理结果超时后,再提示用户过一会儿查看交易的处理结果。

 

京东商城系统架构设计原则 京东商城系统,融合了自营模式、商城模式、三方平台等模式,跟淘宝、天猫以商城模式为主的电商系统相比,业务模式上要丰富很多,包括许多WMS、TMS、OMS的部分。国内中小型电商公司,如果要学,最好是学习京东的业务架构,因为业务模式上相近一些。 一、超大型电商系统架构目标 1、构建超大型电商交易平台,兼顾效率和性能,达到高人效、高时效和低成本的目标。 2、低成本,增加服务的重用性,提高开发效率,降低人力成本;利用成熟开源技术,降低软硬件成本;利用虚拟化技术,减少服务器成本。 3、高... 阅读详情

相关推荐

立创开源:基于STM32F103与ADS1256的六维力传感器低成本实现方案

本文详细介绍了一种基于STM32F103微控制器与ADS1256高精度ADC的低成本六维力传感器实现方案。该方案通过3D打印的六梁弹性体结构结合应变片,将多维力信号转换为电信号,并由24位ADC进行高精度采集。文章涵盖了硬件选型、电路设计、嵌入式软件驱动及上位机数据可视化全流程,为机器人、精密测量等领域的爱好者提供了一个可复现的开源实践参考。

weixin_34718952的博客 388

交易保证幂等性

如果在以太坊中要为用户提交一笔交易或事物,服务器代理广播到网络中: 1.广播成功,服务器返回交易成功结果给前端,如果因为网络问题返回交易成功的信息无法送达客户端呢? 不恰当的处理可能会让用户误以为交易失败(实际上交易成功只是确认成功的消息在网络中丢了),再次发起交易造成损失。 这就是在支付案例中的幂等性。 幂等性指可以使用相同参数重复执行,并能获得相同结果的函数,这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。 也就是相同参数一次请求和多次请求具有相同的状态结果。这个风险需要应用前端

qq_35513792的博客 1773

UDS(三)网络层时间参数

网络层定义了N_Ar、N_As、N_Br、N_Bs、N_Cr、N_Cs六个时间参数。 网络层在检测到错误的时间传递至上层使用者 1.当N_As 超时时,即发送方没有及时发送出N_PDU,系统将放弃信息的接收并传递<N_Result> = <N_TIMEOUT_A>的N_USData.comfirm指示 2.当N_Ar超时时,即接收方没有及时发送出N_PDU,系统将放弃信息的接收并传递<N_Result> = <N_TIMEOUT_A>的N_USData.co

weixin_44522306的博客 1万+

接口交易实现幂等性4种方式

如何实现幂等性,通常实现手段有以下几点: 数据库建立唯一索引,可以保证插入数据库的只有一条数据; Token机制,每次接口请求前先获取一个token,然后再下次请求的时候在header体中加上这个token,然后进行后天验证,如果验证通过删除token,下次请求再次判断token; 悲观锁和乐观锁,悲观锁可以保证每次for update的时候,其他sql无法update数据(在数据库引擎是inn...

weixin_39617728的博客 1273

项目实训(四)——SAM模型的学习与部署

这里的show_mask就是我们用mask的prompt进行分割,show_points就是我们用points进行分割,show_box就是通过box进行分割,这是SAM的三种prompt的方式。总的来说,Meta AI 的 Segment Anything 模型为我们提供了一种全新的物体识别和分割方式,其强大的泛化能力和广泛的应用前景将极大地推动计算机视觉领域的发展。这里有vit_h、vit_b、vit_l三种权重模型,这里可以根据自己的需要下载相应的权重模型。我们是下载的vit_h权重模型。

yyyyyyyx_的博客 1421

Vben Admin权限管理全解析:从动态菜单到按钮级控制(附代码示例)

本文全面解析Vben Admin框架的权限管理系统,从动态菜单生成到按钮级细粒度控制,提供完整的实现方案和代码示例。深入探讨基于角色-权限模型的架构设计,分享前后端协作的最佳实践,帮助开发者快速构建安全高效的企业级后台系统。

weixin_30919429的博客 485

支付业务系统---幂等性

什么是幂等性 HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。也就是说,其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。 这里需要关注几个重点: 幂等不仅仅只是一次(或多次)请求对资源没有副作用(比如查询数据库操作,没有增删改,因此没有对数据库有任何影响)。 幂等还包括第一次请求的时候对资源产生了副作用,但是以后的多次请求都不会再对资源产生副作用。 幂等关注的是以后的多次请求是否对资源产生的副作用,而不关注结果。 网络超时等

时光里的博客 2068

如何正确理解和获取S参数

差分四端口的S参数是由双端口S参数逐步演化而来,因此,在数学中,其各分量均可以从单端S参数推导而来,在实际的仿真和测试中,软件和测量设备也是通过获取单端S参数矩阵再进行运算得到混合S参数矩阵的,并非直接获取。

一只豌豆象的博客 5150

幂等性概念及实现方案

概念 幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。 以支付为例,用户购买商品后支付,支付扣款成功,但是返回结果的时候网络中断或者异常,用户没有看到支付成功的提示,但此时钱已经扣了,用户再次点击按钮,此时进行第二次扣款,返回结果成功,用户查询余额发现多扣钱了,流水记录也变成了两条。 在增删改查4个操作中:查询对于结果是不会有改变的;删除只会进行一次,用户多次点击产生的结果一样;修改在大多场景下结果一样;增加在重复提交的场景下会出现。 支付中的幂等也可以

哈 1169

《深入掌握MongoDB数据库》 - 专栏介绍和目录

本专栏系统讲解MongoDB从基础到高级的全栈知识,涵盖安装配置、核心操作、性能优化、安全运维等核心内容。基础部分包括CRUD操作、数据类型、查询语法等入门知识;进阶部分深入索引优化、聚合查询、事务处理等高级特性;核心原理解析存储引擎与数据格式;安全运维则聚焦访问控制、认证机制、审计日志等企业级实践。通过实战案例与最佳实践,帮助开发者全面掌握MongoDB在不同场景下的应用,适合各层次技术人员系统学习。

数据知道的博客 2992

《QGIS快速入门与应用基础》209:重叠标注处理(移除/偏移)

系统讲解了QGIS中处理标注重叠问题的核心方法与实操流程。文章首先阐述了重叠标注处理的底层逻辑,即 先预防、再调整、后兜底 的递进式策略,并详细介绍了设置入口与界面布局。重点讲解了偏移处理这一首选方案,包括基础方向设置、最大偏移距离与步长配置、以及自动换行等进阶优化规则。针对不同要素类型(点、线、面)提供了行业规范的偏移方向设置建议,并给出从稀疏到密集场景的完整参数推荐值。最后以城市POI点图层为例,演示了5步偏移设置流程,帮助用户实现 无重叠、无压盖、重点突出 的专业标注效果。

LuckyHanMo的博客 670

交易系统的设计原则

一、高并发的设计原则 无状态:应用无状态,配置文件有状态。例如通过不同的配置文件来连接不同的数据库; 拆分:一般按照功能模块进行拆分,这个要按照环境进行权衡,这也是一种隔离。拆分的几个情况: 系统维度:按照系统功能/业务拆分,比如:商品系统,购物车,结算,订单系统等。 功能维度:对系统进行功能拆分,比如,优惠券系统可以拆分为后台优惠券创建、领劵系统、用卷系统等。 读写维度:根据读写比例进行拆分;读系统可以用缓存提升性能,写的量大时,可以考虑分库分表。 AOP维度:根据访问特征,按照AOP进行拆分,

优快云_526654341的博客 575

024、反激变换器的短路保护设计

本文详细探讨了反激变换器短路保护的设计要点与实践经验。作者通过实际案例分析了短路时反激拓扑的电流特性,指出初级峰值电流限制是最基础的保护手段,但需配合打嗝模式使用。文章重点剖析了打嗝模式设计的三个关键陷阱:频率设定、退出条件和软启动衔接。同时强调次级侧辅助保护、变压器参数优化、环路响应协调的重要性,并比较了自恢复与锁死方案的适用场景。最后提出实测验证的四个关键点和设计经验:不盲信芯片手册、保护电路独立设计、充分留有余量、进行破坏性测试。全文以工程实践为导向,为反激电源的可靠短路保护提供了系统性解决方案。

Jack010169的博客 237

亿级流量交易系统架构设计:从高并发到高可用的核心策略

高并发:通过拆分、缓存、异步化提升吞吐量高可用:依靠降级、限流、切换机制保障稳定性业务设计:以状态机、幂等性确保数据一致性系统架构没有银弹,需根据实际场景持续迭代优化,在资源有限时优先解决核心痛点,逐步构建支撑亿级流量的能力。

心猿意码 745

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

系统设计——幂等性与解决方案

简单的说就是调用方在调用接口的时候先向后端请求一个全局 ID(Token),请求的时候携带这个全局 ID 一起请求(Token 最好将其放到 Headers 中), 后端需要对这个 Token 作为 Key,用户信息作为 Value 到 Redis 中进行键值内容校验,如果 Key 存在且 Value 匹配就执行删除命令, 然后正常执行后面的业务逻辑。幂等更多使用的情况是第一次请求不知道结果(比如超时)或者失败的异常情况下,发起多次请求,目的是多次确认第一次请求成功,却不会因多次请求而出现多次的状态变化。

庄小焱 1460

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

mfc 消息消息队列概念_消息队列失败经验总结(幂等性概念以及影响)

相信大家都使用过消息MQ,他可以很好地进行系统解耦,减低变成的复杂度,又可以进行削峰,增加系统在高并发的稳定性。那么使用MQ有哪些注意事项呢?是不是MQ就是万无一失呢?一条MQ消息从产生到消费,有没有可能失败?在哪些环节可能失败,如何处理?1.消息生产失败一般来说,从生产者到MQ中间件是通过网络调用的,是网络调用就有可能存在失败。下面这些原因,都有可能造成MQ生产失败,例如网络波动,尽管生产者到M...

weixin_39690963的博客 144

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

电商交易系统设计:订单状态机与高并发处理实战

电商交易系统是支撑在线购物的核心基础设施,其设计关键在于处理复杂的订单状态流转与高并发请求。状态机模式是实现订单生命周期管理的经典方法,通过定义明确的状态转换规则,确保业务逻辑的严谨性。在分布式系统中,最终一致性与幂等设计成为保障系统可靠性的关键技术,常用Seata等框架处理跨服务事务。面对双十一等流量高峰,分级库存策略与消息队列解耦能有效提升系统吞吐量。本文结合支付对账、熔断降级等实战场景,剖析电商交易系统如何平衡性能与准确性,为开发者提供可落地的架构方案。

weixin_34290096的博客 436

秒杀架构设计实践

本文内容 – 秒杀业务难点 – 秒杀架构理论 – 业务设计 & 总结 摘录:生命轮回。事业、家庭乃至做的每件事都会有生命周期。与其想着何时 Ending,不如脚踏实地,思考未来,活在当下。 From 小弟泥瓦匠思考录 一、前言 一提到秒杀,都会想到高性能、高并发、高可用、大流量…。在电商体系中,交易系统占据了环节中的半壁江山。比如里面特别迷人的秒杀系统,那秒杀涉及到什么架构设计...

La victoria的博客 219

构建高并发高可用的电商平台架构实践

一、 设计理念 1. 空间换时间 1) 多级缓存,静态化 客户端页面缓存(http header中包含Expires/Cache of Control,last modified(304,server不返回body,客户端可以继续用cache,减少流量),ETag) 反向代理缓存 应用端的缓存(memcache) 内存数据库 Buffer、cache机制(数据库,中...

DA6328的博客 330

小明的Java面试奇遇之:支付平台高并发交易系统设计与优化[特殊字符]

《Java支付系统高并发架构设计全解析》 本文通过模拟5轮技术面试,系统讲解了支付平台的高并发架构设计要点。涵盖支付核心流程(分布式锁、幂等性)、高并发优化(Redis双层缓存、Kafka批量发送)、分布式事务(TCC模式)、JVM调优(G1GC参数配置)等核心技术,并给出分库分表、灰度发布、风控系统等场景解决方案。文章突出业务与技术结合,如双11大促下的限流降级策略,银行对接时的对账系统设计,既展示面试应答技巧,又提供可落地的架构方法论,适合Java中高级开发者学习支付系统设计精髓。

爱海贼的无处不在的技术博客 1932

幂等策略分析

幂等策略分析 幂等策略分析 <div class="postBody"> <div id="cnblogs_post_body"><p><a class="fancybox" title="" h

琦琦可乐的博客 331

MessageQueue 消息队列

MQ消息队列是一个按照先进先出(FIFO)队列设计的容器,用于对系统中产生的消息进行存储和消费。使用消息队列主要是为了通过 异步处理 提高系统性能 ,削峰 和 降低系统耦合度 等目的。目前使用较多的消息队列有 ActiveMQ ,RabbitMQ,RocketMQ,KafkaMQ。

weixin_52617676的博客 158

京东商城,超大型电商系统架构设计原则与实践!8页ppt详解

点击“技术领导力”关注∆每天早上8:30推送作者|Mr.K 编辑| Emma老K所在的沪上知名电商公司,几年前被京东收购了,所以对京东的整个技...

技术领导力 1万+
上一篇: 集群环境中使用Zookeeper实现分布式幂等控制
下一篇: Java中的SPI(Service Provider Interface)介绍及示例
冯立彬
冯立彬 优质创作者: 编程框架技术领域 优质创作者: 编程框架技术领域
博客等级 码龄21年 5458粉丝 593原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值