飙血推荐
  • HTML教程
  • MySQL教程
  • JavaScript基础教程
  • JavaScript正则表达式运用
  • php入门教程
  • Excel函数教程
  • AngularJS教程
  • ThinkPHP5.0教程
  • UEditor使用文档

【Java面试】什么是幂等?如何解决幂等性问题?-

时间:2022-05-28  作者:mic112  

一个在传统行业工作了7年的粉丝私信我。

他最近去很多互联网公司面试,遇到的很多技术和概念都没听过。

其中就有一道题是:”什么是幂等、如何解决幂等性问题“?

他说,这个概念听都没听过,怎么可能回答出来。

好的,对于这个问题,看看普通人和高手的回答。

普通人:

嗯。。。。。。。。。。。。。。

高手:

好的。

所谓幂等,其实它是一个数学上的概念,在计算机编程领域中,幂等是指一个方法被多次重复执行的时候产生的影响和第一次执行的影响相同。

之所以要考虑到幂等性问题,是因为在网络通信中,存在两种行为可能会导致接口被重复执行。

  1. 用户的重复提交或者用户的恶意攻击,导致这个请求会被多次重复执行。
  2. 在分布式架构中,为了避免网络通信导致的数据丢失,在服务之间进行通信的时候都会设计超时重试的机制,而这种机制有可能导致服务端接口被重复调用。

所以在程序设计中,对于数据变更类操作的接口,需要保证接口的幂等性。

而幂等性的核心思想,其实就是保证这个接口的执行结果只影响一次,后续即便再次调用,也不能对数据产生影响,所以基于这样一个诉求,常见的解决方法有很多。

  1. 使用数据库的唯一约束实现幂等,比如对于数据插入类的场景,比如创建订单,因为订单号肯定是唯一的,所以如果是多次调用就会触发数据库的唯一约束异常,从而避免一个请求创建多个订单的问题。
  2. 使用redis里面提供的setNX指令,比如对于MQ消费的场景,为了避免MQ重复消费导致数据多次被修改的问题,可以在接受到MQ的消息时,把这个消息通过setNx写入到redis里面,一旦这个消息被消费过,就不会再次消费。
  3. 使用状态机来实现幂等,所谓的状态机是指一条数据的完整运行状态的转换流程,比如订单状态,因为它的状态只会向前变更,所以多次修改同一条数据的时候,一旦状态发生变更,那么对这条数据修改造成的影响只会发生一次。

当然,除了这些方法以外,还可以基于token机制、去重表等方法来实现,但是不管是什么方法,无非就是两种,

  • 要么就是接口只允许调用一次,比如唯一约束、基于redis的锁机制。
  • 要么就是对数据的影响只会触发一次,比如幂等性、乐观锁

以上就是我对这个问题的理解。

总结

技术这个行业的发展是很快的,如果自己的技术能力和认知跟不上变化。

那基本上可以说是被时代淘汰了,所以保持持续学习是非常重要的。

喜欢我的作品的小伙伴记得点赞和收藏。

如果你在面试的时候遇到一些不懂的问题,可以随时来私信我

file

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mic带你学架构
如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注「跟着Mic学架构」公众号公众号获取更多技术干货!

标签:编程
湘ICP备14001474号-3  投诉建议:234161800@qq.com   部分内容来源于网络,如有侵权,请联系删除。