幂等性及技术解决方案

news2024/11/25 20:45:13

目录

  1. 定义幂等性

  2. 为什么需要幂等性
  3. 幂等性设计注意事项
  4. 幂等性的范围
  5. 分布式锁解决幂等性
    1. 设计
  6. 延伸阅读

定义幂等性

简单地说,我们可以多次执行幂等运算而不改变结果或者使用相同的输入参数中被调用多次,则不具有额外效果的操作,也就是多次执行的结果都是一致的。

为什么需要幂等性

 幂等性确保相同的请求会导致相同的系统状态,并且不会有任何动作被无意地执行多次。
  • 无幂等性的情况

    比如 P给C转100元,P将转账的指令成功发送到B并且B把指令发送C了,B再发确认消息到P的时候,由于网络问题,P没有收到确认的消息,经过一段时间,P发起重试,C认为这个是条新的消息,会再次发送到C。这种情况会出现P转了200元到C。

    大致的流程如下图

幂等性设计注意事项

上面问题可以采用幂等性Key来解决,在设计幂等性Key的时候需要考虑如下几种情况

  1. Key的唯一性,
  2. Redis 高可用(如果用Redis用存储Key)
  3. 接口执行成功了要删除Key
  4. 有些操作是天然幂等就不要做幂等性校验,幂等性的实现需要耗一定的资源
  5. 分布式锁的互斥性,安全性,对称性,可靠性以及锁的NPC问题(高并发下的幂等性设计)

幂等性的范围

  1. 请求层面的幂等性

    1. 用户重复操作
    2. 网络波动,可能会引起重复请求
    3. Nginx,Zuul,GateWay网关等中间件的重试机制
    4. 定时任务重复执行
    5. 微服务之间的重试
    6. 第三方回调比如微信的支付回调接口
    7. 对外提供的OpenAPI
  2. 业务层面

    1. MQ重复消费

    2. 一定时间内不能给同一种账号转相同金额

    3. 并行执行

      在多个服务冗余部署的情况下,请求是并发消费的,所以需要将请求从并行转换为串行。

  3. 数据库层面

    1. INSERT不是幂等性的
    2. UPDATE–通过WHERE条件控制幂等性,并尽可能少地使用相对值进行操作。
    3. DELETE–类似地由WHERE条件控制,最大限度地减少相对值的使用

分布式锁解决幂等性

              分布式锁通常用于分布式群集中,以提高系统性能和并发性。在分布式系统中,请求通过分布式锁从并行处理转化为串行处理,它用于确保在不同系统中的多过程环境中互斥的特定共享资源。其本质是通过序列化对该资源的请求来避免重复处理,然而,它不能解决请求的幂等性问题,仍然需要控制业务代码中的幂等性。需要在系统外部创建共享存储服务器来存储锁信息

设计

  1. 互斥锁: 任何时候只有一个客户端可以持有相同的锁。也就是说,锁的存在是全局强一致的。

  2. 无死锁 :具有锁定失败机制,首先,提供锁服务的系统具有很高的可用性和健壮性。

    多节点服务,任何节点停机或网络分区不影响锁的获取;第二个是客户端自动续租和释放锁

  3. 对称:对于任何锁,锁和解锁必须是同一个客户端。

  4. 容错:高可用性、高性能。服务本身具有高可用性,系统也很健壮。多节点服务,任何节点停机或网络分区都不会影响锁的获取。

  5. 可重入:它可以有效地减少死锁的发生。

  6. 客户端调用很简单。锁的代码高度抽象。

  7. 提供锁注册的服务本身的稳定性和一致性

  8. 需要处理锁未能按计划续订租约。例如心跳更新失败、服务启动GC、GC期间的服务暂停时间超过锁的有效时间等。

  9. 出现假死,TTL 仍在继续。

  10. 锁的登记。确保锁的注册是原子的,也就是说,确定锁是否存在,并序列化注册。

  11. 如何在对业务代码的入侵最小的情况下更新锁的租约? CAS 原子性。


    延伸阅读

设计模式——责任链模式-CSDN博客文章浏览阅读1.2k次,点赞22次,收藏11次。链上的每个处理者都有一个成员变量来保存对于下一处理者的引用。如果请求中包含正确的数据, 所有处理者都将执行自己的主要行为, 无论该行为是身份验证还是数据缓存。在这种情况下, 叶组件接收到请求后, 可以将请求沿包含全体父组件的链一直传递至对象树的底部。收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。2 . 为了在具体处理者中消除重复的样本代码, 你可以根据处理者接口创建抽象处理者基类。在这种情况下, 你可以对由请求代表的同一个上下文对象执行许多不同的操作。https://blog.csdn.net/qq_30621637/article/details/142657894

如何设计 API: 基本指南 + 最佳实践文章浏览阅读41次。系统接口是不同组件子系统或系统之间的交互和交换点。它们对于任何系统工程项目的功能、性能和可靠性都是必不可少的。然而,在数字生态系统中,软件解决方案的指数级增长凸显了API在实现无缝集成方面的关键作用,如何设计API带来了常见的挑战,设计系统接口并不是一项简单的任务。它需要仔细考虑系统生命周期中所有利益相关者的需求、期望和约束。在本文中,您将学习为所有利益相关者设计系统接口的最佳实践和方法。设计系统接口的第一步是确定谁是利益相关者即谁调用/使用接口,以及他们接口要求是什么。https://mp.weixin.qq.com/s/mu_e0MkYCrla0NpoxqJqyg

金融行业业务流程指南-三级模型-CSDN博客文章浏览阅读1.3k次,点赞42次,收藏12次。业务事件定义事件名称填写事件名称事件描述对业务事件进行描述触发点描述事件触发所涉及的利益相关方事件类型描述具体的事件类型频率描述事件发生的频率年增长率描述该事件每年发生的预计增长率触发的活动描述事件所触发的活动2. 业务事件与活动映射关系事件填写事件的名称事件触发点填写该事件所需要的触发点事件类型填写事件所属的事件类型触发的活动填写事件所触发的活动,如果触发多个活动,则需全部填写3. 三级模型定义信息。https://blog.csdn.net/qq_30621637/article/details/142486470

流程建模整体方法-CSDN博客文章浏览阅读976次,点赞7次,收藏9次。标准化的流程是可衡量的、可评价的、可共用的、标准的、灵活的流程。从业务价值角度的分解,是由一组企业级的活动构成,用于银行完整、清晰的描述其业务流程,端到端的为客户提供集成的、统一的具有一定独立价值的服务框架。流程模型宜分为五级。即明确价值链的关注点,价值链环节是独立的、重点关注的宜分开,价值链环节判断可以合并、共同表述的宜合并,并根据前中后台的划分原则定义所需要的价值链。的活动的组合,是独立的业务模块,拥有独立运营的潜力,在极端情况下可以作为一个可分离的单位被共享,甚至被外包,由承包人进行管理和运营。https://blog.csdn.net/qq_30621637/article/details/142301898

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

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

相关文章

使用pytdx获取历史股票行情

使用pytdx获取历史股票行情 先看效果pytdx基础获取历史股票行情将历史数据存入数据库 先看效果 获取从2010年01月01日-2024年09月30日的股票数据 pytdx基础 https://blog.csdn.net/firexiaHouse/article/details/142687052?spm1001.2014.3001.5501 获取历史股票行情 def …

C++11--智能指针

引入 为什么需要智能指针? 在介绍异常时,遇到以下场景,处理异常就会比较棘手: void Func() {int* arr1 new int[10];int* arr2 new int[20];int* arr3 new int[30];// ...delete[] arr1;delete[] arr2;delete[] arr3; }这里…

一文吃透 SpringBoot (从入门到精通)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

15分钟学 Python 第35天 :Python 爬虫入门(一)

Day 35 : Python 爬虫简介 1.1 什么是爬虫? 网页爬虫(Web Crawler)是自动访问互联网并提取所需信息的程序。爬虫的主要功能是模拟用户通过浏览器访问网页的操作,从而实现对网页内容的批量访问与信息提取。它们广泛应用于数据收集…

【IPv6】IPv6地址格式及地址分类(组播、单播、任播)整理

IPv6地址格式 IPv6 地址从 IPv4 地址的 32 bits 扩展到 128 bits,IPv6 地址的表示、书写方式也从 IPv4 的点分十进制,修改16进制的冒号分割 IPv4 点分格式(.) 192.168.11.11 IPv6 冒号分割(:) 2408:8459:3032:0000:0000:0000:0001:a9fd IPv6 的规范…

平面电磁波的电场能量磁场能量密度相等,注意电场能量公式也没有复数形式(和坡印廷类似)

1、电场能量密度和磁场能量密度相等(实数场算的) 下面是电场能量密度和磁场能量密度的公式,注意这可不是坡印廷定理。且电场能量密度没有复数表达式,即不是把E和D换成复数形式就行的。注意,一个矢量可以转化为复数形式,两个矢量做…

6.4 数据处理架构模式和实践

6.4 数据处理架构模式和实践 目录概述需求: 设计思路实现思路分析1.批处理架构2.实时处理架构3.流处理架构4.微服务架构(重点)5.数据湖架构6.数据仓库架构 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , s…

Java | Leetcode Java题解之第452题用最少数量的箭引爆气球

题目&#xff1a; 题解&#xff1a; class Solution {public int findMinArrowShots(int[][] points) {if (points.length 0) {return 0;}Arrays.sort(points, new Comparator<int[]>() {public int compare(int[] point1, int[] point2) {if (point1[1] > point2[1…

微软官网列出了 Windows 11 LTSC 2024 中的全部新功能

今天早些时候&#xff0c;微软发布了有关受托管PC的Windows 11 24H2 升级和兼容性的详细信息。 该帖子针对的是负责在各自办公室和组织中处理系统的 IT 系统管理员。与此同时&#xff0c;微软也发布了有关 Windows 11 LTSC 或长期服务渠道的信息。 该公司已于四月早些时候证实…

yolov10+strongsort的目标跟踪实现

此次yolov10deepsort不论是准确率还是稳定性&#xff0c;再次超越了之前的yolodeepsort系列。 yolov10介绍——实时端到端物体检测 YOLOv10 是清华大学研究人员在 UltralyticsPython 清华大学的研究人员在 YOLOv10软件包的基础上&#xff0c;引入了一种新的实时目标检测…

Java 异常一口气讲完!(_ _)。゜zzZ

Java 异常处理 Java面向对象设计 - Java异常处理 异常是在没有定义正常执行路径时在Java程序的执行期间可能出现的条件。 Java通过将执行操作的代码与处理错误的代码分离来处理错误。 当发生异常时&#xff0c;Java会创建一个包含有关异常的所有信息的对象&#xff0c;并将其…

HTML增加文本复制模块(使用户快速复制内容到剪贴板)

增加复制模块主要是为了方便用户快速复制内容到剪贴板&#xff0c;通常在需要提供文本信息可以便捷复制的网页设计或应用程序中常见。以下是为文本内容添加复制按钮的一个简单实现步骤&#xff1a; HTML结构&#xff1a; 在文本旁边添加一个复制按钮&#xff0c;例如 <butto…

蘑菇分类检测数据集 21类蘑菇 8800张 带标注 voc yolo

蘑菇分类检测数据集 21类蘑菇 8800张 带标注 v 蘑菇分类检测数据集 21类蘑菇 8800张 带标注 voc yolo 蘑菇分类检测数据集介绍 数据集名称 蘑菇分类检测数据集 (Mushroom Classification and Detection Dataset) 数据集概述 该数据集专为训练和评估基于YOLO系列目标检测模型…

管理方法(12)-- 采购管理

采购人员不是在为公司讨价还价,而是在为顾客讨价还价,我们应该为顾客争取最低的价钱。-----山姆 沃尔顿 沃尔玛的创始人。 1. 采购的定义和原则 5R原则:适时(Right Time)、适质(Right Quality)、适量(Right Quantity)、适价(Right Price)、适地(Right Place)。…

Linux -- 文件系统(文件在磁盘中的存储)

目录 前言&#xff1a; 了解机械磁盘 初始盘片与磁头 盘片是怎么存数据的呢&#xff1f; 详解盘片 如何访问磁盘中的一个扇区呢&#xff1f; -- CHS 定位法 磁盘的逻辑存储 LBA&#xff08;Logical Block Addressing --- 逻辑块寻址&#xff09; 如何将 LBA 地址转换为…

C++ | Leetcode C++题解之第455题分发饼干

题目&#xff1a; 题解&#xff1a; class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int m g.size(), n s.size();int count 0;for (int i 0, j 0; i < …

js中各种时间日期格式之间的转换

前言&#xff1a;近几天在做百度地图时,需要转换时间格式并做显示,下面这篇文章主要给大家介绍了关于js中各种时间格式的转换方法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下 &#x1f308;&#x1f308;文章目录 先来认识 js 的时间格式有哪些&#xf…

CSS3旋转、平移、缩放、倾斜

CSS3平移、缩放、倾斜、旋转 前言 下面代码用到了盒子如下&#xff1a; 使用 一、平移translate() 语法&#xff1a;translate(x轴平移距离, y轴平移距离) 使用方式如下&#xff1a; /* x轴平移200px&#xff0c;y轴平移100px */ transform: translate(200px, 100px);二、…

JavaWeb——Vue组件库Element(5/6):案例:组件实现(概述、Form表单、Table表格、Pagination 分页、效果展示、完整代码)

目录 概述 Form表单 Table表格 Pagination 分页 效果展示 完整代码 概述 在刚才制作出来的页面当中&#xff0c;上面项目的名称已制作好&#xff0c;左侧的菜单栏也已配置好。 接下来主要处理的是右侧主展示区域当中的组件编写。 在右侧的主展示区域&#xff0c;主要有…

【C++】多肽

目录 一 多肽定义 1. 多肽的构成条件 1 例一 2 例二 2. 虚函数 3. 虚函数重写的两个意外 1 协变 2 析构函数的重写 二 关键字override 和 final 1. final 2.override 三 三重对比 1. 练习 四 多肽的原理 1. 多肽调用和普通调用 2.虚函数表 3. 分析 4. 原理 …