如何保证幂等性

什么是幂等性?

调用方对系统进行重复的调用,不管调用多少次,调用对系统的影响都是相同的。系统默认认为外部系统调用失败是常态,失败之后会有重试。
在这里插入图片描述

什么情况下会导致幂等性问题?

  • 网络波动,可能引起重复请求
  • 用户重复操作,可能导致触发多次请求。
  • 业务接口调用的失败重试
  • 页面重复刷新
  • 用户双击按钮,导致重复提交
  • 消息队列消费失败重试。

保持幂等性有什么不足?

幂等性虽然简化了客户端的操作,但是以服务端逻辑变为复杂为代价,除非有特殊业务要求,否则,尽量不要保证幂等行

  • 增加了保证幂等性的业务逻辑,增加了业务代码的复杂度
  • 并行代码改为了串行代码,降低了代码的执行效率

如何解决幂等性问题

  • 查一下上次执行状态,没有则进行第一次的请求
  • 在服务状态改变前,增加放置重复提交的逻辑
  • token机制解决幂等性问题
    在这里插入图片描述
    • token机制可能存在的问题
      • 先执行业务再删除token时
        • A执行完业务,还没有删除缓存,B请求到达携带token通过验证
          • 加拍他锁,保证执行业务和删除缓存为原子操作
          • 利用redis的原子指令incr,以token作为key,进行自增,保存时为1,第一次请求返回结果为2,则正常请求,否则,为重复请求。
      • 先删除token,再执行业务
        • 如果第一次请求超时,或者执行失败,没有响应,第二次请求重试时,认为重复请求,没法执行。
          • 一个token代表一个请求,可以返回接口异常,客户端重新获取token请求服务端。
    • token机制缺点
      • 每次业务请求都要多一次token的请求,成千上万的请求中只有十几个是失败的,为了少量的失败,增加一次请求是一种资源的浪费。
  • 乐观锁机制

数据库增加一个version字段,更新前判定版本号,版本号为预期版本号就执行更新,否则更新失败。或者加一个时间戳字段,更新时校验时间戳

在这里插入图片描述

  • 适合更新场景
    • 缺点:
      • 对数据库有压力
      • 代码侵入性
      • 业务复杂时,可能存在ABA问题(版本号自增)。
  • 悲观锁机制解决幂等性

每次去操作数据时,都觉得别人中途会修改,所以每次在拿数据的时候都会上锁,加锁,再配合事务解决幂等性问题。
在这里插入图片描述

  • 适用更新场景

  • 查询条件必须是索引,不然会锁表

  • 锁住记录,别的请求只能等待,事务太长,影响性能。

  • select + insert+update (主键或者唯一标识)
    在这里插入图片描述
    如果重复概率低,可以直接insert+唯一标识(主键)捕捉异常返回成功。

  • 状态机幂等

    • 有些数据存在多种状态,可以利用状态机来处理幂等。
      在这里插入图片描述
  • 防重表去重

建一种去重表,然后使用唯一索引,将更新语句与操作去重表的逻辑放在一个事务里面,异常会回滚

在这里插入图片描述

  • 分布式锁幂等

请求过来时,先去尝试获得分布式锁,如果获得成功,就执行业务逻辑,反之获取失败的话,就舍弃请求直接返回成功
在这里插入图片描述

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

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

相关文章

vmware虚拟机安装esxi7.0步骤

一、安装准备 1、下载镜像文件 下载链接:https://pan.baidu.com/s/12XmWBCI1zgbpN4lewqYw6g 提取码:mdtx 2、vmware新建一个虚拟机 2.1 选择自定义 2.2 选择ESXi对应版本 2.3 选择稍后安装操作系统 2.4 默认选择 2.5 自定义虚拟机名称及存储位置 2…

使用Go语言的HTTP客户端库进行API调用

随着微服务架构和RESTful API的普及,API调用成为了日常开发中的常见任务。Go语言提供了多种工具和库来帮助开发者轻松地与API进行交互。本文将介绍如何使用Go语言的HTTP客户端库进行API调用。 在Go语言中,标准库中的net/http包提供了基本的HTTP客户端功…

maven repository的官方网址

本文来记录下maven repository的官方网址 文章目录 记录例子 记录 maven仓库官方地址:https://mvnrepository.com/ 例子 比如搜索elasticsearch 选择适用的版本

win7系统报错msvcp140.dll丢失的多种解决方法分享

在Windows 7操作系统中,msvcp140.dll是一个非常重要的动态链接库文件,它负责许多应用程序的正常运行。然而,由于各种原因,我们可能会遇到丢失msvcp140.dll的问题。当msvcp140.dll文件丢失或损坏时,可能会导致程序无法启…

华为商城秒杀时加密验证 device_data 的算法研究

前言 之前华为商城放出 Mate60 手机时, 想给自己和家人抢购一两台,手动刷了好几天无果后,决定尝试编写程序,直接发送 POST 请求来抢。通过抓包和简单重放发送后,始终不成功。仔细研究,发现 Cookie 中有一个名为 devic…

Android ValueAnimator属性动画ObjectAnimator使View颜色渐变,Kotlin

Android ValueAnimator属性动画ObjectAnimator使View颜色渐变,Kotlin 设置背景颜色渐变: private var iv: ImageView? nulloverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activit…

STM32F103C8T6制作简易示波器

1设计需求 通过stm32f103c8t6实现一个简易示波器功能,该示波器可以检测0-3.6khz频率范围内的波形。 也可以输出波形,输出方波、三角波、正弦波。 2技术方案 通过stm32的ADC功能,采集输入信号,最后由oled屏进行显示。 采样频率…

逻辑斯蒂回归

逻辑斯蒂回归简介 逻辑斯蒂回归(Logistic Regression)是一个非常经典的算法,虽然被称为回归,但其实际上是分类模型,并常用于二分类。因为通过逻辑回归模型,我们得到的计算结果是0-1之间的连续数字&#xff…

【Android Studio】在单独的窗口中启动模拟器

参考:https://developer.android.com/studio/run/emulator-launch-separate-window?hlzh-cn 默认情况下,Android 模拟器会在 Android Studio 中运行。这样,您就可以高效地使用屏幕空间,使用热键在模拟器和编辑器窗口之间快速导航…

03 decision tree(决策树)

一、decision tree(决策树) 1. classification problems(纯度) i . entropy (熵) ​ 作用:衡量一组数据的纯度是否很纯 ,当五五开时他的熵都是最高的,当全是或者都不是…

Guava Cache 异步刷新技巧,你值得拥有!

以下文章来源于勇哥Java实战 ,作者勇哥 Guava Cache是一款非常优秀的本地缓存框架。 这篇文章,我们聊聊如何使用 Guava Cache 异步刷新技巧带飞系统性能 。 1 经典配置 Guava Cache 的数据结构跟 JDK1.7 的 ConcurrentHashMap 类似,提供了基…

【机器学习前置知识】Beta分布

Beta分布与二项分布的关系 Beta分布与二项分布密切相关,由二项分布扩展而来,它是用来描述一个连续型随机变量出现的概率的概率密度分布,表示为 X X X~ B e t a ( a , b ) Beta(a,b) Beta(a,b) , a 、 b a、b a、b 是形状参数。B…

ES6之Proxy详解

✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…

P11 FFmpe时间基和时间戳

前言 从本章开始我们将要学习嵌入式音视频的学习了 ,使用的瑞芯微的开发板 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《Linux C应用编程(概念类)_C…

力扣1944.队列中可以看到的人数--单调栈

思路: 由题知一个人能 看到 他右边另一个人的条件是这两人之间的所有人都比他们两人 矮 ,也就是说,在自己右边第一个比自己高的人后面的人就肯定看不到了那么只需要找到右边第一个比自己高的人与自己之间的所有满足要求的人就行了&#xff0…

mysql保姆安装教程

前言:考完研回来,重新配置数据库的相关环境,按照本方法安装请确保你之前的MySQL已完全清除干净。 一.下载install文件 1.进入Mysql官网,点击下载 2.选择MySQL Installer for Windows 3.推荐选择第二个安装包 4.不登陆&#xff0c…

23 导航栏

效果演示 实现了一个响应式的导航栏&#xff0c;当鼠标悬停在导航栏上的某个选项上时&#xff0c;对应的横条会从左到右地移动&#xff0c;从而实现了导航栏的动态效果。 Code <div class"flex"><ul><li>1</li><li>2</li><l…

怎么快速修复mfc140.dll文件?解决mfc140.dll缺失的方法

面对计算机报告的 ​mfc140.dll​ 文件遗失错误&#xff0c;这通常表明系统中缺少一个关键的动态链接库文件&#xff0c;该文件对于运行以 Microsoft Foundation Class (MFC) 库编写的程序十分重要&#xff0c;尤其是那些需要图形界面的应用程序和一些游戏。若没有这个文件&…

【AI视野·今日Robot 机器人论文速览 第六十六期】Tue, 31 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Tue, 31 Oct 2023 Totally 39 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers DEFT: Dexterous Fine-Tuning for Real-World Hand Policies Authors Aditya Kannan, Kenneth Shaw, Shikhar Bahl, Pragna Ma…

【Minikube Prometheus】基于Prometheus Grafana监控由Minikube创建的K8S集群

文章目录 1. 系统信息参数说明2. Docker安装3. minikube安装4. kubectl安装5. Helm安装6. 启动Kubernetes集群v1.28.37. 使用helm安装Prometheus8. 使用helm安装Grafana9. Grafana的Dashboard设定10. 设定Prometheus数据源11. 导入Kubernetes Dashboard12. 实验过程中的常见问题…