分布式系统的接口幂等性设计

2023-11-10

什么是幂等性
就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了其他的结果

在 CRUD 这 4 个操作中,查询操作是天然幂等的,删除操作也只会删除一次,多次的删除操作结果还是一样,影响幂等的只有在添加和更新着两个操作上面

在分布式场景 或者微服务架构场景下,以一个订单量流程来说明接口的幂等性问题

  • 订单的创建接口,第一次调用超时,然后重试了一次
  • 减库存操作超时,调用方重试了一次
  • 扣钱操作重试了一次
  • 订单状态更新接口,连续发送了两个消息,一个是已经创建,一个是已经付款,但是你先接受到已付款,然后收到已创建
  • 订单支付完成之后,需要发送一条短信,一台机器收到短信后,处理慢,消息中间件又把消息投递给另外的一台机器处理

以上的问题,就是在单体架构转为 分布式 微服务等结构之后,幂等性的问题凸显。

说了这么多,那么如何解决幂等性的问题呢?

全局唯一ID
如果使用全局唯一ID(分布式锁),根据业务的操作和内容生成一个全局的ID,在执行操作之前先根据这个全局ID是否存在,来判断某个操作是否已经执行了。如果不存在就把这个全局ID存储到 数据库 ,redis 等。如果存在表示方法已经执行了。
但是用 全局唯一ID 有个问题就是,在存储完某个 ID 之后,机器宕机了,客户端或者别的服务请求过来会响应超时,这种情况下 对于全局唯一ID 这个可能还需要加入集群做高可用等,反正全局性唯一ID 虽然可以一揽子都解决添加,修改 的幂等问题,但是实现起来也比较麻烦。

有几种特定场景下的 幂等性解决方案一起来看一下
去重表
这种方法适用于在业务中为唯一标的的插入场景中,比如在以上的支付场景中,如果一个订单只会支付一次,所以订单的ID 可以作为唯一标识,这时,我们就可以创建一张去重表。并且把唯一的标识作为唯一索引,在实际实现的时候,可以把创建订单支付和写入去重表,放在一个事务中,如果重复创建,数据库就会抛出唯一约束异常,操作就会回滚。

插入或者更新
这个方法插入并且有唯一索引的情况,比如我们要关联商品品类,其中商品的ID 和品类的ID可以构成唯一索引,并且在数据库中也增加了唯一索引,这时就可以使用 insert 或者 update 操作了。

多版本控制
这种方式适合在更新的场景中,比如我们要更新商品的名字,这个时候我们就可以在更新的接口中增加一个版本号

boolean updateGoodsName(int id,String newName,int version);

实现时可以如下

update goods set name = #{newName},version = #{version} where id = #{id} and version<${version}

状态机控制
这种方法适合在右状态机流转的情况下,比如就会订单的创建和付款,订单的付款肯定是之前。这时可以通过设计状态字段,使用 int 类型。并且通过值的大小来做幂等。比如订单的创建为 0 。付款成功为 100,付款失败为 99
在做状态更新的时候,我们就可以这样控制

update order set status = #{status} where id = #{id} and status < #{status}

以上就是一个保证接口幂等性的一些方法

最新更新

  • insert的时候我们的业务还没有唯一的单号,需要使用 token 来保证幂等
  • 混合操作(CRUD) ,这个情况找唯一的业务单号,如果有就用分布式锁,如果没有就需要 token 保证幂等
  • delete 删掉操作的时候,如果是通过主键删除的,那么你不管操作多少次都是一样的,不会对业务数据有什么影响;但是如果删除的条件不是主键,比如说 根据业务状态删除 status status = 0 的时候表示业务数据无效,需要删除,当你删除一部分status =0 的数据后,又有 status = 0 的数据,如果在前端操作的时候点击了多次,那么这两次的操作是否需要幂等要结合实际的业务情况来解决,如果后面出现的 status =0 的数据是需要删除的,那么也就意味着这种情况下的 delete 也是需要幂等的,所以这种情况可以采用 token 的方式来保证幂等。
  • update 操作 如果有业务单号可以使用版本号 version,如果没有业务单号 可以使用 token
  update order set  xxx= #{aaa} ,version = version+1 where id = #{bbb} and version = #{version}

https://www.cnblogs.com/jack87224088/p/8688948.html 原文链接

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

分布式系统的接口幂等性设计 的相关文章

  • 在centos在部署分布式文件存储系统Minio

    docker部署以及详细文档自取 链接 https pan baidu com s 14NhCk1SQZEHqzMubpUD0eQ 提取码 xyxy 0 应用场景 电商网站 海量商品图片 视频网站 海量视频文件 网盘 海量文件 社交网站 海
  • 2021春招已正式开启,阿里巴巴企业智能事业部内推,有意者看下文!

    前言 说一说已经拿到内推的两个朋友的面试经验 你们可以看一下准备一下 同事A阿里巴巴一面 55分钟 先介绍一下自己吧 说一下自己的优缺点 具体讲一下之前做过的项目 你觉得项目里给里最大的挑战是什么 Hashmap为什么不用平衡树 AQS知道
  • Ribbon负载均衡策略DynamicServerListLoadBalancer的ServerListFilter解读

    一 DynamicServerListLoadBalancer在类图中的位置 二 DynamicServerListLoadBalancer源码解读 1 关键代码请见注释 2 源码位置 ribbon master ribbon loadba
  • java脚本引擎Groovy实战

    前言 互联网时代随着业务的飞速发展 不仅产品迭代 更新的速度越来越快 个性化需求也是越来越多 如何快速的满足各种业务的个性化需求是我们要重点思考的问题 我们开发的系统如何才能做到热部署 不重启服务就能适应各种规则变化呢 实现业务和规则的解耦
  • 安装并配置HBase集群(5个节点)

    安装并配置HBase 集群规划 HBase2 2 5安装 将安装包拷贝到5台机器上并解压缩 配置环境变量 配置HBase 时间同步 修改 usr local src hbase 2 2 5 conf hbase env sh 文件 修改 h
  • 第五章 Gateway--服务网关

    接上一篇文章开始网关之旅 首先告诉大家网关是什么 Gateway简介 怎么配置 怎么入门 执行流程等等相关介绍 第一章 微服务的架构介绍发展第二章 微服务环境搭建第三章 Nacos Discovery 服务治理第四章 Sentinel 服务
  • 所有OLE接口

    比较有用 记录下来供查阅 常规 函数 lUnknown 目的 控制的接口协商的对象生存期 普遍存在的任何组件 而不考虑实现 QueryInterface 公开传入的接口 函数 IEnum 目的 枚举的各种类型的列表 在许多情况下 整个 OL
  • spring security oauth2 动态切换角色或者岗位,更新redis缓存

    1 切换角色或者岗位后更新缓存token 获取token 并更新token 特别要注意token中的内容 accessToken getAdditionalInformation put SecurityConstants DETAILS
  • 项目实战之RabbitMQ冗余双写架构

    作者名称 DaenCode gt https blog csdn net 2302 79094329 作者简介 啥技术都喜欢捣鼓捣鼓 喜欢分享技术 经验 生活 人生感悟 尝尽人生百味 方知世间冷暖 所属专栏 项目所感所想 gt https
  • MQ - KAFKA 基础篇

    1 KAFKA的核心组件 API Producer API 它允许应用程序向一个或多个 topics 上发送消息记录 Consumer API 允许应用程序订阅一个或多个 topics 并处理为其生成的记录流 Streams API 它允许
  • 在异构系统中学习应用的流迭代分布式编码计算研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 第六章--- 实现微服务:匹配系统(下)

    0 写在前面 这一章终于完了 但是收尾工作真的好难呀QAQ 可能是我初学的缘故 有些JAVA方面的特性不是很清楚 只能依葫芦画瓢地模仿着用 特别是JAVA的注解 感觉好多但又不是很懂其中的原理 只知道要在某个时候用某个注解 我真是有够菜的
  • Docker与微服务:构建和部署微服务架构的完整指南

    微服务架构已经成为现代应用开发的主要范式之一 而Docker容器技术则为微服务的构建 部署和管理提供了理想的解决方案 本文将深入探讨如何使用Docker构建和部署微服务架构 提供更多示例代码和细致的指南 以帮助大家更全面地理解和运用这些关键
  • 【分布式算法】Gossip协议详解

    一 为什么需要 Gossip 协议 为了实现 BASE 理论中的 最终一致性原则 两阶段提交协议和 Raft 算法需要满足 大多数服务节点正常运行 原则 如果希望系统在少数服务节点正常运行的情况下 仍能对外提供稳定服务 这时就需要实现最终一
  • Zookeeper 和 Dubbo 的关系?

    Zookeeper的作用 zookeeper用来注册服务和进行负载均衡 哪一个服务由哪一个机器来提供必需让调用者知道 简单来说就是ip地址和服务名称的对应关系 当然也可以通过硬编码的方式把这种对应关系在调用方业务代码中实现 但是如果提供服务
  • 网站被攻击了怎么恢复?如何在被攻击后第一时间接入高防恢复正常访问?

    网站受到攻击的原因是多种多样的 包括技术漏洞 人为疏忽 社会工程学等各种因素 保护网站的安全需要综合运用技术手段 当网站遭到攻击时 以下几个步骤可以帮助恢复网站的正常运行 1 分析攻击 首先要确认网站被攻击的类型和程度 以确定所需的恢复步骤
  • 微服务常见的配置中心简介

    微服务架构中 常见的配置中心包括以下几种 Spring Cloud Config Spring Cloud Config是官方推荐的配置中心解决方案 它支持将配置文件存储在Git SVN等版本控制系统中 通过提供RESTful API 各个
  • Python 微服务架构指南

    概要 微服务架构作为一种设计风格 它将应用程序构建为一套小服务的集合 每个服务实现特定的业务功能 这些服务可以独立部署 扩展并围绕特定业务能力构建 Python 凭借其简洁易读的语法和强大的库生态系统成为实现微服务的受欢迎选择 本文将详细介
  • Redis分布式锁--java实现

    文章目录 Redis分布式锁 方案 SETNX EXPIRE 基本原理 比较好的实现 会产生四个问题 几种解决原子性的方案
  • 手把手教你使用HarmonyOS本地模拟器

    我们通过下面的动图来回顾下手机本地模拟器的使用效果 本期 我们将为大家介绍HarmonyOS本地模拟器的版本演进 并手把手教大家使用HarmonyOS本地模拟器 一 本地模拟器的版本演进 2021年12月31日 经过一个版本的迭代优化 随D

随机推荐

  • 几个cve漏洞库查询网站-什么是CVE?常见漏洞和暴露列表概述

    CVE 的英文全称是 Common Vulnerabilities Exposures 通用漏洞披露 CVE就好像是一个字典表 为广泛认同的信息安全漏洞或者已经暴露出来的弱点给出一个公共的名称 使用一个共同的名字 可以帮助用户在各自独立的各
  • ubantu下编译dwm缺少的依赖库

    apt get install xorg dev apt get install libx11 dev apt get install libxft dev
  • FB02编辑Coding Block字段

    默认情况下FB02是不允许更改coding block的增强字段的 需要实现可编辑需要进行两个步骤 1 实施note 3067143 2 SM30在视图TCOBX中对增强字段添加以下配置 前台效果
  • Java--软件安装、环境配置、语言类型、命名规则

    java的四大特性 自动垃圾回收 面向对象 跨平台 多线程 编译型语言和解释型语言的区别 编译型语言 运行之前 先把源文件通过指定的编译器 生成机器码文件 可以让计算机直接识别 优点 只需要编译一次 可以运行无数次 所以运行效率极高 缺点
  • 电磁场关于静电场和恒定磁场的思维导图及引申时变电磁场

    参考书目 工程电磁场导论 马西奎 电磁场与电磁波 邹澎 lt 郑大课程选定教材 gt 知乎电磁场专栏 电磁场理论基础 王蔷 整理备忘作为复习之用 本篇中所有积分符号全部采用单符号 面积和体积不再使用多积分号以便表述简单 同时符号标记使用马西
  • 基于LSTM的负荷和可再生能源出力预测(核心部分复现)

    目录 1 主要内容 长短期记忆网络介绍 2 程序结果 3 下载链接 1 主要内容 该程序复现文章 基于改进鲸鱼优化算法的微网系统能量优化管理 负荷和可再生能源预测部分 根据长短期记忆网络 Long Short Term Memory LST
  • NASM与link、golink和alink具体例子使用对比

    一 OMF文件格式链接 使用import伪指令 import伪指令可以直接使用函数名 而不用给函数名加上 前缀和 number 后缀 但import伪指令仅适合于OMF borland obj 格式输出 OMF格式是MS在16位下操作系统的
  • vue awesome swiper 轮播图 循环不了 无法自动播放 loop无效 autoplay无效 蓝圈 解决办法

    vue awesome swiper 轮播图循环不了 无法自动播放 loop无效 autoplay无效 解决办法 出现问题 1 轮播图无法自动播放 2 swiper opagination为蓝色圈如何变成白色圈 3 loop无效 对应的解决
  • QT 一信号对应多个槽函数

    网络上搜索 大部分都废话连篇 直接上码测试此功能 结果显示OK 分别创建三个类 A B C 信号和槽绑定关系如下 一个信号绑定两个槽函数 A A QObject parent QObject parent B b new B C c new
  • CentOS7安装详细教程

    VM安装CentOS 7详细教程 通过VM安装CentOS7虚拟机的全部过程 并自动配置IP地址和DNS服务器 可以进行联网 1 软件准备 VM12 软件 安装包下载地址 云盘链接 VM12软件安装包下载地址 提取码 5lgm CentOS
  • 微信企业号,回调模式开通.net

    企业号每个应用有普通模式和回调模式两种 普通模式直接打开网页 回调模式可设置应用底部菜单项 可增加交互开发 可把客户端的操作事件传给企业服务器 企业服务器做响应开发 开通回调模式 首先需要通过url的回调验证 那么进入应用后台设置项 设置好
  • Vue2学习计划二:mustache与methods和computed等Vue实例参数

    上一节写了Vue实例的生命周期 我们心里有了个Vue里的数据绑定至DOM 那么具体怎么实现的呢 要实现只需要在Vue绑定的DOM元素中使用mustache语法即可 简单例子如下 div h2 message h2 hr h3 全名 full
  • (一)ideal 创建springboot工程和实现简单配置

    新建 IDEA project 选择Spring Initializr Choose Initializr Service URL 选择 Default Https start spring io 点击 next 进入下一步 提示 1 sp
  • Keil for arm 关于enit0 快速中断(FIQ)的响应

    本文原创 版权所有 如需转载 请注明出处 接着上篇讲arm7对于普通中断的响应 今天讲一下 关于快速中断的响应 步骤1 基础环境 arm7 LPC2106 Realview 4 2 编译环境默认 步骤2 starup s文件 启动代码 和i
  • adb shell 报错error: device unauthorized

    2022 7 29 oppo r11s 安卓8 亲测成功 windows电脑在链接安卓设备后 想要进行终端命令行进入到该设备 出现报错 报错内容 C Users gt adb shell error device unauthorized
  • 机械手使用者坐标系和工具坐标系_发那科机器人应用-坐标系介绍(2)

    工具坐标系 由工具中心点 的位置 和工具的姿势 构成 工具中心点 的位置 通过相对机械接口坐标系的工具中心点的坐标值 来定义 工具的姿势 通过机械接口坐标系的 轴 轴 轴周围的回转角 来定义 工具中心点用来对位置数据的位置进行示教 在进行工
  • Linux系列:Linux中如何安装.rpm、.tar、.tar.gz和tar.bz2文件

    我以下面三个包为例 三个包都在 etc opt下 A example 1 2 3 1 rpm B example 1 2 3 1 tar C example 1 2 3 1 tar gz 1 安装rpm包 说起RPM REDHAT Pack
  • 关于QtCreator 4.8 创建工程时,选中创建界面(.ui)无法创建工程问题

    在主界面一次选中 help gt about plugins 然后在弹出界面中找到QtCreator 在Designer右侧的的方框中打钩 然后close界面 重启软件 搞定 很简单的设置 浪费了好长时间
  • 芯片设计制造全过程

    芯片设计制造全过程 将一颗芯片从0到1 可以分为芯片设计和芯片制造两部分 芯片设计对应市场上一些fabless公司 这类公司只做芯片设计 而芯片制造对应的是foundary 比如国内的smic TSMC 国外的Samsung GlobalF
  • 分布式系统的接口幂等性设计

    什么是幂等性 就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的 不会因为多次点击而产生了其他的结果 在 CRUD 这 4 个操作中 查询操作是天然幂等的 删除操作也只会删除一次 多次的删除操作结果还是一样 影响幂等的只有在添加和