背景
需求
- 下订单后未付款订单24小时关闭
- 申请退款后72小时后 验证是否订单已处理 未处理则可退款 否则撤销退款
问题描述
- serviceA 将会多实例部署,定时器时钟乱序,会导致重复添加退款任务,也会导致serviceA重复消费退款任务
解决方案
- 用户申请退款后,将待退款订单存入mongo
- 设置定时器获取mongo待退款订单,逐个push入redis,由于需要保证只有一个serviceA实例添加任务,redis中使用sendIfAbsent 设置一个信号量锁,并设置超时时间,以免serviceA死掉后,无法释放锁,以此保证单个实例生成任务。
- 弹出任务多实例消费,未到时任务不放回队列,等待下一次任务重新生成。
到时任务处理退款逻辑。处理逻辑时若发生异常,则设置mongodb中的异常次数字段,以此来判断重试次数,重试5次以上则存储异常数据,不在进行重试,并且报警。
代码还未抽象出来,后续会上传github
如有人看到此文章,有更好的想法,欢迎留言
网友评论