当前位置: 首页 > news >正文

幂等性及技术解决方案

文章目录

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

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

相关文章:

幂等性及技术解决方案

文章目录 定义幂等性 为什么需要幂等性幂等性设计注意事项幂等性的范围分布式锁解决幂等性 设计 延伸阅读 定义幂等性 简单地说,我们可以多次执行幂等运算而不改变结果或者使用相同的输入参数中被调用多次,则不具有额外效果的操作,也就是多…...

正向代理 反向代理

正向代理 正向代理是一种网络服务,它作为客户端和目标服务器之间的中间人,代表客户端向目标服务器发送请求并接收响应。以下是关于正向代理的详细解释: 工作原理 客户端配置: 客户端(如浏览器)配置为使用…...

【分布式微服务云原生】如何在ActiveMQ中优雅处理提前支付的延时订单

摘要 本文将深入探讨在ActiveMQ中如何处理用户提前支付的延时订单问题。我们将介绍如何通过更新订单状态、检查延迟任务、取消延迟消息、使用死信队列、消息选择性消费、设置合理的超时时间以及及时反馈和日志记录等策略,来确保系统的一致性和及时响应用户操作。文…...

Easy Excel从入门到精通!!!

目录 1.文件导入 1.1基本方式读取excel文件内容 1.2注解模型映射器读取excel 1.3多行表头读取 1.4文件上传读取 2.文件导出 2.1基本方式导出 2.2模型映射导出 2.3设置行高、列宽等内容 2.4合并单元格 2.5导出设置超链接、批注、公式 2.6模板填充对象导出 2.7模板填…...

简易CPU设计入门:取指令(三),ip_buf与rd_en的非阻塞赋值

在开篇,还是请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 下载本项目代码 准备好了项目源代码以后&…...

【算法】---归并排序(递归非递归实现)

参考 左程云算法 算法导论 前言 本篇介绍 归并排序分治法 前置知识 了解递归, 了解数组。 引入 归并排序 归并排序最早是由公认的现代计算机之父John von Neumann发明的, 这是一种典型的分治思想应用。 我们先介绍分治思想 分治思想 分治思想的…...

UniVue大版本更新:UniVue2.0.0-preview

大版本发布说明 距离上次更新好像已经过去很久了,最近太忙了没时间维护新版本,也是自己在使用的过程中发现了很多问题也有了更多的灵感,由于和之前的版本区别太大,决定重新开一个大版本。这个UniVue2之后的版本追求是性能&#xf…...

RabbbitMQ篇(环境搭建 - 下载 安装)(持续更新迭代)

目录 一、Windows 1. 下载安装程序 2. 安装配置erlang 3. 安装rabbitMQ 4. 验证 二、Linux 1. 下载rpm包 1.1. 下载Erlang的rpm包 1.2. 下载socat的rpm包 1.3. 下载RabbitMQ的rpm包 2. 安装 2.1. 安装Erlang 2.2. 安装socat 2.3. 安装RabbitMQ 3. 启动RabbitMQ服…...

C++基础补充(02)C++其他控制语句break continue goto等

文章目录 1. break2. continue 语句3. goto 语句goto的存在 4. 跳出多重循环4.1 goto 直接跳转4.2 C11及其后版本的 return 语句4.3 使用标志变量 在C中,控制语句用于管理程序的执行流程。常见有 break、continue 和 goto。 1. break break语句主要用于在循环或者s…...

决策树中联合概率分布公式解释说明

学习决策树时书本中有一公式 7-3 是: P ( X x i , Y y j ) p i j ( i 1 , 2 , … , m , j 1 , 2 , … , n ) P(X x_i, Y y_j) p_{ij} \quad (i 1, 2, \dots, m, \ j 1, 2, \dots, n) P(Xxi​,Yyj​)pij​(i1,2,…,m, j1,2,…,n) 这个公式表示的是随机变…...

计算机毕业设计 农场投入品运营管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…...

php email功能实现:详细步骤与配置技巧?

php email发送功能详细教程?如何使用php email服务? 无论是用户注册、密码重置,还是订单确认,电子邮件都是与用户沟通的重要手段。AokSend将详细介绍如何实现php email功能,并提供一些配置技巧,帮助你更好…...

MapBox Android版开发 6 关于Logo

MapBox Android版开发 6 关于Logo Logo的显示查看源码及思路(Logo)第一步第二步 隐藏Logo示例查看源码及思路(Info)第一步第二步 隐藏Logo和Info示例 看到有网友留言问如何移除Logo,今天看了下V9源码,发现M…...

2024年房市

24年8月15日,国家统计局公布,“7月末,商品房待售面积73926万平方米”。(原文链接:https://www.stats.gov.cn/sj/zxfb/202408/t20240815_1955982.html)   7.39亿平方存量商品房,估价均价1万每平,总价约&am…...

index索引

index索引: create index 【1】on 【2】(【3】) 1为索引名,通常为id_表名_列名。2为表名。3为列名。 CREATE INDEX id_account_id ON account(id); -- 根据id创建索引 CREATE INDEX id_account_idname on account(id,name); -- 创建组合索引 索…...

理解互联网链路:从本地ISP到Tier 1 ISP运营商

1. 互联网服务提供商(ISP) 互联网服务提供商(ISP)是指提供互联网接入服务的公司或组织。它们负责将用户连接到互联网,并提供相关的服务,如电子邮件、网站托管和其他在线服务。ISP可以分为不同的层级&#…...

基于元神操作系统实现NTFS文件操作(三)

1. 背景 本文主要介绍DBR的读取和解析,并提供了基于元神操作系统的实现代码。由于解析DBR的目的是定位到NTFS磁盘分区的元文件$Root进行文件操作,所以只解析了少量的部分,其它部分可以参考相关文档进行理解。 DBR存在于磁盘分区的第一个扇区…...

深度学习与数学归纳法

最近发现,深度学习可以分为两个主要的阶段,分别是前向推理以及反向传播,分别对应着网络的推理和参数训练两个步骤。其中推理有时候也称为归纳推理。 在做参数训练的时候,本质上是在利用历史数据求网络参数的先验分布; …...

《Linux从小白到高手》理论篇(六):Linux软件安装一篇通

List item 本篇介绍Linux软件安装相关的操作命令,看完本文,有关Linux软件安装相关操作的常用命令你就掌握了99%了。 Linux软件安装 RPM RPM软件的安装、删除、更新只有root权限才能使用;查询功能任何用户都可以操作;如果普通用…...

【Spring】运行Spring Boot项目,请求响应流程分析以及404和500报错

1. 运行项目 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Appl…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...