分布式系统---幂等性设计

2023-11-19

分布式系统---幂等性设计

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

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

1.MVCC方案

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

1
2
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在数据库里面做唯一索引,防止多次付款,(并发时,只能处理一个请求)

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


高并发系统数据幂等性

   在系统开发过程中,经常遇到数据重复插入、重复更新、消息重发发送等等问题,因为应用系统的复杂逻辑以及网络交互存在的不确定性,会导致这一重复现象,但是有些逻辑是需要有幂等特性的,否则造成的后果会比较严重,例如订单重复创建,这时候带来的问题可是非同一般啊。

一、系统的幂等性

     幂等是数据中得一个概念,表示N次变换和1次变换的结果相同。

二、高并发的系统如何保证幂等性

1、查询

    查询的API,可以说是天然的幂等性,因为你查询一次和查询两次,对于系统来讲,没有任何数据的变更,所以,查询一次和查询多次一样的;

2、MVCC方案

    多版本并发控制,update with condition更新带条件,这也是在系统设计的时候,合理的选择乐观锁,通过version或者其他条件,来做乐观锁,这样保证更新及时在并发的情况下,也不会有太大的问题。

   例如update table_xxx set name=#name#,version=version+1 where version=#version# ,或者是 update table_xxx set quality=quality-#subQuality# where quality-#subQuality# >= 0

3、单独的去重表

    如果涉及到的去重的地方特别多,例如ERP系统中有各种各样的业务单据,每一种业务单据都需要去重,这时候,可以单独搞一张去重表,在插入数据的时候,插入去重表,利用数据库的唯一索引特性,保证唯一的逻辑;

4、分布式锁

    还是拿插入数据的例子,如果是分布是系统,构建唯一索引比较困难,例如唯一性的字段没法确定,这时候可以引入分布式锁,通过第三方的系统,在业务系统插入数据或者更新数据,获取分布式锁,然后做操作,之后释放锁,这样其实是把多线程并发的锁的思路,引入多多个系统,也就是分布式系统中得解决思路;

5、删除数据

  删除数据,仅仅第一次删除是真正的操作数据,第二次甚至第三次删除,直接返回成功,这样保证了幂等;

6、插入数据的唯一索引

   插入数据的唯一性,可以通过业务主键来进行约束,例如一个特定的业务场景,三个字段肯定确定唯一性,那么,可以在数据库表添加唯一索引来进行标示。

   这里有一个场景,API层面的幂等,例如提交数据,如何控制重复提交,这里可以在提交数据的form表单或者客户端软件,增加一个唯一标示,然后服务端,根据这个UUID来进行去重,这样就能比较好的做到API层面的唯一标示

7、状态机幂等

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


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

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

  • 今天我们来聊一聊孟德尔随机化

    欢迎关注 生信修炼手册 在传统的实验设计中 由于种种混杂因素的存在 我们仅仅能够分析变量之间的关联性 最典型的比如GWAS 对于显著的位点 只能够说明这些位点和性状之间存在关联 对于了解事情发生的原因和规律而言 关联性是不够的 我们需要的是

随机推荐

  • 【Excel】工作中会用到的excel操作和技巧

    最近入职培训 接受了一些企业文化的洗脑课 不过也有一些是很有实际应用的课程 比如excel操作和技巧 现将自己觉着很有用的地方总结如下 1 基础性操作与技巧 说在前面 一个好的工作表格 需要主要以下几点 首行首列要留白 外边框要加粗 字体字
  • php企业微信通讯录同步设置接收事件服务器

    第一步登陆企业微信pc端管理后台设置好信息 先不要点击保存 会提示失败 随后根据填写的URL编写接口 接口代码如下 就是第一步图中的token token xxx 就是第一步图中的EncodingAESKey encodingAESKey
  • msys2下gtk或qt程序的打包

    1 编译x64的程序 从win10的开始菜单中打开MSYS2 MinGW x64命令行 使用cd命令切换到二进制程序exe所在目录 2 执行如下命令 最后一个参数是当前文件存放dll 可以自定义一个新的文件夹 拷贝起来方便 ldd exe
  • 使用Visual Studio 2019和IntelliJ IDEA 2018实现JAVA调用本地代码

    使用Visual Studio 2019和IntelliJ IDEA 2018实现JAVA调用本地代码 1 我们使用的工具是 IntelliJ IDEA 2018 编写java代码 和VisualStudio 2019 编写Native方法
  • 关于“system”: 找不到标识符 的问题

    关于 system 找不到标识符问题和 包括 排除 设置禁用了加载功能的问题 这个问题主要是使用system pause 时造成的 可以删除或者注释这个语句试试 解决办法 1 添加头文件stdlib h 2 添加iostream h 另外
  • ld_preload

    gdb调试包含共享库代码的程序 shell export LD PRELOAD 相信有不少的同志调试过包含共享库代码的程序 这个时候最为头疼的就是不能进行单步跟踪 当然是在你不知道如何解决的情况下 本文根据一个实例来讲述如何来解决这个问题
  • C++Primer(第五版 )第十三章 拷贝控制 章节编程练习答案

    13 1 拷贝构造函数是什么 什么时候使用它 答 如果一个构造函数的第一个参数是自身类类型的引用 且任何额外参数都有默认值 则此构造函数是拷贝构造函数 当使用拷贝初始化时 我们会用到拷贝构造函数 13 2 解释为什么下面的声明是非法的 答
  • JS字符串转换为JSON的四种方法

    JS字符串转换为JSON的四种方法 1 jQuery插件支持的转换方式 示例 parseJSON jsonstr jQuery parseJSON jsonstr 可以将json字符串转换成json对象 2 浏览器支持的转换方式 Firef
  • 批量获取文件的摘要(md5、sha1、sha256)

    批量获取文件的摘要 md5 sha1 sha256 0x01 功能 0x02源码 0x03运行 0x01 功能 刚刚写了一个小工具 用于批量获取文件的摘要 md5 sha1 sha256 具体用法 gt gt gt gt python3 g
  • 文件服务器中按用户查询文件夹权限,服务器文件夹权限设置

    服务器文件夹权限设置 内容精选 换一换 该任务指导用户使用Loader将数据从SFTP服务器导入到HBase 创建或获取该任务中创建Loader作业的业务用户和密码 确保用户已授权访问作业执行时操作的HBase表或phoenix表 获取SF
  • PO模式+数据驱动(TPshop网站的登录模块进行单元测试以及区分正向逆向用例)

    一 区分正向逆向用例 思路 在测试数据中添加一一个标识正向用例或逆向用例的标记 如 True False 步骤 调用登录方法 此登录方法中 只有输入用户名 输入密码 输入验证码 点击登录按钮 判断用例标记 判断安全退出是否存在 点击安全退出
  • 玩转 gpgpu sim 01记 —— try it

    1 短介绍 gpgpu sim 是一个gpu模拟器 可以让cuda openCL程序运行在一个软件模拟器上 而不需要硬件GPU 2 目标 用最简单省事的方式跑通一个gpgpu sim的仿真 3 gpgpu sim 一点项目特性 开发比较早
  • Java switch case 语句

    Java 的 switch case 语句是一种常用的控制流语句 用于基于不同的输入值执行不同的操作 本文将详细介绍 Java switch case 语句的作用 用法以及在实际工作中的应用 一 switch case 语句的作用 swit
  • QT 定时器使用事项

    情景 有一种特殊情况 一旦窗口系统事件队列中的所有事件都已经被处理完 一个定时为0的QTimer就会到时间了 这也可以用来当提供迅速的用户界面时来做比较繁重的工作 优点 QT app启动后不做任何操作 程序CPU占比已经达到90 以上 缺点
  • vue cli3 vue.config.js 配置详情

    module exports 基本路径 baseUrl process env NODE ENV production 输出文件目录 outputDir dist 默认dist 用于嵌套生成的静态资产 js css img fonts 目录
  • APK加壳原理简述

    先把核心原理记录一下 代码随后再补 PRE dex文件结构知识和加壳原理 先看下dex文件的基本结构 对于加壳主要关注3个关键字 1 checksum 文件校验码 使用alder32算法 校验文件除了maigc和checksum外余下的所有
  • 机器人编程和python的区别_机器人编程和少儿编程的区别

    随着少儿编程的大火 很多家长看懂了人工智能的未来趋势 都开始咨询少儿编程 除了少儿编程还有机器人编程 那么会有家长纠结 学哪个课程对孩子的教育发展和未来更好 那么要解决这个问题 就必须弄明白机器人和少儿编程的区别 机器人编程 在编程的基础上
  • Linux vim编辑器使用指南

    vim编辑器介绍 Vim是从vi发展出来的一个文本编辑器 代码补完 编译及错误跳转等方便编程的功能特别丰富 在程序员中被广泛使用 Vim 具有程序编辑的能力 可以主动以字体颜色辨别语法的正确性 方便程序设计 基本上 vim 共分为三种模式
  • Linux中ifconfig的使用

    ifconfig命令的全称是network interface configuring 用来配置Linux系统中的网卡信息 使用ifconfig命令配置的网卡配置信息 只是临时生效的 当网卡或者是机器重启 配置就会消失 只有通过修改配置文件
  • 分布式系统---幂等性设计

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