分布式系统中的幂等性

  • 分布式系统中的幂等性
    • 1.幂等性介绍
    • 2.幂等性场景
    • 3.crud操作的幂等性分析
    • 4.如何解决幂等性问题

分布式系统中的幂等性

1.幂等性介绍

幂等的概念来自数学,比如对于一元函数来说满足:f(f(x))=f(x)

即可称为满足幂等性

在计算机科学中,一个操作如果多次执行产生的影响与一次执行产生的影响相同,这样的操作即符合幂等性

在分布式系统中,服务消费方调用服务提供方的接口,多次调用的结果应该与一次调用的结果一样,这正是分布式环境下幂等性的语义。

为什么幂等性对于分布式系统而言如此重要?

因为子啊分布式环境下,服务调用方一般采用http协议或rpc或MQ的方式,即双方需要通过网络进行通信,而因为网络故障或者消息超时的存在,可能服务消费方已经成功调用了服务提供方的服务接口,但是消费方没有收到来自对方的成功响应,导致消费方以为服务调用失败从而再次进行调用,也就是网络的不可靠性导致了服务接口被多次调用的可能。

分布式系统必须保证在这种情况下,即使接口被多次调用,它对系统产生的影响应该与该接口只被调用一次的结果一样

2.幂等性场景

在微服务架构下,不同的微服务间会有大量的基于http,rpc或MQ消息的网络通信,接口的重复调用以及消息的重复消费可能会经常发生,比如以下情况

  • 调用订单创建接口,第一次调用超时,调用方又尝试了一次,但其实第一次调用已经成功,只是调用方没有及时收到响应
  • 订单支付成功后,需要向MQ发送一条消息,但该消息重复发送两条
  • 网络波动导致服务方的接口被调用了两次
  • 用户在使用产品时,无意地触发多笔交易
  • 某些未关闭的重试机制

微服务架构应该具有幂等性,当接口被重复调用时,消息被重复消费时,对系统的产生的影响应该和接口被调用一次,消息被消费时一样

3.crud操作的幂等性分析

  • 新增请求:不具备幂等性
  • 查询请求:重复查询不会影响系统状态,查询天然具有幂等性
  • 基于主键的更新请求
    要更新的值依赖于前值,不具备幂等性
    要更新的值不依赖于前值,具有幂等性
  • 删除请求
    基于主键的物理删除具有幂等性
    基于主键的逻辑删除也具有幂等性

总结:通常只需要对新增请求和更新请求作幂等性保证

4.如何解决幂等性问题

  • 全局唯一ID
    根据业务生成一个全局唯一ID,在调用接口时会传入该ID,接口提供方会从相应的存储系统,比如redis中去检索这个全局ID是否存在,如果存在则说明该操作已经执行过了,将拒绝本次服务请求;否则将相应该服务请求并将全局ID存入存储系统中,之后包含相同业务ID参数的请求将拒绝
  • 去重表
    这种方法适用于在业务中有唯一标识的插入场景。比如支付场景中,一个订单只会支付一次,可以建立一张去重表,将订单ID作为唯一索引。把支付并且写入支付单据到去重表放入一个事务中,这样当出现重复支付时,数据库就会抛出唯一约束异常,操作就会回滚。这样保证了订单只会被支付一次
  • 多版本并发控制
    适合对更新请求作幂等性控制,比如要更新商品的名字,这是就可以在更新的接口中增加一个版本号来做幂等性控制
  • 状态机控制
    适合有状态机流转情况下,比如订单的创建和付款,订单的创建肯定是在付款之前。这是可以添加一个int类型的字段来表示订单状态,创建状态为0,付款成功为100,付款失败为99。
  • 插入或更新
    在MySQL数据库中,如果insert语句后面带上ON DUPLICATE KEY UPDATE子句,而要插入的行与表中现有记录的唯一索引或者主键索引产生重复值,则对旧值进行更新;否则执行新纪录的插入

分布式系统中的幂等性相关推荐

  1. 分布式系统中的幂等性(客户端与服务端的交易一致性,避免多次扣款)

    原文Zookeeper与Dubbo | 什么是分布式系统中的幂等性 结合支付防重设计一起看 ZooKeeper是一种分布式协调服务,他用简单的架构和API,解决了在分布式环境中协调和管理服务的难题. ...

  2. 什么是分布式系统中的幂等性

    最近很多人都在谈论幂等性,好吧,这回我也来聊聊这个话题,光看着俩字,一开始的确有点一头雾水,语文不好嘛,词太专业嘛,对吧 现如今我们的系统大多拆分为分布式SOA,或者微服务,一套系统中包含了多个子系统 ...

  3. 分布式系统中的幂等性的理解

    最近在看公司接口文档,里面提到了一个幂等性,今查询相关知识后,对幂等性有所了解.现将参考的博文粘贴于此. 我们的系统大多拆分为分布式SOA或者微服务,一套系统中包含了多个子系统服务.而一个子系统服务往 ...

  4. 深入分析分布式系统中互斥性与幂等性问题

    本文来源:tech.meituan.com 前言 随着互联网信息技术的飞速发展,数据量不断增大,业务逻辑也日趋复杂,对系统的高并发访问.海量数据处理的场景也越来越多.如何用较低成本实现系统的高可用.易 ...

  5. 【通用设计】分布式系统中接口的幂等性

    阅读目录 业务场景 接口幂等性 幂等性实现方式 Token机制 数据库去重表 Redis实现 状态机 总结 业务场景 公司有个借贷的项目,具体业务类似于阿里的蚂蚁借呗,用户在平台上借款,然后规定一个到 ...

  6. 分布式系统中接口的幂等性

    业务场景 公司有个借贷的项目,具体业务类似于阿里的蚂蚁借呗,用户在平台上借款,然后规定一个到期时间,在该时间内用户需将借款还清并收取一定的手续费,如果规定时间逾期未还上,则会产生滞纳金. 用户发起借款 ...

  7. 分布式系统中只有两个难题

    分布式系统抽象 讨论编程语言时,我们使用通用术语并用函数.运算符.类.变量和指针来定义我们的程序.通用的词汇可以帮助我们避免每次都为了描述某些东西而发明新词.我们的定义越精确.越没有歧异,听众也就越容 ...

  8. 在一个成熟的分布式系统中 如何下手做高可用?

    对于企业来说,随着规模越来越大,整个系统中存在越来越多的子系统,每个子系统又被多个其他子系统依赖或者依赖于其他子系统.大部分系统在走到这一步的过程中,大概率会发生这样的场景:作为某个子系统的负责人或者 ...

  9. 【案例分析】分布式系统的接口幂等性设计!

    概念 幂等性, Idempotence, 这个词来源自数学领域, 百科 上一元运算的幂等性解释如下:设 f 为一由 {x} 映射至 {x} 的一元运算, 则 f 为幂等的, 当对于所有在 {x} 内的 ...

最新文章

  1. 黑色星期五阿里云向海淘输出双11技术
  2. C#清除HTML样式
  3. js中判断-0 ,js无穷数Infinity
  4. 园林空气净化器永久测试版
  5. Mybatis处理表关联(懒加载)
  6. 前端学习(590):调试javascript的流程
  7. POJ 2976 Dropping Tests
  8. LDAP命令介绍---dsreplication--enable:DISABLE
  9. SpringMVC框架----SpringMVC的自定义类型转换器
  10. 81、通过secureCRT连接虚拟机时几种连接方式的不同
  11. Linux关机运行的脚本,Linux关机时执行指定脚本功能实现
  12. 【Matlab学习笔记】【函数学习】size参数
  13. 快逸报表多数据源解决办法以及项目多数据源切换方法
  14. 火山视窗类库静态编译一览表,以及所需求的vs版本
  15. 【php基础入门】细说PHP中的函数声明与使用详解(重要)
  16. python selenium爬虫入门案例day04:Vhiphop街舞视频
  17. 均线颜色怎么区分_六种颜色的均线包括哪六种颜色,其代表的含义分别是什么?...
  18. oracle cdb能存数据嘛,ORACLE 12C 非CDB迁移CDB之克隆非CDB数据库
  19. 蓝桥杯比赛时间在什么时候_什么时候立冬2020年农历具体时间
  20. 远程控制工具——Centos7上向日葵安装使用(xy)

热门文章

  1. python怎么统计单词总数_python统计文本文件内单词数量的方法
  2. Scratch编程与数学之绘制六角形雪花!
  3. 【LeetCode】538. Convert BST to Greater Tree 解题报告(Python)
  4. Java 链表结点插入
  5. 企业微信Api,群发多发,私有化部署解决方案、企业微信协议
  6. v50.03 鸿蒙内核源码分析(编译环境) | 编译鸿蒙防掉坑指南 | 百篇博客分析HarmonyOS源码
  7. 微软账户登录的win11家庭版开启局域网共享
  8. “行泊舱”+出海全面发力,这家ADAS厂商跑出规模化“新速度”
  9. 电机一启动或负载电流瞬间增大,电源输出电压就下降,欠压,随后又恢复正常
  10. thinkphp5.1+layui图片上传(前端部分.第二种)