聊聊“幂等”

幂等的定义

从数学的角度来说,就是无论处理多少次,返回的结果和处理一次是一样的,比如:1的n次方和1。幂等性是系统对外的一种承诺而不是实现,承诺只要接口调用成功,外部系统调用一次和多次的影响是一致的。声明为幂等的接口认为外部系统调用失败是常态,并且失败之后一定会有重试。

操作的幂等说明

  • 对数据的读操作,在数据不变的情况下,无论执行多少次,返回的结果也是一直的,是天然的幂等性;

  • 对数据的删除操作,也是幂等性的,因为不论是删除一次还是删除多次,实现的效果是一致的;

  • 对于数据的新增操作,因为可能向数据库中插入重复的多条记录,因为不是幂等性的;

  • 对于数据的更新操作,也会出现多次重复被更新的情况,一次也不是幂等性的;

幂等的业务场景

  • 账户资金的加减操作;

  • 电商订单的创建;

  • 页面的多次提交问题;

  • 并发下的计数问题;

  • 大型系统中的消息消费问题;

幂等的解决方案

  • 幂等只是一个承诺,一个概念,保证调用多次返回结果的一致性,具体实现需要考虑多种环境下的高并发情况,并根据不同的场景选择合适的方案;

  • 对于新增的幂等性问题,可以配合数据库的唯一索引进行控制;

  • 对于数据的更新幂等性问题,可以通过悲观锁,乐观锁,缓存的分布式锁来控制并发;

  • 对于页面的多次提交,可以通过token机制进行控制;

  • 消息消费的场景,可以通过在消息上设置一个taskid来进行控制;

总结

幂等性是优秀程序员必备的一个基因,在实现业务过程中,是应该被首先考虑的问题,尤其是在银行,金融的系统里,要同时保证数据的高效和准确性。

撰写日期 March 7, 2018