大家好,我是陆砚码,今天我们来聊聊一个在分布式系统中非常重要的概念——幂等性。是不是听起来有点高大上?别担心,我用大白话给你讲,让你秒懂!
一、为什么需要“幂等性”?(痛点引入)
想象一下,你在双11抢购时,网速卡顿,你反复点击“确认支付”,结果呢?如果系统没有处理幂等性,你的钱可能会被多次扣除,这可不是闹着玩的!在分布式系统中,网络延迟、用户操作等原因,都可能导致重复请求,这就是我们需要幂等性的原因。
二、到底什么是“幂等性”?
第一步:锚定已知
其实,幂等性在生活中很常见,比如按电梯按钮。你按一次,电梯就会向下移动,不管你按多少次,结果都是一样的。
第二步:生动类比
再比如,你在微信群里发红包,你发一次,大家抢一次;你发两次,大家就抢两次。这就是非幂等操作。
第三步:提炼骨架
幂等性的本质是:一个操作执行一次和执行一万次,对系统数据产生的影响是一模一样的。用公式表示就是:f(f(x)) = f(x)。
第四步:面试高频附加题 —— HTTP 方法的天然幂等性
面试官可能会问,HTTP 协议里哪些方法是天然幂等的?答案是:GET、PUT 和 DELETE,而 POST 则是非幂等的。
三、怎么实现幂等性?(架构师实战)
了解了概念,接下来就是实战了。以下是一些常用的方法:
- Token 机制:就像去银行办业务,先取个号,只有带着有效号的请求才能成功。
- 数据库唯一索引:给某个字段建唯一索引,重复的请求会直接报错。
- 乐观锁:在数据表里加版本号字段,每次更新数据时,带上当前版本号。
- Redis 分布式锁:在 Redis 里抢一个带有过期时间的锁,只有第一个能成功。
- 状态机控制:在处理业务前,先判断当前订单的状态。
- 消息队列:在后端异步处理时,也要防止重复消费。
💡 核心总结
为什么需要幂等性?防网络重试、防用户手抖、防 MQ 重复投递。是什么?牢记“按电梯原则”,执行1次和执行10000次结果绝对一致!怎么做?Redis 锁挡住并发,Token 发号拦截,状态机/乐观锁控制版本,唯一索引做最终兜底!
好了,今天的分享就到这里,希望对你有所帮助。如果你还有其他问题,欢迎在评论区留言。我是陆砚码,我们下期再见!
—— 来自「思享编程网」(www.sxgpb.com)的陆砚码
