在程序开发中,幂等性是指同一个业务,执行一次或多次对业务状态的影响是一致的。例如:
- 根据id删除数据
- 查询数据
- 新增数据
但数据的更新往往不是幂等的,如果重复执行可能造成不一样的后果。
- 取消订单,恢复库存的业务。如果多次恢复就会出现库存重复增加的情况
- 退款业务。重复退款对商家而言会有经济损失。
为了保证消息处理的幂等性。这里给出两种方案:
- 唯一消息ID
- 业务状态判断
### 唯一消息ID
1. 每一条消息都生成一个唯一的id,与消息一起投递给消费者。
2. 消费者接收到消息后处理自己的业务,业务处理成功后将消息ID保存到数据库
3. 如果下次又收到相同消息,去数据库查询判断是否存在,存在则为重复消息放弃处理。
###业务判断就是
基于业务本身的逻辑或状态来判断是否是重复的请求或消息,不同的业务场景判断的思路也不一样。
项目中,处理消息的业务逻辑是把订单状态从未支付修改为已支付。因此我们就可以在执行业务时判断订单状态是否是未支付,如果不是则证明订单已经被处理过,无需重复处理。