消息队列之通过幂等设计和原子锁避免重复退款

幂等性设计

我们回顾下上篇教程创建的 RefundAttendee 任务类,它会做两件事情 —— 退款和发送邮件:

如果这个队列任务执行失败,由于配置了 tries 值为 3,所以会重试,这里就存在一个隐患:如果退款成功,但邮件发送异常导致任务失败重试,就存在重复退款的问题。

我们在设计队列任务的执行时,由于存在重试机制,所以要考虑多次执行的幂等性,对于当前这个退款场景而言,就是多次执行 RefundAttendee,也不会出现重复退款。要实现这个幂等性,可以在 handle 方法中先判断该用户是否已经退款,只有未退款的用户才会发起退款操作:

双重检查

需要注意的是,调用第三方支付服务 API 进行退款会发起网络请求,如果退款成功,但是由于网络问题导致返回响应失败,那么永远也不会将订单标记为已退款。同样的问题也肯能会出现在退款后更新订单退款状态时。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值