解决幂等问题

news2024/11/19 2:47:33

1.概述

作为开发人员,我们每天都要开发大量的接口,其中包括了读接口和写接口,而对于写接口来说,除了要保证他的性能、可用性以外,还需要有一个重要的问题,那就是考虑如何保证接口的幂等性。
“幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。 这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。”

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

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

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

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

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

2.如何保证幂等

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

但是,这个方案存在一个关键性的问题,那就是在高并发场景中,是可能会有幂等击穿的。
在这里插入图片描述
所以,想要解决好这个问题,需要做好并发控制,那么,做并发控制,大家首先想到的就是锁,没错。就是要用锁。

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

3.一锁、二判、三更新

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

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

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

三更新:第三步,进行数据的更新,将数据进行持久化。
在这里插入图片描述
三步需要严格控制顺序,确保加锁成功后进行数据查询和判断,幂等性判断通过后再更新,更新结束后释放锁。

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

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

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

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

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

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

相关文章

mysql数据库连接失败授权认证 reading authorization packet --别的电脑可以,但是本地电脑连接失败

1.分析原因是否由于本机多次失败连接导致 在能连接的主机上或者服务器上 查看当前数据库阻断连接次数是否在不断增长 SHOW GLOBAL STATUS LIKE Aborted_connects;1.2观察这个终端连接次数是否一直在增长 如果一直在增长,说明mysql服务器被计算机不断的进行连接且被…

安科瑞针对HVDC方案推出的解决方案介绍

​安科瑞虞佳豪 摘 要:近年来,随着数据中心的迅猛发展,数据中心的能耗问题也越来越突出,有关数据中心的能源管理和供配电设计已经成为热门问题,合理可靠的数据中心配电系统方案,是提高数据中心电能使用效率…

数据结构与算法05:跳表和散列表

目录 【跳表】 跳表的实现原理 如何确定跳表的层高? 【散列表】 散列函数的设计 散列冲突 (1)开放寻址法(Open Addressing) (2)链表法(chaining) 装载因子 如何…

如何把两个视频拼接在一起?这些工具太棒了!

如何把两个视频拼接在一起?对于自媒体行业的人来讲,平时在进行短视频的剪辑时,总会需要合并多个视频,之后再剪辑处理。不过对于大部分没有从事自媒体行业的人来讲,可能对合并视频并不了解。下面我就来给大家分享可以拼…

paddleclas pp-shitu v1/v2

null集开放数据、开源算法、免费算力三位一体,为开发者提供高效学习和开发环境、高价值高奖金竞赛项目,支撑高校老师轻松实现AI教学,并助力开发者学习交流,加速落地AI业务场景https://aistudio.baidu.com/aistudio/projectdetail/…

BlackIce病毒分析

概述 blackice是一个古老的感染型病毒,可感染系统中exe、doc和xls文件,通过USB设备和网络驱动器来传播,会向C&C下载pe执行,会关闭常用的杀软进程。下面找了一个样本,这个样本的代码结构清晰,用IDA pro…

客服配置-shopro

客服配置 注意事项 shopro客服系统 采用 workerman 的 gateway-worker 作为服务基础,请先安装 gateway-worker 扩展包shopro商城 已不再支持 workerman 在线客服插件 安装部署 安装扩展包 composer require workerman/gateway-worker:~3.0 删除禁用函数(如有未列…

Postman中加url环境变量和token全局变量

环境变量引用 语法:{{变量名}} 环境变量分类 1. 全局变量:全局有效,在Postman中的任何集合中都可以使用该变量,作用域最大。 2. 环境变量:要申明环境变量,先要创建环境,然后在该环境中创建变…

KPI考核对企业能起到什么作用?公司该如何建立标准化

什么是KPI考核 KPI考核是指对企业或组织的关键绩效指标进行量化的评估和监控,以了解其业务目标的实现情况。 KPI(Key Performance Indicators)是指关键绩效指标,是衡量企业或组织成功的基本指标。对KPI进行考核可以帮助企业或组织…

破解极域(4):万能密码法(可以获取到原密码)

破解极域(4):万能密码法 1.思路2.实现2.1 获得密码2.2 解除控制2.3 特别注意 3.视频展示 今天来分享下破解极域的第4种方法——万能密码法 1.思路 首先,我们要知道的是,极域这个东西它有一个万能密码,万能…

网络安全+自学笔记

学前感言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了.2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发.3.有时多 google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答.4.遇到实在搞不懂的,可以先放放,以后再来解决. 基…

[GUET-CTF2019]number_game[数独]

目录 题目 学到的知识点: 题目 在buu上看到了一道数独题,没见过,记录一下 下载附件,查壳,无壳,在IDA中打开,直接找到主函数 unsigned __int64 __fastcall main(int a1, char **a2, char **a3…

您的监控策略是否可扩展?

家公司都在努力更好地了解其运营效率,但他们都遇到了同样的问题:规模。那么,可扩展的监控策略是什么样的?您如何防范可观察性中最重要的问题? 什么是可扩展监控策略? 我们将从确定受规模影响最大的两件事…

生态系统NPP及碳源、碳汇模拟、土地利用变化、未来气候变化、空间动态模拟实践技术应用

由于全球变暖、大气中温室气体浓度逐年增加等问题的出现,“双碳”行动特别是碳中和已经在世界范围形成广泛影响。碳中和可以从碳排放(碳源)和碳固定(碳汇)这两个侧面来理解。陆地生态系统在全球碳循环过程中有着重要作…

SpringBootWeb---分层解耦

3. 分层解耦 3.1 三层架构 3.1.1 介绍 在我们进行程序设计以及程序开发时,尽可能让每一个接口、类、方法的职责更单一些(单一职责原则)。 单一职责原则:一个类或一个方法,就只做一件事情,只管一块功能。…

前端网络、JavaScript优化以及开发小技巧

一、网络优化 YSlow有23条规则,中文可以参考这里。这几十条规则最主要是在做消除或减少不必要的网络延迟,将需要传输的数据压缩至最少。 1)合并压缩CSS、JavaScript、图片,静态资源CDN缓存 通过构建工具Gulp,可以在…

PDPS教程:机器人工作站导出为JT格式文件操作方法

目录 功能简介 功能注意事项 导出JT格式文件操作 导出JT格式文件查看 功能简介 PDPS软件不仅能够从外部导入JT格式的模型文件,还能够将创建好的机器人工作站/生产线导出为JT格式的模型文件。这个能够导出JT格式文件的功能就是“Export JT”命令。 使用“Expor…

零尽其用,尾随不落——探究力扣题目“移除字符串中的尾随零”的解题思路

本篇博客会讲解力扣“2710. 移除字符串中的尾随零”的解题思路,这是题目链接。 先来审题: 以下是示例: 以下是提示: 本题的思路是: 先遍历字符串,找到字符串末尾的\0。从\0开始,向前遍历&a…

如何写一篇让人挑不出毛病的产品需求文档?

需求”这个词是产品经理工作中的常客,产品需求文档也贯穿于整个产品经理的日常工作中,本周小编将通过什么是产品需求文档,产品需求文档的作用、如何写好产品需求文档等方面分享如何写出一篇让你挑不出毛病的PRD,让需求文档助力产品…

30分钟开发微信小程序并部署

30分钟开发微信小程序并部署 首先,今天我们会使用到腾讯为我们提供的云平台来协助我们小程序的开发和部署。 环境准备: 微信开发者账号(自己在微信公众号平台注册一个账号):https://mp.weixin.qq.com/,同时…