互联网 API 接口幂等性设计

2023-11-19

WEB 资源或 API 方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用。幂等性是系统的接口对外一种承诺(而不是实现), 承诺只要调用接口成功, 外部多次调用对系统的影响是一致的。幂等性是分布式系统设计中的一个重要概念,对超时处理、系统恢复等具有重要意义。声明为幂等的接口会认为外部调用失败是常态, 并且失败之后必然会有重试。例如,在因网络中断等原因导致请求方未能收到请求返回值的情况下,如果该资源具备幂等性,请求方只需要重新请求即可,而无需担心重复调用会产生错误。实际上,我们常用的 HTTP 协议的方法是具有幂等性语义要求的,比如:get 方法用于获取资源,不应有副作用,因此是幂等的;post 方法用于创建资源,每次请求都会产生新的资源,因此不具备幂等性;put 方法用于更新资源,是幂等的;delete 方法用于删除资源,也是幂等的。

常见用来保证幂等的手段:

1.MVCC 方案
  多版本并发控制,该策略主要使用 update with condition(更新带条件来防止)来保证多次外部请求调用对系统的影响是一致的。在系统设计的过程中,合理的使用乐观锁,通过 version 或者 updateTime(timestamp)等其他条件,来做乐观锁的判断条件,这样保证更新操作即使在并发的情况下,也不会有太大的问题。例如

select * from tablename where condition=#condition# // 取出要跟新的对象,带有版本 versoin
update tableName set name=#name#,version=version+1 where version=#version#

  在更新的过程中利用 version 来防止,其他操作对对象的并发更新,导致更新丢失。为了避免失败,通常需要一定的重试机制。

2.去重表
  在插入数据的时候,插入去重表,利用数据库的唯一索引特性,保证唯一的逻辑。

3.悲观锁

select for update,整个执行过程中锁定该订单对应的记录。注意:这种在 DB 读大于写的情况下尽量少用。

4. select + insert
  并发不高的后台系统,或者一些任务 JOB,为了支持幂等,支持重复执行,简单的处理方法是,先查询下一些关键数据,判断是否已经执行过,在进行业务处理,就可以了。注意:核心高并发流程不要用这种方法。

5.状态机幂等
  在设计单据相关的业务,或者是任务相关的业务,肯定会涉及到状态机,就是业务单据上面有个状态,状态在不同的情况下会发生变更,一般情况下存在有限状态机,这时候,如果状态机已经处于下一个状态,这时候来了一个上一个状态的变更,理论上是不能够变更的,这样的话,保证了有限状态机的幂等。

6. token 机制,防止页面重复提交

  业务要求:页面的数据只能被点击提交一次
  发生原因:由于重复点击或者网络重发,或者 nginx 重发等情况会导致数据被重复提交
解决办法:

  • 集群环境:采用 token 加 redis(redis 单线程的,处理需要排队)
  • 单 JVM 环境:采用 token 加 redis 或 token 加 jvm 内存

处理流程:

  • 数据提交前要向服务的申请 token,token 放到 redis 或 jvm 内存,token 有效时间
  • 提交后后台校验 token,同时删除 token,生成新的 token 返回

  token 特点:要申请,一次有效性,可以限流

7. 对外提供接口的 api 如何保证幂等

  如银联提供的付款接口:需要接入商户提交付款请求时附带:source 来源,seq 序列号。source+seq 在数据库里面做唯一索引,防止多次付款,(并发时,只能处理一个请求)

  总结: 幂等性应该是合格程序员的一个基因,在设计系统时,是首要考虑的问题,尤其是在像支付宝,银行,互联网金融公司等涉及的都是钱的系统,既要高效,数据也要准确,所以不能出现多扣款,多打款等问题,这样会很难处理,用户体验也不好 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

互联网 API 接口幂等性设计 的相关文章

  • jsp&servlet&jdbc&mysql实现简单的增删查改(一)

    1 关于JDBC JDBC Java DataBase Connectivity 是一种用于执行SQL语句的Java API 是Java和数据库之间的一个桥梁 它由一组用Java语言编写的类和接口组成 各种不同类型的数据库都有相应的实现类
  • JavaWeb案例:实现注册和登录功能

    业务需求分析 在实际开发中 通常会有专门的人去跟客户进行沟通从而了解客户需要什么样的系统 之后由专业的美工将要做的系统以图片的形式表现出来 客户确认后作出一些静态的html demo页面 然后由软件开发人员创建相关数据库 编写代码将该静态页
  • 知识分享系统

    开发工具 eclipse idea vscode等 数据库 sqlite mysql sqlserver等 功能模块 请用文字描述 至少200字
  • Java Web JSP开发模型

    看之前先点赞 1 JSP开发模型 为了方便使用JSP技术 SUN公司玮JSP技术提供了两种开发模型 JSP Mode1 和 JSP Mode2 JSP Mode1 JSP Mode2 我们将按照Model2思想来完成用户注册功能 1 创建项
  • JavaWeb-13-Tomcat&Servlet学习笔记

    JavaWeb 13 Tomcat Servlet Web核心模块 1 web相关概念回顾 1 1软件架构 1 2资源分类 1 3网络通信三要素 2 web服务器软件 2 1常见的java相关的web服务器软件 2 2Tomcat web服
  • mybatis中关于example类详解mybatis的Example[Criteria]的使用

    一 什么是example类 mybatis generator会为每个字段产生如上的Criterion 如果表的字段比较多 产生的Example类会十分庞大 理论上通过example类可以构造你想到的任何筛选条件 在mybatis gene
  • 【JavaWeb】Thymeleaf的简介与使用

    Thmeleaf MVC 为什么需要MVC 我们之前在书城项目第二阶段做登录的时候 曾经提出过优化登录失败后的处理 虽然说可以实现在登录失败之后跳转回到登录页面 并且展示失败信息 但是代码实在是太恶心了 根本没法维护 所以我们需要将视图展示
  • JavaWeb之HTML和CSS

    标签命令汇总 tr 行 td 单元格 b 加粗 font 字体标签 br 换行 a 超链接标签 ul 无序标签列表 ol 有序标签列表 li list ul 无序标签列表 href 设置链接地址 一 概述 1 B S软件结构 JavaSE中
  • Request 获取请求数据(方法)

    1 Request 继承体系 2 Request 获取请求数据 2 1 请求行 String getMethod 获取请求方式 GET String getContextPath 获取虚拟目录 项目访问路径 request demo Str
  • 设计模式之六大原则

    设计模式之六大原则 转载 关于设计模式的六大设计原则的资料网上很多 但是很多地方解释地都太过于笼统化 我也找了很多资料来看 发现CSDN上有几篇关于设计模式的六大原则讲述的比较通俗易懂 因此转载过来 原作者博客链接 http blog cs
  • 通俗易懂权限管理模块设计-Java

    最近一直在做CMS系统 发现一些内容其实都是重复出现的 例如权限管理模块 权限管理模块就是为了管理用户是否有权利访问某个权限 如果不能则拒绝访问 其实Java中已经有很成熟的权限管理框架 例如 Shiro Spring Security等
  • JavaWeb购物商城

    系统前台 前台用户操作 账号 test密码 test 登录页面 商品浏览 商品详情 购物车 订单页面 系统后台 后台用户操作 账号 admin密码 admin 用户登录页面 后台主页 添加商品 编辑商品 删除商品 数据库 部分代码 logi
  • 互联网 API 接口幂等性设计

    WEB 资源或 API 方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用 幂等性是系统的接口对外一种承诺 而不是实现 承诺只要调用接口成功 外部多次调用对系统的影响是一致的 幂等性是分布式系统设计中的一个重要概念 对超时处理 系
  • javaweb前后台交互传递数据的几种方法

    前端传后台 form表单传递
  • sql的几种约束,非空,不重

    NOT NULL 用于控制字段的内容一定不能为空 NULL UNIQUE 控件字段内容不能重复 一个表允许有多个 Unique 约束 PRIMARY KEY 也是用于控件字段内容不能重复 但它在一个表只允许出现一个 FOREIGN KEY
  • java中如何将Long类型转为Integer类型

    注意不能直接在前面加个 int 而是 将Long型转换为int型 这里的Long型是包装类型 Long a 10 int b a intValue 即long intValue
  • JavaWeb —— AJAX

    目录 AJAX 基本介绍 A synchronous JavaScript And XML 多用在 1浏览器搜索联想 2用户注册中离开光标 校验数据的正确性 同步和异步的区别 AJAX快速入门 AJAX 基本介绍 A synchronous
  • 浏览器发器POST请求

    浏览器按F12或打开开发者工具 在console 控制台 标签页下输入 fetch new Request http localhost 8080 power font getToken method POST headers Conten
  • mysql不是内部或外部命令,也不是可运行的程序 或批处理文件。

    安装Mysql后 当我们在window r中输入cmd中敲入mysql时会出现 Mysql 不是内部或外部命令 也不是可运行的程序或其处理文件 打开我的电脑在我的电脑右键中选择属性 然后单击选择高级系统设置 在系统属性的 高级 中选择环境变
  • 【JavaWeb】网络原理初识

    网络原理初识 计算机网络的历史 局域网和广域网 网络组件中的重要设备 网络通信基础 基本概念 协议分层 OSI七层模型 TCP IP五层 或四层 模型 封装和分用 发送方 接收方 三层转发和二层转发 计算机网络的历史 计算机最初是为了打仗而

随机推荐

  • VsCode远程调试服务器python代码(解决相对路径相关问题)

    1 首先在本地使用VsCode调试python代码 可参考链接 VSCode启动Debug模式调试Python文件 2 vscode远程连接服务器 调试python文件 可参考链接 一文掌握vscode远程调试python代码 3 调试时
  • Google guava之Multiset简介说明

    转自 Google guava之Multiset简介说明 下文笔者讲述guava中Multiset集合的简介说明 如下所示 guava之Multiset集合简介 Multiset集合 可用于存储重复元素 Multiset是ArrayList
  • 一文1000字彻底搞懂Web测试与App测试的区别

    总结分享一些项目需要结合Web测试和App测试的工作经验给大家 从功能测试区分 Web测试与App测试在测试用例设计和测试流程上没什么区别 而两者的主要区别体现在如下几个方面 1 系统结构方面 Web项目 B S架构 基于浏览器的 Web测
  • Unity编辑器界面概述

    了解界面 如果您对编辑器界面没有非常地了解 那么请花一些时间查看并熟悉 Editor 编辑器 界面 Editor 主窗口由选项卡式窗口组成 这些窗口可重新排列 因此 Editor 的外观可能因项目或者开发者而异 具体取决于个人偏好 Wind
  • GitHub博客搭建

    git官网文档 https git scm com book zh v2 E6 9C 8D E5 8A A1 E5 99 A8 E4 B8 8A E7 9A 84 Git E7 94 9F E6 88 90 SSH E5 85 AC E9
  • mmdetection入门介绍-train.py解析

    四 train py解析 同样 上面有单GPU测试和多GPU测试 其实上面的测试是由训练导致的 单GPU训练 python tools train py CONFIG FILE 如果要在命令中指定工作目录 则可以添加参数 work dir
  • Oracle数据泵、exp/imp工具导入导出数据

    一 最常用导出导入方案 exp imp命令工具 1 ssh工具连接服务器主机 exp命令导出 1 1将数据库全部数据导出 exp system password TestDB file bak dmp log exp log full y
  • Vue 弹出层时 禁止页面滑动

    页面中加顶部蒙层 发现滑动时底部页面内容会正常滚动 一 移动端 直接在蒙层所在div上加 touchmove prevent就好了 div class masktop div 二 PC端 显示弹层调用stop 否则调用move stop 滑
  • 华为OD机试真题- 阿里巴巴找黄金宝箱(V)-2023年OD统一考试(B卷)

    题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上 无意中发现了强盗集团的藏宝地 藏宝地有编号从0 N的箱子 每个箱子上面贴有一个数字 阿里巴巴念出一个咒语数字k k
  • leaflet geojson行政区域展示

    目录 获取geoJson数据 下载数据 获取本地json数据 L poylgan绘制图形 效果展示 完整代码 获取geoJson数据 下载数据 阿里云上下载不了的话 我把json数据放在网盘了 链接 百度网盘 请输入提取码 提取码 ifso
  • vue+django项目部署

    vue django项目部署 部署相关概念 项目服务器架构 反向代理 前端部署 docker docker安装 mac 使用常见命令 nginx 下载安装nginx镜像 域名解析 后端部署 MySQL镜像 Redis镜像 部署前处理 从服务
  • C语言:求最小值

    强数据版本 大佬写 include
  • 扁平化数组(多层嵌套)

    方法一 var arr 1 2 3 4 5 function flatten arr var len arr length var temp for var i 0 i
  • Ollydbg之进程线程调试

    目录 预备知识 1 进程 线程 实验目的 实验环境 实验内容和步骤 实验步骤 1 使用OD调试进程 2 使用OD调试线程 预备知识 本实验要求实验者具备如下的相关知识 1 进程 线程 进程 Process 和线程 Thread 是操作系统的
  • 华三交换机查看上层交换机vlan

    您可以使用Huawei三层交换机查看和配置上层交换机的VLAN设置 可以使用命令 display vlan vlan id 查看指定的VLAN配置 使用命令 vlan vlan id vlan name 配置VLAN设置
  • 【廖雪峰python入门笔记】tuple_创建单元素

    tuple和list一样 可以包含 0 个 1个和任意多个元素 包含多个元素的 tuple 前面我们已经创建过了 包含 0 个元素的 tuple 也就是空tuple 直接用 表示 t print t 创建包含1个元素的 tuple 呢 来试
  • vue3 新特性

    注册全局组件 import HelloWorld from components HelloWorld vue const app createApp App 全局挂载属性和方法 方法一 app config globalPropertie
  • 2021年米哈游unity社招面试经历

    文章目录 简介 一面 二面 三面 四面 简介 我面试的岗位一共4轮 第1轮是电话技术面试 考察范围广 不细问 第2轮是视频面试 需要牛客网手写算法 第3轮是制作人 第4轮是BP 流程比较慢 投递到邀请面试大概过了一个月 面试一周多 offe
  • 使用Python实现累积面积图 using Python for cumulative area plot

    Code import matplotlib pyplot as plt import numpy as np np random seed 444 data np random rand 5 10 cumsum axis 1 years
  • 互联网 API 接口幂等性设计

    WEB 资源或 API 方法的幂等性是指一次和多次请求某一个资源应该具有同样的副作用 幂等性是系统的接口对外一种承诺 而不是实现 承诺只要调用接口成功 外部多次调用对系统的影响是一致的 幂等性是分布式系统设计中的一个重要概念 对超时处理 系