当前位置: 首页 > 后端技术 > Java

【Java访谈】什么是幂等?如何解决幂等性问题?

时间:2023-04-02 00:34:33 Java

一位在传统行业工作了7年的粉丝私信我。他最近去了多家互联网公司面试,遇到的很多技术和概念他都没听说过。其中一个问题是:“什么是幂等性以及如何解决幂等性问题”?他说他从来没有听说过这个概念,怎么回答呢。好吧,对于这个问题,看看普通人和专家的回答。普通人:嗯。.............师父:好的。所谓幂等性其实是一个数学概念。在计算机编程领域,幂等性是指当一个方法被重复执行时,其影响与第一次执行时相同。之所以考虑幂等性,是因为在网络通信中,有两种行为可能会导致接口被重复执行。用户重复提交或用户恶意攻击导致该请求被多次执行。在分布式架构中,为了避免网络通信造成数据丢失,在服务间通信时设计了超时重试机制,这种机制可能会导致服务端接口被重复调用。因此,在编程中,对于数据变化操作的接口,需要保证接口的幂等性。幂等性的核心思想是保证这个接口的执行结果只影响一次,即使后面再调用也不会影响数据。因此,基于这样的需求,有很多通用的解决方案。利用数据库的唯一性约束来实现幂等性。比如数据插入的场景,比如创建一个订单,因为订单号必须是唯一的,如果多次调用,会触发数据库的唯一性约束异常,从而避免一个请求创建多个请求。订单有问题。使用redis中提供的setNX命令。比如在MQ消费的场景下,为了避免MQ重复消费导致数据被多次修改的问题,可以在收到MQ的消息时通过setNx将这条消息写入redis。一旦这条消息被消费过,就不会再消费了。使用状态机实现幂等性。所谓状态机是指一条数据的一个完整运行状态的转换过程,比如订单状态,因为它的状态只会向前变化,所以当同一条数据被多次修改时,一旦state如果有变化,对本次数据修改的影响只会发生一次。当然除了这些方法之外,还可以基于token机制,去重表等方法来实现,但是不管是什么方法,都只有两种,或者接口只允许调用一种,比如unique基于约束和redis的锁机制。要么对数据的影响只会触发一次,比如幂等,乐观锁,以上是我对这个问题的理解。综上所述,科技行业的发展是非常快的,如果自己的技术能力和认知跟不上变化的话。那基本上可以说是被时代淘汰了,所以保持不断的学习是很重要的。喜欢我作品的朋友记得点赞收藏哦。如果在面试中遇到一些不懂的问题,可以随时私信我。版权声明:除特别声明外,本博客所有文章均采用CCBY-NC-SA4.0许可协议。转载请注明来自Mic带你学建筑!如果本文对您有帮助,请给个关注和点赞。您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!