幂等性设计
我们回顾下上篇教程创建的 RefundAttendee
任务类,它会做两件事情 —— 退款和发送邮件:
如果这个队列任务执行失败,由于配置了 tries
值为 3,所以会重试,这里就存在一个隐患:如果退款成功,但邮件发送异常导致任务失败重试,就存在重复退款的问题。
我们在设计队列任务的执行时,由于存在重试机制,所以要考虑多次执行的幂等性,对于当前这个退款场景而言,就是多次执行 RefundAttendee
,也不会出现重复退款。要实现这个幂等性,可以在 handle
方法中先判断该用户是否已经退款,只有未退款的用户才会发起退款操作:
双重检查
需要注意的是,调用第三方支付服务 API 进行退款会发起网络请求,如果退款成功,但是由于网络问题导致返回响应失败,那么永远也不会将订单标记为已退款。同样的问题也肯能会出现在退款后更新订单退款状态时。