如何保证幂等性

news2024/11/19 15:36:52

什么是幂等性?

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

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

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

保持幂等性有什么不足?

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

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

如何解决幂等性问题

  • 查一下上次执行状态,没有则进行第一次的请求
  • 在服务状态改变前,增加放置重复提交的逻辑
  • 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.coloradmin.cn/o/1358668.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

揭开高速应用最佳光耦合器选择的秘密

在快节奏的电子领域,光耦合器的重要性再怎么强调都不为过。这些关键组件在确保电子电路不同部分之间的无缝通信方面发挥着关键作用。本文深入探讨了光耦合器的主要参数,并指导您选择理想的高速光耦合器。 了解光耦合器的基础知识 光耦合器通常称为光隔…

龙芯loongarch64服务器编译安装clang

前言 Clang 是一款开源的 C、C++、Objective-C 和 Objective-C++ 编程语言的编译器前端。它是 LLVM 编译器基础设施项目的一部分,具有优秀的性能、可扩展性和模块化设计。 Clang 提供了一系列主要功能,包括但不限于: 作为编译器前端,负责将源代码转换为中间表示形式(IR)…

leetcode:136只出现一次的数字(详解),又名找到单身狗

期末考试临近,每天复习一点知识,还是可以复习完的,加油 前言 我后来才知道这是力扣上的一道题,我当时写他的时候名字叫找到单身狗,即使那个只出现了一次的数字 题目 136. 只出现一次的数字 给你一个 非空 整数数组…

ChatGPT到底可以做什么?

1、熟练掌握ChatGPT提示词技巧及各种应用方法,并成为工作中的助手。 2、通过案例掌握ChatGPT撰写、修改论文及工作报告,提供写作能力及优化工作 3、熟练掌握ChatGPT融合相关插件的应用,完成数据分析、编程以及深度学习等相关科研项目。 4、…

AI论文指南|ChatGPT助力论文论据搜集!【建议收藏】

点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 公众号原文▼▼▼▼: AI论文指南|ChatGPT助力论文论据搜集!【建议收藏】 上一篇文章,小编为宝子们分享了ChatGPT在论文论点提炼方面的内容以及操作流…

大创项目推荐 深度学习卷积神经网络的花卉识别

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基…

国产高分七号光学影像产品预处理步骤

1.引言 高分七号卫星采用主被动光学复合测绘新体制,星上搭载了双线阵相机、激光测高仪等有效载荷,其中双线阵相机可有效获取20公里幅宽、优于0.8m(后视:0.65m;前视:0.8m)分辨率的全色立体影像和2.6m分辨率的…

全球海洋数据 (GLODAP) v2.2023(海洋碳数据产品)

全球海洋数据分析项目 (GLODAP) v2.2023 全球海洋数据分析项目 (GLODAP) v2.2023 代表了海洋生物地球化学瓶数据合成方面的重大进步。此更新主要关注海水无机碳化学,以 GLODAPv2.2022 为基础,包含多项关键增强功能。值得注意的是,增加了 43 …

【力扣每日一题】力扣2478从链表中移除节点

题目来源 2478.从链表中移除节点 题目描述 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 示例1: 输入:head [5,2,13,3,8] 输出:[13,8] 解释:需要移除的节点是 5 …

Unity组件开发--传送点

本组件仅实现A传送点到B传送的功能,是可以双向传送的,如果只要单向传送,可以另外改脚本实现; 先看效果: unity组件传送点演示 1.传送组件shader是怎么写的:这种效果的实现方案 shader编辑器是这样的&#…

x-cmd pkg | gitui - git 终端交互式命令行工具

目录 简介首次用户功能特点类似工具与竞品进一步探索 简介 gitui 由 Stephan D 于 2020 年使用 Rust 语言构建的 git 终端交互式命令行工具,旨在终端界面中便捷管理 git 存储库。 首次用户 使用 x gitui 即可自动下载并使用 在终端运行 eval "$(curl https:/…

为了搞项目,我差点把京东 “爬“ 了个遍。。

最近在重构我的准备 智慧校园助手2.0 ,奈何之前的相关数据放在服务器被小黑子黑了,准备重新搞点数据,借此和大家分享一波我之前做项目没数据该咋搞 👀。 Java面试指南 & 大厂学习导航:www.java2top.cn 完整源码获取…

Redis7新特性探秘【拥抱AI】

🌈🌈🌈🌈🌈🌈🌈🌈 欢迎关注公众号(通过文章导读关注:【11来了】),及时收到 AI 前沿项目工具及新技术 的推送 发送 资料 可领取 深入理…

urdf文件<gazebo>内<plugin>标签作用(虚拟驱动)

To get ROS to interact with Gazebo, we have to dynamically link to the ROS library that will tell Gazebo what to do. Theoretically, this allows for other Robot Operating Systems to interact with Gazebo in a generic way. In practice, its just ROS. 如果要使…

项目优化的方法

持续更新中… 目录 性能防抖、节流防抖(debounce)节流(throttle)防抖节流的区别: 图片/视频/音频压缩减少请求发送次数减少重绘与回流经常要切换消失与出现状态的节点用v-show而不用v-if按需引入路由懒加载懒加载图片懒加载列表懒加载 精灵/雪碧图Webpack优化前端性…

2.0.0 BGP高级特性-ASFilter、CommunityFilter、ORF、对等组

Peer Group BGP对等体组 在网络中出现多台设备配置相近的情况下,使用对等体组可以极大的减少配置命令的输入。 与端口组类似,通过创建一个组,然后将成员添加入其中,可以对组中的成员进行统一的管理。 案例配置1 以AR2为例&…

博客的简介

博客的简介 大家可以把这个当做目录,从中选择自己需要的内容进行阅览,欢迎大家一键三连!!!! 话题讨论专栏 点击进入话题讨论专栏 主要文章: 神奇的代码——可随意修改复制页面内容 Python…

c语言:用共同体输出数据|练习题

一、题目 设置一个c语言共同体&#xff0c;并用共同体输出数据 如图&#xff1a; 二、代码图片【带注释】 三、源代码【带注释】 #include <stdio.h> #include<string.h> //定义一个共同体 union test { int i; char ch[10]; int id; }; //注意&…

无法开机报 不可恢复的错误:securityagent无法创建所要求的机制Teamviewerauthplugin:start

无法开机报 不可恢复的错误&#xff1a;securityagent无法创建所要求的机制Teamviewerauthplugin:start 初步判断很有可能是TeamViewer的某个启动项或者签名书没有&#xff0c; 导致在预加载的时候无法加载TeamViewer。 然后出现这个情况有一个前提&#xff0c;那就是你用了第三…

17周刷题(6~10)

编写int fun(char s[])函数&#xff0c;将八进制参数串s转换为十进制整数返回&#xff0c;若传入"77777"返回32767。 #include<string.h> int fun(char s[]) {int i strlen(s)-1, h 0, q 1;while (i>0) {h (s[i] - 0) * q;q * 8;i--;}return h; } …