解决幂等问题,只需要记住这个口诀!

news2025/1/10 15:41:48

△Hollis, 一个对Coding有着独特追求的人△

96335dba0cf9cf06477c8a88dabfd652.jpeg

这是Hollis的第 417 篇原创分享

作者 l Hollis

来源 l Hollis(ID:hollischuang)

88a79e796d82396adc58e8febabc856c.png

作为开发人员,我们每天都要开发大量的接口,其中包括了读接口和写接口,而对于写接口来说,除了要保证他的性能、可用性以外,还需要有一个重要的问题,那就是考虑如何保证接口的幂等性。

幂等性

什么是幂等性?

"幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。 这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。"

以上是百度百科中的回答,总结起来就是一句话:一个接口,不管我调多少次,只要参数不变,结果也应该不变。

但是,实际在工作中,谈到幂等性,一般分为两种,即请求幂等业务幂等

请求幂等:每次请求,如果参数一样,结果也要一样。

业务幂等:同一次业务请求,在拿到最终状态之后的每次请求,结果要保证一样。在没拿到最终状态之前,每一次请求需要正常执行业务逻辑,直到推进到最终状态。

一般来说,我们谈到的幂等性,大部分都是业务幂等。比如,一次支付请求,如果支付返回处理中,或者系统异常等,我们需要重试,继续调用,直到他明确的返回支付成功,或者明确的无法成功的支付失败结果。

如何保证幂等

想要保证幂等性,最简单的做法就是:在做业务操作之前,先查一下,判断下本次操作是否有被执行过,如果执行过,则不再执行,否则继续执行。

但是,这个方案存在一个关键性的问题,那就是在高并发场景中,是可能会有幂等击穿的。

149822fa3d4e76ab78d90f801408aa87.jpeg

所以,想要解决好这个问题,需要做好并发控制,那么,做并发控制,大家首先想到的就是锁,没错。就是要用锁。

那么,解决幂等问题,请记住这个口诀:”一锁、二判、三更新”

一锁、二判、三更新

“一锁、二判、三更新”,只要严格遵守这个过程,那么就可以解决并发问题。

一锁:第一步,先加锁。可以加分布式锁、或者悲观锁都可以。但是一定要是一个互斥锁!


二判:第二步,进行幂等性判断。可以基于状态机、流水表、唯一性索引等等进行重复操作的判断。


三更新:第三步,进行数据的更新,将数据进行持久化。

968ee259fd82e3afc38a0ac853551282.jpeg

三步需要严格控制顺序,确保加锁成功后进行数据查询和判断,幂等性判断通过后再更新,更新结束后释放锁。

以上操作需要有一个前提,那就是第一步加锁、和第二步判断的时候,需要有一个依据,这个就是幂等号了,通常需要和上游约定一个唯一ID作为幂等号。然后通过对幂等号加锁,再通过幂等号进行幂等判断即可。

一锁这个过程,建议使用Redis实现分布式锁,因为他是非阻塞的高效率的互斥锁。非常适合在幂等控制场景中。

二判这个过程,如果有操作流水,建议基于操作流水做幂等,并将幂等号作为唯一性约束,确保唯一性。如果没有流水,那么基于状态机也是可以的。

但是不管怎么样,数据库的唯一性约束都要加好,这是系统的最后一道防线。万一前面的锁失效了,这里也能控制得住不会产生脏数据。

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

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

相关文章

将矩阵按指定对角线转化为一个上三角矩阵numpy.triu()方法

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将矩阵按指定对角线转化为一个上三角矩阵 numpy.triu() 选择题 关于以下代码说法错误的一项是? import numpy as np a np.array([[1,2],[3,4]]) print("【显示】a\n",a) print(&…

应用程序和 API 攻击呈上升趋势

Akamai Technologies 发布了一份新的互联网现状报告,标题为“突破安全漏洞:针对组织的应用程序和 API 攻击的兴起”。 报告显示,亚太地区和日本(APJ)的金融服务业仍然是该地区受攻击最严重的行业,Web 应用…

大模型推理性能优化之KV Cache解读

0. 引言 做大模型性能优化的一定对KV Cache不陌生,那么我们对这个技术了解到什么程度呢?请尝试回答如下问题: KV Cache节省了Self-Attention层中哪部分的计算?KV Cache对MLP层的计算量有影响吗?KV Cache对block间的数据…

知识点滴 - 什么是膳食结构

膳食结构是指膳食中各类食物的数量及其在膳食中所占的比重,由于影响膳食结构的这些因素是在逐渐变化的,所以膳食结构不是一成不变的,人们可以通过均衡调节各类食物所占的比重,充分利用食品中的各种营养,达到膳食平衡&a…

适配器模式:代码接口的神奇转换

一、概要 适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口,使得原本由于接⼝不兼容⽽不能⼀起⼯作的那些类可以⼀起⼯作。通俗来讲,就是通过适配器来连接两个不…

Js 如何实现一个类似 chatGPT 打字机效果

在使用chatGPT的时候,会有一个打字机的效果,以下是分别使用原生Js和Vue实现 原生 JS 实现 如下是示例代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Printer 打字机效果</title><style>* {margin: 0;bor…

记录--使用率比较低的10个Web API

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 avaScript中有些API可能使用率比较低&#xff0c;下面我们逐一介绍它们的用法和使用场景。 至于标题&#xff0c;主要是想让你进来看看&#xff0c;兄弟们别打我&#xff01; Blob API Blob API 用于处…

电脑技巧:CopyQ剪切板增强工具介绍(附下载)

目录 1、软件简介 2、主要功能介绍 3、使用说明 4、总结 今天给大家再分享一款剪切板增强工具——CopyQ&#xff0c;感兴趣的朋友可以下载试一试&#xff01; 1、软件简介 CopyQ 是一款开源的、跨平台剪贴板管理工具&#xff0c;支持 Windows、macOS、Linux&#xff0c;可…

项目中遇到的一些问题总结(十)

nacos保护阈值 Nacos 中的保护阈值&#xff08;Protection Threshold&#xff09;是用来保护服务实例的一种机制。当某个服务实例出现故障或异常时&#xff0c;服务注册中心 Nacos 会通过心跳检测等方式将其从服务列表中移除&#xff0c;以避免客户端继续向其发送请求。但是&a…

在Linux中为Simulink添加ROS自定义消息类型

在Linux中为Simulink添加ROS自定义消息类型 基于Matlab/Simulink的ROS自定义消息类型的添加方法 ROS与Simulink联合仿真(三):自定义Message 1、下载 ROS Toolbox Interface for ROS Custom Messages 将 roscustommsg.mlpkginstall 文件放入 MATLAB 工作空间 双击 roscustommsg…

Nature -- 人类首个 “泛基因组”旨在编目人类遗传多样性

在人类基因组项目发布第一个人类基因组草图的20多年后,研究人员发布了人类“泛基因组”草图——这预示着一种新的参考基因组的出现,它能捕获到更多的人类遗传多样性信息。 泛基因组变异图由两个元素组成:序列图&#xff0c;其ode表示定向DNA链&#xff0c;双向边表示连通性关系…

学系统集成项目管理工程师(中项)系列25_计算机网络知识

1. OSI七层协议 1.1. 物理层 1.1.1. RS232、V.35、RJ-45、FDDI 1.2. 数据链路层 1.2.1. 【21上选17】 1.2.2. IEEE802.3/.2、HDLC、PPP、ATM 1.3. 网络层 1.3.1. IP、ICMP、IGMP、IPX、ARP 1.3.2. 路由选择 1.3.2.1. 【20下选17】 1.4. 传输层 1.4.1. TCP、UDP、SPX…

越小越好: Q8-Chat,在英特尔至强 CPU 上体验高效的生成式 AI

大语言模型 (LLM) 正在席卷整个机器学习世界。得益于其 transformer 架构&#xff0c;LLM 拥有从大量非结构化数据 (如文本、图像、视频或音频) 中学习的不可思议的能力。它们在 多种任务类型 上表现非常出色&#xff0c;无论是文本分类之类的抽取任务 (extractive task) 还是文…

又一批令人惊艳的 AI 工具,诞生了!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 自 ChatGPT 发布以后&#xff0c;AIGC 行业的热度也一直在持续发酵。几个月过去了&#xff0c;对比之前&#xff0c;各类 AI 工具的热度不减反增&#xff0c;各行各业的人都早开始拥抱 AIG…

SAP工具箱 MR22自定义BAPI

点击蓝字 关注我们 一 前言 标准事务代码MR22 通过调整金额影响物料的成本价,前台界面中单个凭证中允许输入多行物料, 但是对应的BAPI函数仅支持输入单行物料 BAPI_MATVAL_DEBIT_CREDIT 正常库存BAPI_SALESORDSTCK_DEBIT_CREDIT 销售订单库存 这种情况 婶可忍叔不可忍 (感谢用户…

Python 闭包装饰器和多任务--闭包,装饰器,进程,线程

1.闭包案例 在函数嵌套的前提下&#xff0c;内部函数使用了外部函数的变量&#xff0c;并且外部函数返回了内部函数&#xff0c;我们把这个使用外部函数变量的内部函数称为闭包. 外层函数: config_name(),外层函数中的变量是 name 内层函数: inner(),inner()使用了外层函数的变…

34从零开始学Java之构造方法都有哪些特性?

作者&#xff1a;孙玉昌&#xff0c;昵称【一一哥】&#xff0c;另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前面的几篇文章中&#xff0c;壹哥给大家介绍了不少关于方法的内容&#xff0c;这些内容是我们日常…

zabbix监控之javasnmp自定义监控

1、客户端开启 java jmxremote 远程监控功能 上传 tomcat 软件包到 /opt 目录中 cd /opt tar zxvf apache-tomcat-9.0.16.tar.gz mv apache-tomcat-9.0.16 /usr/local/tomcat #配置 java jmxremote 远程监控功能 vim /usr/local/tomcat/bin/catalina.sh ...... #位置在 cygw…

嵌入式音视频开发面试过程遇到的问题!

前言&#xff1a; 今天继续给大家分享音视频面试过程会被常问到的一些问题&#xff01; 面试的具体题目&#xff1a; 1、说一下播放器的设计过程&#xff1a; 这里的话主要分以下几步完成&#xff1a; 开启一个线程进行解封装操作 , 这包括&#xff1a;读取音频、视频的压缩数据…

chatgpt赋能Python-python_ps图片

Python PS图片的SEO指南 Python在数字图像处理中广泛应用。其中&#xff0c;Photoshop文件&#xff08;psd&#xff09;是一种常见的图像文件格式。但是&#xff0c;如何在搜索引擎上优化Python PS图片并提高其排名仍然是一个挑战。 什么是Python PS图片&#xff1f; Python…