订单的幂等处理

本文探讨了电商项目中防止重复订单提交的幂等处理问题,介绍了Redis+token、MySQL幂等号、Redisson分布式锁和MQ消息失败重试的解决方案,强调了网络延迟和并发处理中的原子性保证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

订单的幂等处理

学习点
1.在电商项目或支付相关的关于防止重复提交的订单幂等处理



前言

不管是电商还其他有关支付订单的项目,基本都会有设计到防止重复提交的幂等问题,这里总结几种常见的解决方案,也欢迎有高手指出更优秀的解决方案。


一、何为幂等?

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数

项目造成幂等问题的几种情况

网络延迟导致的请求重试
前端用户的重复操作请求
第三方中间件的重试机制(如MQ)

二、redis+token解决幂等

流程

在这里插入图片描述

分为两步:
1.生成token
2.用户请求

1.客户端请求->服务端生成token->设置存储时间,加到redis 并且返回给客户端
2.下单请求携带token->判断是否存在token->存在,代表首次下单,删除token,业务操作///不存在,代表重复操作,返回。

注意:因为判断token是否存在和删除token是两次操作,如果单纯在程序中顺序进行,是无法保证多线程操作的原子性的,所以需要加锁或者使用lua脚本,保证两次redis操作的原子性。

三,mysql幂等号

创造具有识别功能的幂等号,借助mysql的去重表(唯有索引)判断数据能否传入。

四,redisson分布式锁

最直接的方法,使用redisson,并在程序中判断是否已经有订单,使得并行操作为串行
底层为setnx设置key值,设置成功执行业务逻辑///失败直接返回

五,mq消息失败重试问题

示例:rabbitMq:当消费者出现异常后,默认策略是消息会不断requeue(重新入队)到队列,再重新发送给消费者,然后再次异常,再次requeue,无限循环,导致mq的消息处理飙升,带来不必要的压力:
我们可以利用Spring的retry机制,在消费者出现异常时利用本地重试,而不是无限制的requeue到mq队列,或者放到异常队列中,人工处理。


总结

例如:以上就是关于幂等问题的总结内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值