分布式:浅谈幂等

server/2024/10/18 8:27:23/

幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。

在编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“getUsername()和 setTrue()”函数就是一个幂等函数。简言之:幂等就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的。

一、幂等有哪些技术解决方案

1、查询操作

查询一次和查询多次,在数据不变的情况下,查询结果是一样的。select 是天然的幂等操作。

2、删除操作

删除操作也是幂等的,删除一次和多次删除都是把数据删除。注意:可能返回结果不一样,删除的数据不存在,返回 0,删除的数据多条,返回结果多个。

3、唯一索引

防止新增脏数据。比如:支付宝的资金账户,支付宝也有用户账户,每个用户只能有一个资金账户,怎么防止给用户创建多个资金账户,那么给资金账户表中的用户 ID 加唯一索引,所以一个用户新增成功一个资金账户记录。

要点:唯一索引或唯一组合索引来防止新增数据存在脏数据(当表存在唯一索引,并发时新增报错时,再查询一次就可以了,数据应该已经存在了,返回结果即可。

4、token 机制

防止页面重复提交。

业务要求:页面的数据只能被点击提交一次;
发生原因:由于重复点击或者网络重发,或者 nginx 重发等情况会导致数据被重复提交;
解决办法:
(1)集群环境,采用 token 加 redis(redis 单线程的,处理需要排队);
(2)单JVM环境,采用 token 加redis或token加 jvm 锁。

处理流程:
(1)提交前,向服务申请 token,token 放到 redis 或 jvm 内存,token设置有效时间;
(2)提交后,后台校验 token,同时删除 token,生成新的 token 返回。

token 特点:要申请,一次有效性,可以限流。
注意:redis 要用删除操作来判断 token,删除成功代表 token 校验通过。

5、 TraceId

操作时TraceId是唯一的。

二、对外提供的API如何保证幂等

举例说明: 银联提供的付款接口,为了支持幂等调用,需要接入商户提交付款请求时附带source 来源,seq 序列号。source+seq 在数据库里面做做联合唯一索引,这样当第三方调用时,先在本方系统里面查询一下,是否已经处理过,返回相应处理结果;没有处理过,进行相应处理,返回结果。

注意,为了幂等友好,一定要先查询一下,是否处理过该笔业务,不查询直接插入业务系统,会报错,因为实际已经处理。


http://www.ppmy.cn/server/109692.html

相关文章

Apache CloudStack Official Document 翻译节选(十二)

快速部署一朵 Apache CloudStack 云 (一) 部署前的准备工作 Apache CloudStack快速部署指南 我们究竟在构建什么? 构建IAAS云是一件很复杂的事项,根据相关定义,构建IAAS云的可选项有很多。这些纷繁复杂的概念通常给…

Java笔试面试题AI答之面向对象(8)

文章目录 43. 解释Java接口隔离原则和单一原则如何理解 ?单一职责原则(Single Responsibility Principle, SRP)接口隔离原则(Interface Segregation Principle, ISP) 44. Java 有没有 goto? 如果有,一般用…

OpenHarmony轻量设备Hi3861芯片开发板启动流程分析

引言 OpenHarmony作为一款万物互联的操作系统,覆盖了从嵌入式实时物联网操作系统到移动操作系统的全覆盖,其中内核包括LiteOS-M,LiteOS-A和Linux。LiteOS-M内核是面向IoT领域构建的轻量级物联网操作系统内核,主要面向没有MMU的处理器&#x…

大麦演唱会门票

切勿再令您所爱的人耗费高昂的价格去购置黄牛票 ⚠️核心内容参考: 据悉,于购票环节,大麦凭借恶意流量清洗技术,于网络层实时甄别并阻拦凭借自动化手段发起下单请求的流量,强化对刷票脚本、刷票软件以及虚拟设备的识别能力&#…

使用 nuxi build-module 命令构建 Nuxt 模块

title: 使用 nuxi build-module 命令构建 Nuxt 模块 date: 2024/8/31 updated: 2024/8/31 author: cmdragon excerpt: nuxi build-module 命令是构建 Nuxt 模块的核心工具,它将你的模块打包成适合生产环境的格式。通过使用 --stub 选项,你可以在开发过程中加快模块构建速度…

在element-plus的Dialog组件中使用el-loading效果

最近遇到一个需求&#xff0c;在页面中有个组件&#xff0c;子组件由el-dialog包裹&#xff0c;希望展示隐藏el-dialog时有加载动画&#xff0c;加载动画用的是v-loading。 //父组件 <template><tabs v-model"tabsVisible"/> </template> <scr…

获取服务器时间

由于客户端时间和服务器端时间不一致&#xff0c;需要将一个项目产品统一改成获取服务器时间&#xff0c;于是写了个全局方法来替换new Date() 1.创建一个getSystemTime文件注册为全局事件&#xff0c; let nowTime let flag true let IntervalAdd null function getSys…

这个项目所需的配置文件和依赖

这是用于记录这个项目的依赖,中间出现了很多版本问题,这是最后解决出来的版本 配置文件 spring:datasource:url: jdbc:mysql://localhost:3306/vueadmin?useUnicodetrue&characterEncodingutf-8&serverTimezoneUTCusername: rootpassword: Qq702196driver-c…