当前位置: 首页 > news >正文

分布式系统接口,如何避免重复提交

分布式系统接口,如何避免重复提交

    • 1、基于Token的幂等设计
      • 原理
      • 实现步骤
      • 技术选型
    • 2、基于Token的幂等设计
      • 原理
      • 实现步骤
      • 适用场景
    • 3、幂等性设计
      • 原理
      • 实现方式
    • 4、分布式锁
      • 原理
      • 实现方式
      • 适用场景
    • 5、请求去重
      • 原理
      • 实现方式
    • 6.前端防护
      • 原理
      • 实现方式
      • 适用场景
    • 7.延迟队列
      • 原理
      • 实现方式

在分布式系统中,
避免表单重复提交是一项重要的任务,
尤其是在处理涉及资金交易、订单创建等敏感业务时。
以下是一些常见的解决方案:

1、基于Token的幂等设计

原理

  • 在接口请求前,服务器生成一个唯一的 Token(可以是 UUID 或其他唯一标识),并将其下发到客户端。

  • 客户端在请求接口时携带该 Token,服务器校验该 Token 是否已经使用。

     a.如果已使用,则拒绝重复请求。b.如果未使用,则处理请求并将 Token 标记为已使用。
    

实现步骤

  • 生成 Token

     a.在用户访问接口时,生成一个唯一的 Token,存储到 Redis 或数据库中,并返回给客户端。
    
  • 校验 Token

     a.接口请求时,服务器接收到 Token,与存储的 Token 对比,确保 Token 的唯一性。
    
  • 标识 Token

     a.请求处理完成后,立即将 Token 标记为已使用,避免再次使用。
    

技术选型

  • 使用 Redis 可以高效处理 Token
  • 可以为 Token 设置 TTL(如 5 分钟),避免长时间占用资源。

2、基于Token的幂等设计

原理

  • 针对业务中存在唯一性约束的字段(如订单编号、交易流水号),在数据库中添加唯一索引。
  • 即使分布式系统中有重复的请求,由于唯一索引的存在,数据库会拒绝重复写入。

实现步骤

  1. 客户端生成一个唯一的业务编号(如订单编号)。
  2. 服务端在数据库写入时,依赖唯一约束来防止重复提交。
  3. 如果数据库插入失败(因唯一约束),则返回错误提示。

适用场景

  • 适用于有明确唯一性标识的业务场景,例如订单号、交易号等。

3、幂等性设计

原理

  • 确保请求的接口是幂等的,即多个提交的结果一致
  • 常用手段包括状态机和更新操作。

实现方式

  1. 状态机
  2. 更新操作

4、分布式锁

原理

  • 针对同一用户或同一操作,使用分布式锁来限制并发请求的处理。

实现方式

  1. 获取锁

    a.使用 Redis 或 Zookeeper 创建分布式锁。锁的 Key 可以是用户 ID 或业务 ID。
    
  2. 处理请求

    a.如果获取到锁,则处理请求;如果未获取到锁,则直接返回错误提示。
    
  3. 释放锁

    a.请求处理完成后,释放分布式锁。
    

适用场景

  • 避免高并发场景下的重复提交。

5、请求去重

原理

  • 对于每个请求,计算唯一的签名(如 MD5 或 SHA256),用于标识请求内容。
  • 服务端根据签名判断请求是否已处理。

实现方式

1. 生成签名

a. 基于接口字段内容生成签名,如:
String signature = MD5Utils.generateSignature("接口参数");

2. 存储签名

a. 服务端存储签名,一般是放在 Redis 里边

3. 校验签名

a. 适用于接口内容较复杂且需要精确去重的场景。

6.前端防护

原理

  • 利用前端技术手段,减少重复提交的可能性。

实现方式

1.按钮防重复点击:

  • 在用户提交表单后,立即禁用提交按钮,避免多次点击。
  • 示例:
document.getElementById("submit").disabled = true;

2.表单防回退提交:

  • 提交成功后,清空或销毁表单数据。

适用场景

  • 适用于用户误操作导致的重复提交,但无法解决恶意重复提交。

7.延迟队列

原理

  • 将接口提交请求放入消息队列中进行处理,系统只接受队列中的唯一消息。

实现方式

1、消息入队

  • 接口提交时,将请求放入消息队列(如 Kafka、RabbitMQ)。

2、消息去重

  • 在消息处理阶段,服务端检查消息 ID 是否已处理。

3、延迟处理

  • 设置延迟队列,确保请求在短时间内不会重复处理。

相关文章:

分布式系统接口,如何避免重复提交

分布式系统接口,如何避免重复提交 1、基于Token的幂等设计原理实现步骤技术选型 2、基于Token的幂等设计原理实现步骤适用场景 3、幂等性设计原理实现方式 4、分布式锁原理实现方式适用场景 5、请求去重原理实现方式 6.前端防护原理实现方式适用场景 7.延迟队列原理…...

AI 声音:数字音频、语音识别、TTS 简介与使用示例

在现代 AI 技术的推动下,声音处理领域取得了巨大进展。从语音识别(ASR)到文本转语音(TTS),再到个性化声音克隆,这些技术已经深入到我们的日常生活中:语音助手、自动字幕生成、语音导…...

【论文速读】| 人工智能驱动的网络威胁情报自动化

基本信息 原文标题:AI-Driven Cyber Threat Intelligence Automation 原文作者:Shrit Shah, Fatemeh Khoda Parast 作者单位:加拿大圭尔夫大学计算机科学学院 关键词:网络威胁情报,AI自动化,攻击技术和…...

什么是域名监控?

域名监控是持续跟踪全球域名系统(DNS)中变化以发现恶意活动迹象的过程。组织可以对其拥有的域名进行监控,以判断是否有威胁行为者试图入侵其网络。他们还可以对客户的域名使用这种技术以执行类似的检查。 你可以将域名监控比作跟踪与自己实物…...

vue3 发送 axios 请求时没有接受到响应数据

<script setup> import Edit from ./components/Edit.vue import axios from axios import { onMounted,ref } from vue// TODO: 列表渲染 //装数据的列表 const list ref([]) const count ref(0) const getList async () > {//通过发送 /list 请求从后端拿到列表数…...

前端使用fontfaceobserver库实现字体设置

要使用FontFaceObserver来加载设置项目本地的字体&#xff0c;先确保字体文件位于项目中或者可以从服务端获取到&#xff0c;这样就可以使用FontFaceObserver来检测并加载这些字体 主要有以下几步&#xff1a; npm或者yarn安装引入fontfaceobserver字体资源引入和font-face配置…...

【人工智能】Python常用库-PyTorch常用方法教程

PyTorch 是一个强大的开源深度学习框架&#xff0c;以其灵活性和动态计算图而广受欢迎。以下是 PyTorch 的详细教程&#xff0c;涵盖从基础到实际应用的使用方法。 1. 安装与导入 1.1 安装 PyTorch 访问 PyTorch 官方网站&#xff0c;根据系统、Python 版本和 CUDA 支持选择安…...

Android Studio安装TalkX AI编程助手

文章目录 TalkX简介编程场景 TalkX安装TalkX编程使用ai编程助手相关文章 TalkX简介 TalkX是一款将OpenAI的GPT 3.5/4模型集成到IDE的AI编程插件。它免费提供特定场景的AI编程指导&#xff0c;帮助开发人员提高工作效率约38%&#xff0c;甚至在解决编程问题的效率上提升超过2倍…...

#渗透测试#红蓝攻防#HW#漏洞挖掘#漏洞复现02-永恒之蓝漏洞

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

gitlab自动打包python项目

现在新版的gitlab可以不用自己配置runner什么的了 直接写.gitlab-ci.yml文件就行&#xff0c;这里给出一个简单的依靠setup把python项目打包成whl文件的方法 首先写.gitlab-ci.yml文件&#xff0c;放到项目根目录里 stages: # List of stages for jobs, and their or…...

残差神经网络

目录 1. 梯度消失问题 2. 残差学习的引入 3. 跳跃连接&#xff08;Shortcut Connections&#xff09; 4. 恒等映射与维度匹配 5. 反向传播与梯度流 6. 网络深度与性能 总结 残差神经网络的原理是基于“残差学习”的概念&#xff0c;它旨在解决深度神经网络训练中的梯度消…...

mini-spring源码分析

IOC模块 关键解释 beanFactory&#xff1a;beanFactory是一个hashMap, key为beanName, Value为 beanDefination beanDefination: BeanDefinitionRegistry&#xff0c;BeanDefinition注册表接口&#xff0c;定义注册BeanDefinition的方法 beanReference&#xff1a;增加Bean…...

黑马程序员Java项目实战《苍穹外卖》Day01

苍穹外卖-day01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示&#xff1a; ​ 管理端-外卖商家使用 ​ 用户端-点餐用户使用 当我们完成该项目的学习&#xff0c;可以培养以下能力&#xff1a; 1. 软件开发整体介绍 作为一…...

uniapp开发支付宝小程序自定义tabbar样式异常

解决方案&#xff1a; 这个问题应该是支付宝基础库的问题&#xff0c;除了依赖于官方更新之外&#xff0c;开发者可以利用《自定义 tabBar》曲线救国 也就是创建一个空内容的自定义tabBar&#xff0c;这样即使 tabBar 被渲染出来&#xff0c;但从视觉上也不会有问题 1.官方文…...

python+django5.1+docker实现CICD自动化部署springboot 项目前后端分离vue-element

一、开发环境搭建和配置 # channels是一个用于在Django中实现WebSocket、HTTP/2和其他异步协议的库。 pip install channels#channels-redis是一个用于在Django Channels中使用Redis作为后台存储的库。它可以用于处理#WebSocket连接的持久化和消息传递。 pip install channels…...

python代码示例(读取excel文件,自动播放音频)

目录 python 操作excel 表结构 安装第三方库 代码 自动播放音频 介绍 安装第三方库 代码 python 操作excel 表结构 求出100班同学的平均分 安装第三方库 因为这里的表结构是.xlsx文件,需要使用openpyxl库 如果是.xls格式文件,需要使用xlrd库 pip install openpyxl /…...

【第十课】Rust并发编程(一)

目录 前言 Fork和Join 前言 本节会介绍Rust中的并发编程&#xff0c;并发编程在编程中是提升cpu使用率的一大利器&#xff0c;通过多线程技术提升效率&#xff0c;Rust的并发和其他编程语言的并发不同的地方在于&#xff0c;Rust号称无畏并发。更重要的一点是安全。Rust中所有…...

图形渲染性能优化

variable rate shading conditional render 设置可见性等&#xff0c; 不需要重新build command buffer indirect draw glMultiDraw* - 直接支持多次绘制glMultiDrawIndirect - 间接多次绘制multithreading 多线程录制 实例化渲染 lod texture array 小对象剔除 投影到…...

elasticsearch的索引模版使用方法

5 索引模版⭐️⭐️⭐️⭐️⭐️ 索引模板就是创建索引时要遵循的模板规则索引模板仅对新创建的索引有效&#xff0c;已经创建的索引并不受索引模板的影响 5.1 索引模版的基本使用 1.查看所有的索引模板 GET 10.0.0.91:9200/_index_template2.创建自定义索引模板 xixi &…...

论文学习——进化动态约束多目标优化:测试集和算法

论文题目&#xff1a;Evolutionary Dynamic Constrained Multiobjective Optimization: Test Suite and Algorithm 进化动态约束多目标优化&#xff1a;测试集和算法&#xff08;Guoyu Chen ,YinanGuo , Member, IEEE, Yong Wang , Senior Member, IEEE, Jing Liang , Senior …...

C++中的volatile关键字

作用&#xff1a; 1.它用于修饰变量&#xff0c;告知编译器该变量的值可能会在程序的外部被改变&#xff0c;编译器不能对这个变量的访问进行优化。这是因为编译器通常会对代码进行优化&#xff0c;例如把变量的值缓存到寄存器中&#xff0c;但对于 volatile 变量&#xff0c;…...

linux桌面qt应用程序UI自动化实现之dogtail

1. 前言 Dogtail适用于Linux 系统上进行 GUI 自动化测试,利用 Accessibility 技术与桌面程序通信;Dogtail 包含一个名为 sniff 的组件,这是一个嗅探器,用于 GUI 程序追踪; 源码下载:​​dogtail PyPI 可通过sudo python setup.py install安装或sudo pip install dogt…...

Hello World C#

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System; 引入了System命名空间&#xff0c;基本输入输出。一般只用这个&#xff0c;后面的不用 using System.Collections.Generic; 包含了定…...

SAP开发语言ABAP开发入门

1. 了解ABAP开发环境和基础知识 - ABAP简介 - ABAP&#xff08;Advanced Business Application Programming&#xff09;是SAP系统中的编程语言&#xff0c;主要用于开发企业级的业务应用程序&#xff0c;如财务、物流、人力资源等模块的定制开发。 - 开发环境搭建 - 首先需…...

应急响应靶机——easy溯源

载入虚拟机&#xff0c;开启虚拟机&#xff1a; &#xff08;账户密码&#xff1a;zgsfsys/zgsfsys&#xff09; 解题程序.exe是额外下载解压得到的&#xff1a; 1. 攻击者内网跳板机IP地址 2. 攻击者服务器地址 3. 存在漏洞的服务(提示:7个字符) 4. 攻击者留下的flag(格式…...

【前端】vscode报错: 无法加载文件 D:\nodejs\node_global\yarn.ps1,因为在此系统上禁止运行脚本。

vscode运行前端代码时候&#xff0c;执行yarn install时候报错 问题&#xff1a; 无法加载文件 D:\nodejs\node_global\yarn.ps1&#xff0c;因为在此系统上禁止运行脚本。 解决方式&#xff1a; 首先用管理员身份运行vscode 查看 get-ExecutionPolicy&#xff0c;Restrict…...

Spring Web MVC(详解中)

文章目录 Spring MVC&#xff08;中&#xff09;RESTFul风格设计RESTFul风格概述RESTFul风格特点RESTFul风格设计规范RESTFul风格好处RESTFul风格实战需求分析RESTFul风格接口设计后台接口实现 基于RESTFul风格练习&#xff08;前后端分离模式&#xff09;案例功能和接口分析功…...

Flutter:encrypt插件 AES加密处理

1、pubspec.yaml导入插件 cupertino_icons: ^1.0.8 # 密码加密 encrypt: 5.0.3encrypt封装 import package:encrypt/encrypt.dart; /// 加密类 class EncryptUtil {static final EncryptUtil _instance EncryptUtil._internal();factory EncryptUtil() > _instance;Encrypt…...

Python bytes类型及用法

在Python中&#xff0c;bytes类型是一种不可变的字节序列&#xff0c;用于存储原始的二进制数据。bytes对象通常用于处理文件、网络通信和其他需要处理原始字节数据的场景。 以下是bytes类型的一些基本用法和特性&#xff1a; 1. 创建bytes对象 可以通过多种方式创建bytes对…...

阅读《基于蒙特卡洛法的破片打击无人机易损性分析》_笔记

目录 基本信息 1 引言 1.1 主要研究内容 1.2 研究必要性&#xff08;为什么要研究&#xff09; 1.3 该领域研究现状&#xff08;别人做了什么/怎么做的&#xff09; 2 主要研究过程&#xff08;我们做了什么&#xff09; 2.1 建立目标仿真模型 2.2 确定毁伤依据 2.3 无…...

充值网站分销站怎么做/长尾关键词爱站网

2019独角兽企业重金招聘Python工程师标准>>> 首先&#xff0c;你的电脑要支持curl&#xff0c;只需找到php.ini配置文件&#xff0c;将";extensionphp_curl.dll"前面的分号去掉并重启apache或iis&#xff1b; test.php文件&#xff1a; <?php $ch cu…...

怎么查询网站的域名/南通百度网站快速优化

一、商品模块数据库&代码工具准备 1.数据库准备&#xff1a; 2.中导入工具类&#xff1a; 二、商品品牌 - 后端实现 1.集成模板生成代码 - 配置query和controller - 具体可看项目源码 // 调整 query 生成目录演示 focList.add(new FileOutConfig("/templates/query…...

品牌商城网站开发/常见的推广方式

本期重点&#xff1a;1.Smart Filter的优势以及使用方法2.Smart Filter被当做普通筛选器来使用的情况在给老板汇报工作的时候总会接到各种各样的可视化报告需求&#xff0c;还要求操作起来简单明了&#xff0c;我们只好见招拆招的去实现和接近老板想要的效果。考虑以下场景&…...

宝鸡网站建设公司/网站策划

https://blog.csdn.net/Cjx_9421/article/details/86708609...

软件开发的工资/丽水百度seo

前言 今天主要讲一下JQ中的异步编程&#xff0c;它将ajax进行封装&#xff0c;在进行异步请求时显得非常容易&#xff0c;无论是GET&#xff0c;POST方式&#xff0c;还是text,xml,javascript,json等数据通讯都是那么的自然 现在&#xff0c;我们就走入jq的ajax的殿堂吧。 GET请…...

wordpress 图片链接下载/腾讯广告投放推广平台价格

模板介绍 本套质感微立体年终汇报PPT模板,模板编号&#xff1a;P25758&#xff0c;大小10MB,共27页,比例为16:9,由封面、目录、转场页、内容、结尾5个部分构成。 内含青色,橙色,蓝色多种配色&#xff0c;精美小清新,微立体,酷炫,另类,文艺风格设计&#xff0c;动态播放效果&am…...