幂等问题解决

news2024/11/27 6:18:27

什么是幂等性?

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

在数学中,主要有两个定义

如果在一元运算中,x 为某集合中的任意数,如果满足 f(f(x))=f(x),那么该 f 运算具有幂等性,比如绝对值运算就是幂等性函数。

如果在二元运算中,x 为某集合中的任意数,如果满足 f(x,x)=x,前提是 f 运算的两个参数均为 x,那么我们称 f
运算也有幂等性,比如求大值函数就是幂等性函数。

在编程领域里,幂等操作的特点是

其任意多次执行所产生的影响均与一次执行的影响相同。

业务上理解幂等性不仅仅只是一次或多次操作对资源产生相同影响,还包括第一次操作产生影响后,以后多次操作不会再产生影响。举例:服务端会进行重试等操作或客户端有可能会进行多次点击提交。如果这样请求多次的话,那最终处理的数据结果就一定要保证统一,如支付场景或者下单。此时就需要通过保证业务幂等性。

幂等的维度

  • 时域唯一性

定义幂等的有效期。有些业务需要永久性保证幂等,如下单、支付等。而部分业务只要保证一段时间幂等即可。

  • 空域唯一性

定义了幂等的范围,如生成订单的话,不允许出现重复下单。 一次操作=服务方法+传入的业务数据

HTTP协议语义幂等性

http1.1文档:https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

在这里插入图片描述

在HTTP/1.1中,对幂等性进行了定义。它描述了一次和多次请求某一个资源对于资源本身应该具有同样的结果(错误或网络超时问题除外)。也就是其任意多次执行对资源本身所产生的影响均与一次执行的影响相同。

从这边可以看出GET、HEAD、PUT、DELETE是幂等的,POST、PATCH是非幂等的。

为什么出现幂等性问题

在接口调用时一般情况下都能正常返回信息不会重复提交,不过在遇见以下情况时可以就会出现问题:

  1. 前端重复提交表单:用户在点击一些按钮时,很多时候会因网络波动没有及时对用户做出提交成功响应,致使用户一直点提交按钮,这时就会发生重复提交表单请求。或者用户进行恶意刷单,导致接口接收到重复提交的请求。
  2. 接口超时重复提交:很多时候 HTTP客户端工具都默认开启超时重试的机制,尤其是第三方调用接口时候,为了防止网络波动超时等造成的请求失败,都会添加重试机制,导致一个请求提交多次。
  3. 消息进行重复消费: 当使用 MQ 消息中间件时候,如果发生消息中间件出现错误未及时提交消费信息,导致发生重复消费。

方案一:数据库主键或唯一索引

数据库主键的实现主要是利用数据库中主键唯一约束的特性,一般来说唯一主键比较适用于“插入”时的幂等性,其能保证一张表中只能存在一条带该唯一主键的记录。

使用数据库唯一主键完成幂等性时需要注意的是,该主键一并不是使用数据库中自增主键,而是使用分布式 ID 充当主键,这样才能能保证在分布式环境下 ID 的全局唯一性。

或者使用唯一索引,避免脏数据,无法插入重复数据,保证数据唯一性。

适用于插入、删除操作

方案二:数据库乐观锁

数据库乐观锁不仅可以用来当分布式锁,也可以用来幂等处理。

用法就是对应的数据表中加入version字段,每次查询时将其查出,每次更新时先判断version是否还是之前查出的值,如果是的话,就进行操作;否则,不进行操作。

适用于更新操作。

方案三:防重 Token 令牌

简单的说就是调用方在调用接口的时候先向后端请求一个全局 ID(Token),请求的时候携带这个全局 ID 一起请求(Token 最好将其放到 Headers 中),后端需要将这个 Token 作为 Key,用户信息作为 Value 到 Redis 中进行键值内容校验,如果 Key 存在且 Value 匹配就执行删除命令,然后正常执行后面的业务逻辑。如果不存在对应的 Key 或 Value 不匹配就返回重复执行的错误信息,这样来保证幂等操作。

适用于插入、更新、删除操作

在这里插入图片描述

方案四:上游服务传唯一的分布式ID

在这里插入图片描述
上游服务传一个分布式唯一ID,在调用下游服务接口时,带上这个唯一ID。

下游服务接收到ID后,使用redis的setnx指令,设置对应的超时时间,将ID作为key传入,:

如果执行成功,说明不是重复请求,可以进行执行;

如果执行失败,说明是重复请求,直接返回。

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

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

相关文章

软件质量测试笔记-合工大

第一章 软件质量和测试背景 应从以下几个方面考虑软件质量: 软件结构功能与性能开发标准与文档 IEEE关于软件质量的定义: 系统,部件,过程满足规定需求的程度系统,部件,过程满足顾客或者用户需要的期望程…

vue css变量实现多主题皮肤切换

实现方式 多主题皮肤切换有很多种实现方式,可以用css预处理器实现,可以用js实现,其实最近简单的一种方式是用css变量(css variable)实现 单页面应用中,可以通过设置body的css变量爱控制整个系统的颜色,body添加一个属…

chatgpt赋能python:Python中的绝对值函数简介

Python中的绝对值函数简介 绝对值是数学中一个基本的概念,在Python中也有相应的函数来实现求绝对值,本文将为大家介绍Python中的绝对值函数及其使用方法。 什么是绝对值 绝对值是一个数的大小,与数本身的符号无关。即如果一个数为正数&…

chatgpt赋能python:自动填写在SEO中的作用

自动填写在SEO中的作用 在SEO中,关键词的密度是非常重要的一项指标。然而,如果手动填写关键词,不仅费时费力,还很容易出现错误。这时候,一款自动填写工具就能够提高效率,减少出错率,从而提高网…

chatgpt赋能python:Python生成Pyd文件的全面指南

Python生成Pyd文件的全面指南 介绍 在Python编程中,我们会发现在某些情况下需要使用C或其他高效语言来提高代码执行速度。在这种情况下,将Python和其他语言混合编程是一个不错的选择。 本指南将介绍如何使用Python生成Python定义的C扩展程序文件 (.py…

[论文分享] jTrans: Jump-Aware Transformer for Binary Code Similarity

jTrans: Jump-Aware Transformer for Binary Code Similarity [ISSTA 2022] 二进制代码相似性检测(Binary code similarity detection, BCSD)在漏洞检测、软件构件分析、逆向工程等领域具有重要应用。最近的研究表明,深度神经网络(DNNs)可以理解二进制代码的指令或…

Solidity基础四

あなたもきっと、誰かの奇跡 (你也一定会是某个人的奇迹) 目录 一、Solidity的结构体 1.结构体的实例化 2.结构体的基本使用 访问和修改结构体成员 3.结构体的修饰符 二、Solidity的映射 1.映射的基本使用 查询和修改某个value值 三、Solidit…

Jmeter下载安装---Windows系统

Jmeter下载安装---Windows系统 jmeter是什么Jmeter下载安装安装jmeter前置必须jdk8Jmeter下载 jmeter插件环境变量配置 jmeter是什么 Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做压力测试;在接口及性能测试中广泛使用&…

如何使用JQuery实现Js二级联动和三级联动

前言:使用JQuery封装好的js方法来实现二级三级联动要比直接使用js来实现二级三级联动要简洁很多。所以说JQuery是个非常强大的、简单易用的、兼容性好的JavaScript库,已经成为前端开发人员不可缺少的一部分,是Web开发中最流行的JavaScript库之…

《Spring Guides系列学习》guide61 - guide65

要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gui…

mybatisplus递归传递多个参数 | mybatisplus传递多个参数获取层级数据 | mybatisplus传递多个参数获取树形数据

搜索关键字: mybatisplus关联查询传递参数|"select""树形结构"|"select""树形结构""传参"| "select""many""传参"| "select""column""传参" 1、…

chatgpt赋能python:用Python自动操作其他软件优化你的SEO

用Python自动操作其他软件优化你的SEO 作为一名有着10年Python编程经验的工程师,我了解到Python具有强大的自动化功能,可以帮助我们自动化执行任务,节省时间和精力。其中,自动操作其他软件应用案例极为常见,如此&…

C#自定义控件:提示未将对象引用设置到对象实例

一、概述 1、当自定义的控件在添加的时候提示:提示未将对象引用设置到对象实例;如下所示: 2、添加上的自定义控件提示:未将对象引用设置到对象实例;如下所示: 二、问题分析 分析1: 在项目中使…

关于“烫烫烫烫烫烫烫”的程序员笑话

环境 Microsoft Visual Studio Community 2022Windows 11 家庭中文版 笑话 小明在超市买了3瓶汽水,他先打开第0瓶汽水,咕咚咕咚喝光了,接着打开第1瓶汽水,又咕咚咕咚喝光了,然后又打开第2瓶汽水,咕咚咕咚…

运维实用脚本整理

运维实用脚本整理 Linux运维日常巡检脚本系统指标巡检脚本日常命令性能相关的命令进程相关的命令javadump.sh 常用工具一键部署安装常用lib库安装系统检查脚本SPN 日常巡查脚本ffmpeg脚本打开进程,并判断进程数量关闭进程 java jar包启动-剔除Pom中依赖Java jar包通…

SAP QM 检验批上的‘容器数’

近期遇到一个问题。项目上质量部门发现某个原料批次收货打印出来的样品标签数不对。经查发现收货后触发的检验批上的‘容器数’(No.Containers)为999,实际上此次收货的箱数有1500多。 对于栏位‘容器数’,SAP的官方帮助文档&#…

指针 --- C语言

目录 1.指针是什么 2.指针和指针类型 3.野指针 4.指针运算 5.指针和数组 6.二级指针 7.指针数组 1.指针是什么 为了更好地管理内存,把内存分为了1个个小小的内存单元,大小是一个字节,每个字节给一个编号,内存的编号就是地…

《Spring Guides系列学习》guide56 - guide60

要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gu…

Entity Framework Core 简明教程(3)- 关系处理

在数据库层面,表之间关系,通过主键、外键来实现,基于约束 (constraint) 和数据完整性来制约。 在 EF Core 技术层面,并不是简单地与数据库这些关系和约束对应,EF Core 有它自己的机制。本篇介绍 EF core 在处理表关系方…

HTML+CSS实训——Day03——仿网易云音乐的发现页界面

仓库链接:https://github.com/MengFanjun020906/HTML_SX 一些今天需要用到的知识点 弹性盒子 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedg…