您的位置:首页 > 游戏 > 游戏 > 什么是幂等

什么是幂等

2024/11/17 21:35:30 来源:https://blog.csdn.net/pumpkin84514/article/details/142267443  浏览:    关键词:什么是幂等

什么是幂等?

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

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

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

为什么需要幂等?

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

如何解决幂等问题?

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

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

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com