什么是幂等

什么是幂等?

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

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

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

为什么需要幂等?

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

如何解决幂等问题?

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/53943.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

KTM580030bit 绝对角度细分器支持最多 4096 对极与一键非线性自校准集成双 16bit 2M SAR ADC

KTM5800 是一款 30bit 绝对角度细分 4096 对极编码细分器,可以与磁电阻传感器( AM R/TMR )搭配,构成一个高速高精度的非接触磁性编码器模块。它具有以非常高的采样速率 读取传感器上的差分模拟正弦和余弦信号的能力&#xf…

pytest 生成allure测试报告

allure的安装 github地址 allure资产列表 windows下载.zip,解压并配置环境变量PATH;linux下载安装allure,可以使用windows下解压的.zip文件(通用),或者下载.rpm/.deb 文件进行安装并配置PATH;…

通信工程学习:什么是MRF多媒体资源功能、MRFC多媒体资源功能控制、MRFP多媒体资源功能处理

一、MRF多媒体资源功能 MRF(Multimedia Resource Function,多媒体资源功能)是3G/IMS网络中定义的提供多媒体资源功能的网络实体,它为3G/IMS网络的业务和承载提供媒体能力支持。MRF通过提供丰富的媒体处理功能,如播放声…

分块总结:时髦之裤

说白了就是南外分块题做的差不多了,来写一篇总结。 简要题意: 给一序列 a,初始时 a i i a_ii ai​i,有如下两个操作: 1.将[l,r]每个数改为x,该点增加贡献 ∣ a i − x ∣ |a_i-x| ∣ai​−x∣. 2.询问[l…

SQLite的入门级项目学习记录(二)

再补充一些基础知识: 并行操作的问题 1、可以多游标同时运行 SQLite,对于同一个连接sqlite3.connect(db_file),可以同时创建多个游标,每个游标都是独立的,可以执行各自的SQL命令序列。 import sqlite3# 创建数据库连…

FAT32文件系统详细分析 (格式化SD nandSD卡)

FAT32 文件系统详细分析 (格式化 SD nand/SD 卡) 目录 FAT32 文件系统详细分析 (格式化 SD nand/SD 卡)1. 前言2.格式化 SD nand/SD 卡3.FAT32 文件系统分析3.1 保留区分析3.1.1 BPB(BIOS Parameter Block) 及 BS 区分析3.1.2 FSInfo 结构扇区分析3.1.3 引导扇区剩余扇区3.1.4 …

vue在一个组件引用其他组件

在vue一个组件中引用另一个组件的步骤 必须在script中导入要引用的组件需要在export default的components引用导入的组件(这一步经常忘记)在template使用导入的组件<script><!-- 第一步,导入--> import Vue01 from "@/components/Vue01.vue";

828华为云征文 | Flexus X 实例服务器网络性能深度评测

引言 随着互联网应用的快速发展&#xff0c;网络带宽和性能对云服务器的表现至关重要。在不同的云服务平台上&#xff0c;即便配置相同的带宽&#xff0c;实际的网络表现也可能有所差异。因此&#xff0c;了解并测试服务器的网络性能变得尤为重要。本文将以华为云X实例服务器为…

【vue-media-upload】一个好用的上传图片的组件,注意事项

一、问题 media 的saved 数组中的图片使用的是location 相对路径&#xff0c;但是我的业务需要直接根据图片链接展示图片&#xff0c;而且用的也不是location 相关源代码 <div v-for"(image, index) in savedMedia" :key"index" class"mu-image-…

Hadoop林子雨安装

文章目录 hadoop安装教程注意事项&#xff1a; hadoop安装教程 链接: 安装教程 注意事项&#xff1a; 可以先安装ububtu增强功能&#xff0c;完成共享粘贴板和共享文件夹 ubuntu增强功能 2.这里就可以使用共享文件夹 或者在虚拟机浏览器&#xff0c;用 微信文件传输助手 传文…

uniapp vite3 require导入commonJS 的js文件方法

vite3 导入commonJS 方式导出 在Vite 3中&#xff0c;你可以通过配置vite.config.js来实现导入CommonJS&#xff08;CJS&#xff09;风格的模块。Vite 默认支持ES模块导入&#xff0c;但如果你需要导入CJS模块&#xff0c;可以使用特定的插件&#xff0c;比如originjs/vite-pl…

[网络]TCP/IP五层协议之应用层,传输层(1)

文章目录 一. 应用层二. 传输层端口号传输层的协议UDPTCPTCP报头TCP协议的核心机制 一. 应用层 应用层是和应用程序直接相关, 和程序猿打交道最多的一层 应用层协议, 里面描述的内容, 就是你写的程序, 通过网络具体按照啥样的形式来传输数据 不同的应用程序, 就可以用不同的应…

心觉:以终为始,帮你精准实现目标

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作169/1000天 假设你的目标是 一年内赚到150万。我们可以通过“以终为始”和“以始为终”的结合来帮助你实现这个目标 以下是完整的…

Java使用Apache POI向Word文档中填充数据

Java使用Apache POI向Word文档中填充数据 向一个包含占位符的Word文档中填充数据&#xff0c;并保存为新的文档。 准备工作 环境搭建 在项目中添加Apache POI依赖。在pom.xml中添加如下依赖&#xff1a; <dependencies><dependency><groupId>org.apache.po…

C++:模板——详解函数模板与类模板

1. 模板的概念 C的模板&#xff08;Templates&#xff09;是泛型编程的基础&#xff0c;它允许编写与类型无关的代码&#xff0c;从而提高代码的复用性和灵活性。通过模板&#xff0c;你可以编写一种通用的函数或类&#xff0c;而不需要为每种特定的数据类型单独定义多个函数或…

写论文还在卡壳?教你用ChatGPT轻松搞定过渡段落!

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 在写论文的路上&#xff0c;最让人头疼的除了查重率飙升&#xff0c;估计就是文献综述了吧&#xff01; 想想看&#xff0c;文献一篇接着一篇&#xff0c;脑子都快炸了&#xff0c;还得想办法把它们连接得…

【测试开岗面试】知识点总结

1.知识点总结 Q:请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试 单元测试 (Unit Testing) 单元测试是对软件中最小可测试单元&#xff08;通常是函数或方法&#xff09;进行验证的过程。它的目的是确保每个单元在设计时的功能能够正常运行。单元测试通常由…

在C++中,如何避免出现Bug?

C中的主要问题之一是存在大量行为未定义或对程序员来说意外的构造。我们在使用静态分析器检查各种项目时经常会遇到这些问题。但正如我们所知&#xff0c;最佳做法是在编译阶段尽早检测错误。让我们来看看现代C中的一些技术&#xff0c;这些技术不仅帮助编写简单明了的代码&…

实际测试工作中成功应用风险评估和应对措施的案例

以下是一些在实际测试工作中成功应用风险评估和应对措施的案例&#xff1a; 案例一&#xff1a;金融软件项目 项目背景&#xff1a; 某金融机构开发一款新的网上银行系统&#xff0c;涉及大量的资金交易和用户敏感信息。项目时间紧、任务重&#xff0c;且对安全性和稳定性要求极…

vue2实践:el-table实现由用户自己添加删除行数的动态表格

需求 项目中需要提供一个动态表单&#xff0c;如图&#xff1a; 当我点击添加时&#xff0c;便添加一行&#xff1b;点击右边的删除时&#xff0c;便删除这一行。 至少要有一行数据&#xff0c;但是没有上限。 思路 这种每一行的数据固定&#xff0c;但是不定行数的&#x…