什么是幂等

什么是幂等?

幂等简单来说就是"重复做同一件事,结果还是一样的"。比如,你按电视遥控器的开关按钮,按一次电视开了,再按一次电视关了。这个操作不是幂等的,因为你每按一次,结果都不一样。

再比如,你给手机充电,插上电源后手机开始充电。如果你再插一次电源,手机不会"充两次电",它还是在充电。这个操作是幂等的,因为无论你插多少次电,结果都是一样的:手机在充电。

在软件系统中,幂等指的是你多次执行一个操作,系统的结果不会发生变化。例如你下单买了一件商品,网络不好,你点了好几次下单按钮,但最后你只买了一个商品,系统没重复下单,这就是幂等的例子。

为什么需要幂等?

有时候网络不好或系统出问题,你会重复发送同一个操作请求(比如多次点击"付款"),系统如果不处理好,就会产生重复的操作(比如扣了多次钱)。为了避免这种情况,我们就需要确保这些操作是幂等的,换句话说,操作多次,结果还是一样的。

如何解决幂等问题?

我们来看看几种常见的解决方法,并用简单的例子一步步解释:

1. 唯一标识(Idempotency Key):防止重复付款
示例背景:

你在网上买东西,付款时网络不稳定,你点了两次"确认付款"。

解决思路:

系统给你的每次付款操作生成一个唯一编号(比如"付款ID123")。当你第一次付款时,系统处理了这个ID123的请求,把钱扣掉。第二次系统又收到这个ID123的请求,它一看,"哎,我已经处理过这个付款请求了,不能再扣一次钱。" 所以,第二次操作系统不会再重复扣钱。

步骤:
  1. 每次请求都生成一个唯一编号。
  2. 系统接收请求,先检查这个编号是否处理过。
  3. 如果处理过,直接返回之前的结果;没处理过就执行操作。
2. 乐观锁(Optimistic Locking):防止修改冲突
示例背景:

你和你的朋友同时在编辑一个文档,可能你们两个人都想改同一个地方。如果没有保护机制,系统可能会出现数据冲突,谁的修改生效最后无法控制。

解决思路:

系统给文档加一个版本号,每次修改文档时,系统会检查你操作的是不是最新版本。如果是最新版本,系统允许你修改,并把版本号更新。如果不是最新版本,说明有人已经修改过了,系统就拒绝你的修改请求。

步骤:
  1. 系统记录文档的当前版本号。
  2. 你修改时,系统先检查版本号是否匹配。
  3. 匹配则允许修改并更新版本号;不匹配则拒绝修改。
3. 去重机制:防止日志重复记录
示例背景:

你发送了一条消息,系统由于网络问题记录了两次这个消息,导致在日志里看到了重复的记录。

解决思路:

每次记录消息时,系统检查这条消息是否已经记录过。如果已经记录过,系统就不会再重复记录。

步骤:
  1. 系统为每条消息生成一个唯一的消息ID。
  2. 记录消息前,系统检查这个消息ID是否存在。
  3. 如果存在,说明已经记录过了,不再记录;如果不存在,则正常记录。
4. 事务管理:确保操作全部成功或全部失败
示例背景:

你转账给朋友,系统从你的账户扣钱了,但由于网络问题,钱没成功转到朋友账户。这时,系统要么把钱退还给你,要么继续完成转账,不能让这笔钱"卡"在中间。

解决思路:

系统用一种叫"事务"的机制,确保整个过程要么全部成功,要么全部回滚(像你从来没操作过一样)。如果扣钱成功但转账失败,系统会自动把钱退给你。

步骤:
  1. 执行转账时,系统开始"事务"。
  2. 事务中每个步骤成功,系统才会提交操作;如果有一步失败,系统会回滚之前的步骤。
5. 幂等操作设计:重复操作没有副作用
示例背景:

你更新个人信息(比如修改手机号),如果你多次提交相同的手机号,最终结果还是一样的,系统没有多次修改你的信息。

解决思路:

把操作设计得天然支持幂等。比如你每次提交的都是完整的个人信息,而不是增量修改。无论你提交多少次,最终系统保存的都是最新的手机号。

步骤:
  1. 提交的操作本身是完整的(比如提交的整个手机号)。
  2. 系统根据提交的内容更新数据,保证重复提交不会改变最终结果。

这些方法都可以帮助系统在遇到网络问题、重复操作或并发请求时,避免产生重复的操作结果。

相关推荐
JosieBook16 分钟前
【程序人生】有梦想就能了不起,就怕你没梦想
程序人生·职场和发展
利以檀本人(梦泽不忙)3 天前
#T1359. 围成面积
c++·程序人生·算法
jingling5553 天前
【高级】系统架构师 | 信息系统战略规划、EAI 与新技术
程序人生·职场和发展·系统架构·学习方法·程序员创富
序属秋秋秋3 天前
我的创作纪念日——《惊变365天》
经验分享·学习·程序人生·纪念日·生活·大学生
蓑衣客VS索尼克4 天前
第三章:生活重构:当程序员不再只是“码农“
学习·程序人生·重构·生活
武子康4 天前
66AI-调查研究-68-具身智能 应用全景:家庭、工业、医疗、交通到虚拟交互的未来趋势
人工智能·程序人生·ai·职场和发展·交互·个人开发·具身智能
swanwei4 天前
技术人员突围之路(15年技术管理经验总结)之十
学习·程序人生·生活·求职招聘·交友
武子康5 天前
AI-调查研究-67-具身智能 核心技术构成全解析:感知、决策、学习与交互的闭环系统
人工智能·科技·学习·程序人生·ai·职场和发展·职场发展
郝学胜-神的一滴6 天前
Pomian语言处理器研发笔记(二):使用组合模式定义表示程序结构的语法树
开发语言·c++·笔记·程序人生·决策树·设计模式·组合模式
郝学胜-神的一滴7 天前
策略模式:模拟八路军的抗日策略
开发语言·c++·程序人生·设计模式·策略模式