什么是幂等

什么是幂等?

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

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

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

为什么需要幂等?

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

如何解决幂等问题?

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

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. 系统根据提交的内容更新数据,保证重复提交不会改变最终结果。

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

相关推荐
郝学胜-神的一滴8 分钟前
深入理解QFlags:Qt中的位标志管理工具
开发语言·c++·qt·程序人生
郝学胜-神的一滴1 天前
基于C++的词法分析器:使用正则表达式的实现
开发语言·c++·程序人生·正则表达式·stl
程序员曦曦1 天前
10:00开始面试,10:06就出来了,问的问题有点变态。。。
自动化测试·软件测试·功能测试·程序人生·面试·职场和发展
郝学胜-神的一滴4 天前
C++中的`auto`与`std::any`:功能、区别与选择建议
开发语言·c++·程序人生·算法
草莓熊Lotso4 天前
《吃透 C++ 类和对象(中):构造函数与析构函数的核心逻辑》
c++·经验分享·笔记·程序人生·其他
碎像5 天前
uni-app实战教程 从0到1开发 画图软件 (学会画图)
前端·javascript·css·程序人生·uni-app
懂得节能嘛.6 天前
【GitHub小娱乐】GitHub个人主页ProFile美化
程序人生·github·娱乐
郝学胜-神的一滴6 天前
游戏引擎(Unreal Engine、Unity、Godot等)大对比:选择最适合你的工具
程序人生·unity·游戏引擎·godot·虚幻·unreal engine
爱转角码农7 天前
平时测试开发中积累并应用的提示词分享
功能测试·测试工具·程序人生·自动化
是乐谷8 天前
饿了么招java开发咯
java·开发语言·人工智能·程序人生·面试·职场和发展