现象:一次活动,每个用户只能领一次红包,但是有个用户领了两次
原因:一次活动 ,业务方调用支付方发放红包接口
1、业务方调用支付方,调用超时,回填调用状态 1(0是调用成功),并且返回界面提示“服务异常,请稍后再试” 这步没问题
但是支付方已经接受到了请求,是根据业务方的订单id 去给用户发钱 虽然前面的一步业务方调用失败,但是,支付方还是根据订单id支付了一次
2、用户看到提示,又操作了一次领取 ,业务方新产生一个订单,支付方 重新支付了一次
解决方案:
1基于支付方根据一个订单id支付一次的方式 业务方第二次在调用的时候 订单id跟第一次一样 因为活动一人只能领取一次 判断account_id如果是一样的话(根据account_id幂等) 产生同一个订单id
2数据库层面,要判断是否是同一个account_id ,需要全表扫描一次,消耗性能 —解决方法,对account_id加索引
思考:1如何有效制造服务调用超时 2开发如何根据业务的特点,加上幂等判断