保证接口幂等性的多种实现方式(数据库方案)

1. 幂等性的概念

        接口幂等性是指在软件工程和Web服务领域中,一个接口(通常是HTTP API)无论被调用一次还是多次,其对系统产生的副作用应该是相同的,即结果保持一致,不会因为多次请求而有所不同。换句话说,多次执行同一操作应当产生与执行一次相同的效果,不会额外改变系统的状态。

2. 幂等性的核心价值

确保数据一致性:在存在网络延迟或不稳定的情况下,请求可能被重复发送。幂等性确保即使请求多次到达服务器,也不会导致多次创建资源、多次扣除账户余额等错误,从而维护了数据的一致性和完整性。

简化错误处理:客户端可以更简单地处理请求失败的情况,只需重试即可,无需复杂的逻辑来判断是否需要重试或如何处理潜在的副作用。

提升用户体验:用户操作(如点击支付按钮)因网络问题或误操作导致的重复提交,不会引起多次扣款等不良后果,增强了用户对系统的信任感。

3. 幂等性与HTTP方法

请求类型安全性与幂等性描述
GET安全且幂等用于获取资源,多次请求应返回相同的结果
PUT不安全但幂等用于替换整个资源。无论PUT操作执行多少次,资源最终状态都是一样的,即被最后的请求体内容所替换
POST不安全且不幂等用于创建新的资源,多次调用可能会创建多个资源
DELETE不安全但幂等重复提交,删除一个已经不存在的资源,不会改变系统状态

        其中POST是非幂等的,因为它用于创建新的资源,多次调用可能会创建多个不同的资源。但在某些设计中,如果POST请求设计为总是创建相同的结果(基于请求数据和当前系统状态),也可以实现幂等性。

4. 幂等性的应用场景

        幂等性对于保证系统的一致性和可靠性至关重要,尤其是在分布式系统和网络不稳定环境下,它有助于处理如下几种常见场景:

  • 网络重传:在网络不稳定的情况下,请求可能会被重传,幂等性确保重传不会导致多次执行操作,如多次扣款。
  • 用户误操作:用户可能因页面刷新、误点击等原因重复提交请求,幂等性保护用户免受因此导致的数据不一致影响。
  • 用户恶意刷单:比如在抢兑换码、投票这种互动中,可能会有用户会进行恶意的重复发送请求,恶意刷单,使结果不实。
  • 异步消息重复处理:在使用消息队列或事件驱动架构时,消息可能因故障恢复机制被重新投递,幂等性处理可以避免业务逻辑被重复执行

5. 解决方案

保证接口幂等性有多种方法,当前提供数据库方案,如下:

5.1. 数据库唯一索引

这可以算是最简单的方法了,直接在数据库表中的某个关键字段设置唯一索引,下面以订单(order)数据库表为例写一段SQL:

alter table `order` add UNIQUE KEY `t_xxx` (`某个字段`); 

加了唯一索引之后,第一次请求数据可以插入成功。但后面的相同请求,插入数据时会报异常,表示唯一索引有冲突:

Duplicate entry '002' for key 'order.t_code

具体流程图如下:

5.2. 建立防重表

        有同学可能就问了,上面的方案不太合理,因为有时候我们的表中需要一些重复数据,只有一些特殊场景才不需要重复数据,唯一索引方案可能就不合适了。

        这个时候可以试试防重表,简单来说就是我们再单独建立一张表,只需要含有id和想要唯一的索引字段。

具体流程图如下:

5.3. 悲观锁机制

        悲观锁机制可以作为一种手段来帮助解决接口幂等性问题,尤其是在处理高并发场景下对数据的并发修改需求。悲观锁的基本假设是数据在并发访问期间很可能发生冲突,因此在事务开始时就立即锁定所需的数据资源,防止其他事务对其进行修改,直到当前事务结束。

        以下是利用MySQL悲观锁机制解决接口幂等性的基本方案:

1. 使用SELECT ... FOR UPDATE

        在执行更新操作之前,先使用SELECT ... FOR UPDATE语句锁定要修改的行。这会在读取数据的同时加上排他锁(X锁),确保其他事务无法修改这些数据,直到当前事务结束(提交或回滚)。

START TRANSACTION;

SELECT * FROM your_table WHERE id = ? FOR UPDATE;

-- 根据查询结果判断是否需要更新
IF (需要更新) THEN
    UPDATE your_table SET column=value WHERE id = ?;
END IF;

COMMIT;

2. 结合接口幂等性设计

结合上述SQL操作,可以设计一个幂等性接口处理流程:

        大缺点:悲观锁需要在同一个事务操作过程中锁住一行数据,如果事务耗时比较长,会造成大量的请求等待,影响接口性能。

5.4. 乐观锁机制

        悲观锁会增加锁争用的可能性,可能导致事务等待和阻塞,影响系统性能,特别是在高并发场景下。因此,应谨慎使用,乐观锁某些情况下就是个很好的替代方案。

        MySQL乐观锁机制是一种非阻塞的并发控制策略,它假定多线程同时修改数据的概率较低,因此不会在事务一开始就对数据加锁,而是在更新数据时检查数据是否被其他事务修改过。这对于高并发场景下解决接口幂等性问题特别有效,因为它减少了锁的竞争,提高了系统的吞吐量。以下是利用MySQL乐观锁机制解决接口幂等性的方案:

1. 版本字段实现乐观锁

在数据库表中添加一个额外的字段作为版本控制,比如version字段,初始值为1。

CREATE TABLE your_table (
    id INT PRIMARY KEY,
    data VARCHAR(100),
    version INT DEFAULT 1
);

2. 接口调用流程

客户端请求:客户端发出修改数据的请求,请求中包含数据的原始版本号(如果有的话)。

读取数据并附带版本信息:服务端首先查询需要更新的数据,并获取其当前的版本号。

SELECT * FROM your_table WHERE id = ?;

 幂等性检查与更新:在更新数据时,同时在UPDATE语句中加入版本号的条件检查,确保只有当版本号与查询时一致时才执行更新。

   UPDATE your_table 
   SET data = ?, version = version + 1 
   WHERE id = ? AND version = ?;

---(data = ? 是要更新的新数据值。
---version = version + 1 表示更新成功后,版本号递增。
---WHERE id = ? AND version = ? 确保只有当记录的版本号与预期一致时才执行更新。)

④ 结果判断:根据UPDATE语句影响的行数判断是否更新成功。

如果影响行数为1,说明更新成功,且数据没有被其他事务修改过。
如果影响行数为0,说明数据在执行更新前已经被其他事务修改,此时可以根据业务逻辑选择重试或返回错误信息。

具体流程图如下:

今天写到这里,明天再来写token方案哈。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nginx--安装

yum安装 官方包链接:nginx: Linux packages 官方yum源链接:nginx: Linux packages 配置yum源 [rootlocalhost ~]# yum install -y nginx [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gp…

嵌入式学习62-C++

知识零碎: 析构函数语法: ~类名(){} 1.析构函数,没有返回值也不写void 2.析构函数是构造函数的反过程 构造函数 在执行过程中的三个过程…

【C++初阶】string

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿&#x1…

客户端连接ZK失败处理方案

文章目录 背景介绍报错信息处理方案第一步、查看zookeeper启动是否正常第二步、检查本地网络是否正常第三步、检查本地JDK版本 对于zookeeper服务注册中心,在前期【 Dubbo框架注册中心-Zookeeper搭建】博客中有环境搭建部署介绍,感兴趣可以参考安装。 背…

第七天 dfs剪枝优化

第七天 dfs剪枝&优化 1可行性剪枝 2最优性剪枝 3重复性剪枝 题 1 输入 5 5 6 …S. XX.X. …X… …D.X …X… 输出 YES —————————————— 题解 #include<iostream> #include<cstdio> using namespace std; const int N 10; int n,m,T; char …

前端入门:HTML(CSS边距,塌陷)

1.CSS边距 auto:浏览器自动计算的边距 length&#xff1a;以px,pt,cm等为单位指定边距&#xff0c;pt代表的是磅&#xff0c;1磅0.376毫米。 %&#xff1a;以父元素宽度的百分比来指定边距。 其中&#xff0c;length和%都可以取负值&#xff0c;表示减少外边距的空间大小。 …

命令执行。

命令执行 在该项目的readme中&#xff0c;描述了怎么去调用的flink 通过java原生的runtime来调用flink&#xff0c;下一步就是去看看具体的调用过程了&#xff0c;是否存在可控的参数 找到具体提交命令的类方法CommandRpcClinetAdapterImpl#submitJob() 这里要确定command&am…

SAP-ERP TM运输管理模块详解-3

9、定义采购数据结算 事务代码及配置路径&#xff1a; TCODE: SPRO 路径&#xff1a;IMG > 后勤执行 > 运输 > 装运成本 > 结算 > 分配采购数据。详见图9-1。 配置路径截图&#xff1a; 、 如图9-2所示&#xff0c;配置根据计划运输点Z001装运成本类型Z001…

国家强制标准来了!契约锁如何帮您合规签署8项特殊作业票

“作业票”是明确现场施工内容、排查作业风险、落实安全措施的授权许可票&#xff0c;也是现场施工作业安全管理的第一道关口。 近年国家应急管理部组织修订的国家标准《危险化学品企业特殊作业安全规范》&#xff08;GB 30871-2022&#xff09;已将“8大特殊作业票”的部分管理…

【机器学习-19】集成学习---投票法(Voting)

一、引言 集成学习&#xff08;Ensemble Learning&#xff09;是机器学习领域中的一种重要策略&#xff0c;它通过结合多个模型的预测结果来提高整体性能。在单个模型容易过拟合或欠拟合的情况下&#xff0c;集成学习能够通过综合多个模型的优点来减少这种风险&#xff0c;从而…

代码量应该和数据结构的学习深度成比例。

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「数据结构的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; 代码量少&#xff0c;敲个…

2024年水资源保护盛事,“澜湄周”邀请国信华源加入!

4月26日&#xff0c;2024年水资源领域“澜湄周”活动在北京举行。水利部国科司、外交部亚洲司和边海司、湄公河五国驻华使馆以及澜湄水资源合作单位的代表嘉宾出席活动。北京国信华源公司特邀参加&#xff0c;现场就深化澜湄水资源合作展开深入交流研讨。 澜湄六国&#xff0c;…

软件测试用例模板

今天给大家分享下测试用例模板包含哪些内容&#xff1a; 1、测试项&#xff1a;[测试项名称] 2、测试用例标题&#xff1a;[测试用例标题] 3、优先级&#xff1a;[测试用例的优先级&#xff0c;冒烟用例为P0&#xff0c;基础用例P1等] 4、前置条件&#xff1a;[列出执行该测…

LeetCode_(兜兜转转还是你)浪漫的环形链表问题

✨✨所属专栏&#xff1a;LeetCode刷题专栏✨✨ ✨✨作者主页&#xff1a;嶔某✨✨ 第一题&#xff1a; 这道题的代码很简单&#xff0c;但是后续的一些问题在思考的过程是很复杂的。下面我们就一起来分析一下吧&#xff01; 链表带环的意思就是说链表的某个节点的next指针指向…

定位系统源码,工厂人员定位系统源码,UWB高精度定位系统源码

一套java定位系统源码&#xff0c;工厂人员定位系统源码&#xff0c;UWB高精度定位系统源码&#xff0c;前后端分离架构&#xff0c;源码有演示。 工厂人员定位系统&#xff0c;高精度的位置数据作为智能工厂数据流的重要组成部分&#xff0c;可实现对工厂内的人&#xff0c;车…

环状串的字典序

【题目描述】 长度为n的环状串有n种表示法&#xff0c;分别为从某个位置开始顺时针得到。例如&#xff0c;图3-4的环状串有10种表示&#xff1a; CGAGTCAGCT&#xff0c;GAGTCAGCTC&#xff0c;AGTCAGCTCG等。在这些表示法中&#xff0c;字典序最小的称为"最小表示"…

利用GaussDB的可观测性能力构建故障模型

D-SMART高斯专版已经开发了几个月了&#xff0c;目前主要技术问题都已经解决&#xff0c;也能够初步看到大概的面貌了。有朋友问我&#xff0c;GaussDB不已经有了TPOPS了&#xff0c;为什么你们还要开发D-SMART高斯专版呢&#xff1f; 实际上TPOPS和D-SMART虽然都可以用于Gaus…

区块链技术下的DApp与电商:融合创新,开启商业新纪元

区块链技术的蓬勃发展正引领着一种新型应用程序的崛起——去中心化应用程序&#xff08;DApp&#xff09;。DApp并非传统的中心化应用&#xff0c;它构建于去中心化网络之上&#xff0c;融合了智能合约与前端用户界面&#xff0c;为用户提供了全新的交互体验。智能合约&#xf…

01.Kafka简介与基本概念介绍

1 Kafka 简介 Kafka 是最初由 Linkedin公司开发&#xff0c;是一个分布式、支持分区(partition)的、多副本(replica)的&#xff0c;基于 Zookeeper 协调的分布式消息系统&#xff0c;它的最大的特性就是可以实时的处理大量数据以满足各种需求场景&#xff1a;比如基于 hadoop 的…

算法工程师——算法岗的分类及要求汇总

算法岗工程师 根据 Talent Seer 人才报告显示,全球 AI 从业者总人数约有 30 万,还是供不应求,其中 AI 技术专家(具有相关领域博士学位及 3 年以上工作经验的)约有 3.65 万。 简介 对于计算机专业的毕业生而言,算法岗基本上就是 「高薪」 的代名词。 在当今 IT 行业,算…
最新文章