什么是幂等

什么是幂等?

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

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

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

为什么需要幂等?

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

如何解决幂等问题?

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

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

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

相关推荐
AI_小站3 小时前
RAG 示例:使用 langchain、Redis、llama.cpp 构建一个 kubernetes 知识库问答
人工智能·程序人生·langchain·kubernetes·llama·知识库·rag
MapleLea1f5 小时前
26届JAVA 学习日记——Day14
java·开发语言·学习·tcp/ip·程序人生·学习方法
我爱学Python!8 小时前
解决复杂查询难题:如何通过 Self-querying Prompting 提高 RAG 系统效率?
人工智能·程序人生·自然语言处理·大模型·llm·大语言模型·rag
糊涂君-Q1 天前
Python小白学习教程从入门到入坑------习题课3(基础巩固)
python·学习·程序人生·职场和发展·学习方法·程序员创富·改行学it
吾店云建站1 天前
9个最佳WordPress PDF插件(查看器、嵌入和下载)
程序人生·pdf·创业创新·流量运营·程序员创富·教育电商
诸葛悠闲1 天前
《操作系统 - 清华大学》4 -3:非连续内存分配:页表——概述、TLB
linux·程序人生
行則独善其身2 天前
计算机网络-MSTP工作原理
程序人生