订单的幂等处理
学习点
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队列,或者放到异常队列中,人工处理。
总结
例如:以上就是关于幂等问题的总结内容。