一位在传统行业工作7年的粉丝私信我。说他最近去了很多互联网公司面试,遇到的很多技术和概念他都没听说过。其中一个问题是:“什么是幂等性以及如何解决幂等性问题”?他说他从来没有听说过这个概念,怎么回答呢。下面我就根据这位同学的提问,和大家分享一下我对这道题的理解。1、什么是幂等?事实上,幂等性是一个数学概念。在计算机编程领域,幂等性是指当一个方法被重复执行时,其预期结果必须与第一次执行的预期结果一致。简单理解就是一个逻辑即使重复执行,也不会影响最终结果的一致性。这称为幂等性。之所以要考虑幂等性的问题,是因为在网络通信中,这两种行为都可能导致接口被重复执行。第一是用户重复提交或用户恶意攻击;二是分布式系统采用的超时重试机制,避免数据丢失。这两种情况都可能导致服务接口被重复调用。因此,在编程中,对于数据变化操作的接口,需要保证接口的幂等性。幂等性的核心思想是保证这个接口的执行结果只影响一次,即使后面再调用也不会影响数据。那么,基于这样的需求,我们如何解决幂等性问题呢?2.如何解决?有很多方法可以解决幂等性问题。分享一些常用的解决方案。第一种解决方案是利用数据库的唯一性约束来实现幂等性。比如数据插入场景,比如创建订单,因为订单号必须是唯一的,如果多次调用,会触发数据库的唯一约束异常,从而避免一个请求创建多个订单的问题。方案二是使用Redis提供的setNX命令,例如MQ消费场景,避免MQ重载。解决多次消费导致数据多次修改的问题,可以在接收MQ消息时通过setNX将消息写入Redis。消息一旦被消费,就不会再被消费。第三种解决方案是使用状态机来实现幂等性。所谓状态机,是指一段数据完整运行状态的转换过程。比如,因为它的状态只会向前变化,当同一条数据被多次修改时,一旦状态发生变化,对这次数据修改的影响只会发生一次。当然除了上面三种常用的意外,也可以基于Token机制或者加去重表来实现,但是不管是什么方法,无非就是两种思路,或者说接口而已允许调用一次,比如唯一约束,基于Redis的锁机制。或者对数据的影响只会触发一次,比如乐观锁。以上是我对这个问题的理解。科技行业的发展是很快的,如果自己的技术能力和认知跟不上变化。那基本上可以说是被时代淘汰了,所以保持不断的学习是很重要的。
