《专业小词开课啦》——幂等

在系统对接过程中,当出现接口调用异常的情况时,程序员可能会用一些专业术语来答疑......对于0基础同学,自然是需要自行百度一番,学习一下! 

接下来,先学习【幂等】

PS: 小白参考1.1~1.4内容即可,达到基本理解。

1.1 幂等是什么

简单讲,就是同一个操作,不管执行多少次(1次或者N次),最终产生的效果都和只执行1次的效果一样。

即 “做一次”和“做N次”的效果是等价的。

1.2 幂等的重要性

在网络世界,特别涉及到订单、支付、重要状态变更时,因为未知因素“不小心重复执行”是非常非常常见的事情。如:

  • 做了触发按钮,不小心点击了多次;
  • 网络信号不好,请求发送了2次
  • 系统在处理时 卡顿崩溃了,恢复后重新处理了一次等等

如果没有幂等处理,那这些重复操作会导致各种后果:重复扣钱;重复创建订单(只要1个,但是生成了多个);状态错乱(已发货变成待发货)等

1.3 如何实现幂等 

通过具体的场景示例

1.扣款接口(需要幂等性)——钱不能多扣!

  • 操作: 你用手机支付买一杯奶茶,点击“确认支付”按钮。

  • 幂等要求: 无论这个“确认支付”的指令因为网络卡顿、手抖等原因被系统收到了1次还是100次,你的账户应该只被扣一次奶茶的钱(比如20元),奶茶店也只收到一次20元。

  • 非幂等的可怕后果: 如果接口不幂等,系统收到两次“确认支付”指令,就可能扣你40元!奶茶店也可能收到40元或者系统混乱。这绝对不行!

如何实现?

系统设计扣款接口时,需要有个机制 可识别到 “这是同一个订单/交易”

  • 给每个支付请求一个唯一“订单号” (ID):就像快递单号。

  • 系统记录处理过的订单号:系统收到支付请求,先查这个订单号是否处理过。

    • 如果没处理过:执行扣款、记录状态(已支付)、记下这个订单号。

    • 如果已经处理过:直接返回上次支付成功的结果(比如“支付成功,已扣款20元”),不再执行实际扣款操作!

  • 结果: 用户点了N次,只要订单号一样,系统只扣一次钱,每次都告诉你支付成功(效果等同于只执行一次)。

场景二:查询余额接口 (天生幂等) - 查多少次都行!
    • 操作: 你打开手机银行APP,点击“查询余额”。

    • 幂等体现: 你点1次,显示余额是1000元。你手快点错了,连续狂点10次“查询余额”,每次返回的结果都还是显示1000元(假设期间没有其他交易)。查询这个操作本身不会改变你的余额。做一次和做十次,结果都一样(余额显示1000元),没有额外副作用。

    • 为什么天生幂等? 因为这个操作只是“读”数据,不“写”(修改)数据。读操作通常不会改变系统状态。

1.4 幂等性的关键点

  1. 核心目标:防止重复操作带来坏影响,尤其是在会修改数据的操作上。(扣钱、下单、改状态)
  2. 核心表现:同一个请求(通常有唯一标识/主键 来识别,eg:订单号、流水号等),执行多次==执行1次的效果。
  3. 允许重复调用:但重复调用时,系统能识别出来并确保最终结果正确(要么和第一次结果一致要么不作任何修改)
  4. 重要性:这个是系统稳定的基准之一。不然系统数据会一团糟。
  5. 常见需要幂等的操作: 支付、创建订单、更新状态(如确认收货)、退款等
  6. 常见天生幂等的操作:查询、获取信息

1.5 术语版解答

接口幂等性 (Idempotency) 是指:

一个操作(通常由 HTTP 方法表示)被设计成:当客户端向服务器发送一次或多次具有相同参数的相同请求时,服务器端的最终状态改变(或产生的副作用)是相同的,并且通常返回相同的响应结果。

关键点解析:

  1. 操作 (Operation): 指通过 API 接口执行的特定动作,如创建资源、更新资源、删除资源、支付等。

  2. 多次相同请求 (Identical Requests): 请求的语义(意图)和关键参数(通常包括一个唯一的幂等键 Idempotency-Key)必须完全相同。这些请求可能因网络问题、客户端重试、超时重发等原因而产生。

  3. 最终状态/副作用 (State/Side Effects): 指操作在服务器端数据库、文件系统或其他持久化存储中引起的实际变化,以及可能触发的后续流程(如发送通知、扣款等)。

  4. 效果相同 (Same Effect):

    • 对于修改状态的操作(PUTDELETE, 特定 POST):执行一次和多次,服务器资源最终达到的状态是完全一致的。

    • 对于不修改状态的操作(GETHEAD):多次执行总是返回相同的结果(假设资源在此期间未被其他操作修改)。

  5. 响应结果 (Response): 在多次执行中,服务器通常应返回相同的 HTTP 状态码和响应体(尤其是成功响应)。第一次执行成功后,后续重复请求应返回成功(如 200 OK 或 201 Created)并可能包含首次执行的结果,而不是报错(除非请求本身无效)。

实现幂等性的典型技术方案:

  1. 幂等键 (Idempotency Key):

    • 客户端在发送非幂等操作(如创建订单的 POST)时,在请求头(如 Idempotency-Key: <unique_value>)或请求体中提供一个全局唯一的标识符(UUID 是最佳选择)。

    • 服务端存储该 Key 与首次请求的响应结果

    • 当收到相同 Key 的请求时:

      • 若 Key 存在且对应请求已完成:直接返回存储的响应结果,不执行实际操作

      • 若 Key 存在但对应请求仍在处理中:返回 409 Conflict 或 425 Too Early,提示客户端稍后重试。

      • 若 Key 不存在:正常处理请求,处理完成后存储 Key 和响应结果。

  2. 唯一业务标识 (Unique Business Identifier):

    • 利用业务本身的唯一标识(如订单号、交易流水号、用户名)作为幂等键。

    • 服务端在处理请求前,检查该唯一标识对应的资源是否已存在或操作是否已执行。

    • 若已存在/已执行:返回已有资源或成功响应(实现幂等)。

    • 若不存在/未执行:执行操作并创建资源/记录状态。

  3. 状态机与乐观锁 (State Machine & Optimistic Locking):

    • 定义资源明确的状态(如 待支付 -> 已支付 -> 已完成)。

    • 更新操作(如 支付)需要指定期望的当前状态(如 待支付)。

    • 服务端检查资源当前状态是否与期望状态一致:

      • 一致:执行状态转换(如 待支付 -> 已支付),操作成功。

      • 不一致(如状态已是 已支付):说明操作已执行过,返回当前状态(实现幂等)。常配合版本号(ETag)或更新时间戳实现乐观锁。

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

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

相关文章

渗透实战PortSwigger Labs指南:自定义标签XSS和SVG XSS利用

阻止除自定义标签之外的所有标签 先输入一些标签测试&#xff0c;说是全部标签都被禁了 除了自定义的 自定义<my-tag onmouseoveralert(xss)> <my-tag idx onfocusalert(document.cookie) tabindex1> onfocus 当元素获得焦点时&#xff08;如通过点击或键盘导航&…

利用pycharm搭建模型步骤

1 如何将别人论文的代码跑起来&#xff0c;以Pycharm为例&#xff0c;在下载代码的时候&#xff0c;要注意使用的python版本是多少&#xff0c;并且要注意使用的keras和tensorflow等文件夹的版本&#xff0c;我们可以直接使用pycharm中file文件中的settings&#xff0c;来添加相…

Qt 中directoryChanged监听某个目录的内容是否发生变化

Qt 中&#xff0c;directoryChanged 是 QFileSystemWatcher 类的一个信号&#xff0c;用于监听某个目录的内容是否发生变化&#xff08;如添加、删除文件或子目录&#xff09; ✅ 一、功能说明 QFileSystemWatcher::directoryChanged(const QString &path) 信号的作用是&…

JavaWeb(Servlet预习)

案例1&#xff1a;基于jspServlet实现用户登录验证 1.input.jsp <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset"UTF-8&q…

Docker Compose 部署 Prometheus + Grafana

安装 docker-compose.yml version: 3.8services:# Prometheus 监控服务prometheus:image: prom/prometheus:latestcontainer_name: prometheusrestart: unless-stoppedvolumes:- ./conf/prometheus.yml:/etc/prometheus/prometheus.yml- ./prometheus_data:/prometheuscomman…

准确--使用 ThinBackup 插件执行备份和恢复

使用 ThinBackup 插件执行备份和恢复 导出&#xff08;备份&#xff09;步骤&#xff1a; 进入 Manage Jenkins > ThinBackup。设置 Backup schedule for full backups&#xff08;可选&#xff09;&#xff0c;并配置 Files to exclude&#xff08;可选&#xff09;。点击…

Qt Creator 从入门到项目实战

Qt Creator 简介 Qt Creator 是一个跨平台的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于开发 Qt 应用程序。它为开发者提供了一个强大的工具集&#xff0c;包括代码编辑器、调试器、UI 设计器以及性能分析工具等。 1.1 Qt Creator 的安装 Qt Creator 支持…

公司内网远程访问配置教程:本地服务器(和指定端口应用)实现外网连接使用

在数字化时代&#xff0c;企业的办公模式日益多元化&#xff0c;远程办公、跨地区协作等需求不断增加。这使得在公司内网中配置远程访问变得至关重要&#xff0c;它能让员工无论身处何地&#xff0c;只要有网络连接&#xff0c;就能便捷地访问公司内部的各类资源&#xff0c;如…

边缘计算如何重塑能源管理?从技术原理到应用场景全解析

在全球能源数字化转型的浪潮中&#xff0c;一个看似不起眼的设备正在悄悄改变工业能效管理的模式 —— 这就是边缘计算网关。以能源领域为例&#xff0c;传统的 "设备 - 云端" 二层架构正面临数据传输延迟、网络带宽压力大、断网失效等挑战&#xff0c;而边缘计算技术…

自主导航巡检机器人系统解决方案

自主导航巡检机器人系统解决方案 运动性能强大的通用型履带式机器人底盘&#xff0c;整车采用克里斯蒂全独立悬挂设计&#xff0c;内部搭载高扭矩无刷电机&#xff0c;通过精心匹配的底盘高度和功率配置&#xff0c;底盘表现出卓越的通过性能、低重心、平稳运行以及高效的传动效…

Vim 撤销 / 重做 / 操作历史命令汇总

Vim 撤销 / 重做 / 操作历史命令汇总 Vim 提供了丰富的撤销&#xff08;undo&#xff09;、重做&#xff08;redo&#xff09;及查看操作历史的命令&#xff0c;帮助你在编辑过程中灵活地回退或前进到任意修改点。下面按功能分类整理常用命令&#xff0c;便于快速查阅和记忆。…

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…

项目四.高可用集群_ansible

设备准备 安装wordpress [rootlocalhost ~]# nmcli c del "Wired connection 1" [rootlocalhost ~]# nmcli c add type ethernet ifname ens224 con-name ens224 ipv4.method manual ipv4.addr 192.168.88.40/24 gw4 192.168.88.1 autoconnect true [rootlocalhos…

TensorFlow深度学习实战(21)——Transformer架构详解与实现

TensorFlow深度学习实战&#xff08;21&#xff09;——Transformer架构详解与实现 0. 前言1. Transformer 架构1.1 关键思想1.2 计算注意力1.3 编码器-解码器架构1.4 Transformer 架构1.5 模型训练 2. Transformer 类别2.1 解码器(自回归)模型2.2 编码器(自编码)模型2.3 Seq2s…

20250608-在 Windows 上使用 PyCharm 通过 SSH 连接到远程 Ubuntu 机器的 Anaconda 环境

在 Windows 上使用 PyCharm 通过 SSH 连接到远程 Ubuntu 机器的 Anaconda 环境 1. 确保远程机器上的 SSH 服务已启动 在远程 Ubuntu 机器上&#xff0c;确保 SSH 服务已安装并启动&#xff1a; sudo apt-get install openssh-server sudo systemctl start ssh sudo systemct…

Oracle 条件索引 case when 报错解决方案(APP)

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5 文档用途 本内容介绍 Oracle条件索引 case when 如何在HGDB中转换使用。 详细信息 1、oracle 索引 create unique index I_GL_VOUCHER_7 on gl_vo…

鸿蒙期末总结

一、概念 HarmonyOS应用关键概念&#xff1a;元服务和App的关系 App具有手动下载安装、包大小无限制、应用内或应用市场更新、全量功能等特征&#xff0c;可使用全量API 元服务具有免安装、包大小有限制、即用即走、轻量化等特征&#xff0c;只能使用“元服务API集” 鸿蒙的…

Vue3 + TypeScript + Element Plus 表格行按钮不触发 row-click 事件、不触发勾选行,只执行按钮的 click 事件

点击表格行按钮不触发 row-click 事件、不触发勾选行&#xff0c;只执行按钮的 click 事件 点击第一行的【编辑】&#xff0c;第一行为当前选择行&#xff0c; 同时也勾选了复选框&#xff0c;也会执行 row-click 事件 原来的代码&#xff1a; <el-table-column label"…

SiteAzure4.x 版本 访问html静态页文件出现404错误

问题描述&#xff1a; SiteAzure4.*版本&#xff0c;在upload文件夹中放置了html静态页文件&#xff0c;访问出现404错误 问题分析&#xff1a; 1、确认访问路径是否正确以及文件是否存在 2、确认相应文件夹权限是否正确 3、确认IIS默认文档是否允许静态页&#xff0c;MIM…

[免费]微信小程序音乐播放器(爬取网易云音乐数据)(node.js后端)【论文+源码】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序音乐播放器(爬取网易云音乐数据)(node.js后端)&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序音乐播放器(爬取网易云音乐数据)(node.js后端) 微信小程序毕业设计_哔哩哔哩_bilibili …