iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >高并发下的接口如何保证幂等性
  • 873
分享到

高并发下的接口如何保证幂等性

2023-07-26 17:07:50 873人浏览 独家记忆
摘要

一、背景我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。例如:前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果。我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也

一、背景

我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。

例如:

  1. 前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果。

  2. 我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也应该只扣一次钱;

  3. 发送消息,也应该只发一次,同样的短信发给用户,用户会哭的;

  4. 创建业务订单,一次业务请求只能创建一个,创建多个就会出大问题。

等等很多重要的情况,这些逻辑都需要幂等的特性来支持。

二、幂等性概念

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

编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。

这些函数不会影响系统状态,也不用担心重复执行会对系统造成改变。例如,“getUsername()和setTrue()”函数就是一个幂等函数.

更复杂的操作幂等保证是利用唯一交易号(流水号)实现.

我的理解:幂等就是一个操作,不论执行多少次,产生的效果和返回的结果都是一样的

三、技术方案

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

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

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

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

4. token机制,防止页面重复提交

业务要求:

页面的数据只能被点击提交一次

发生原因:由于重复点击或者网络重发,或者Nginx重发等情况会导致数据被重复提交

解决办法:集群环境:采用token加Redis(redis单线程的,处理需要排队) 单JVM环境:采用token加redis或token加jvm内存

处理流程:

  1. 数据提交前要向服务的申请token,token放到redis或jvm内存,token有效时间

  2. 提交后后台校验token,同时删除token,生成新的token返回

token特点:

要申请,一次有效性,可以限流

注意:redis要用删除操作来判断token,删除成功代表token校验通过,如果用select+delete来校验token,存在并发问题,不建议使用

5. 悲观锁 获取数据的时候加获取

select * from table_xxx where id='xxx' for update;

注意:id字段一定是主键或者唯一索引,不然是锁表,会死人的

悲观锁使用时一般伴随事务一起使用,数据锁定时间可能会很长,根据实际情况选用

6. 乐观锁 乐观锁只是在更新数据那一刻锁表,其他时间不锁表,所以相对于悲观锁,效率更高。

乐观锁的实现方式多种多样可以通过version或者其他状态条件:

1、通过版本号实现

update table_xxx set name=#name#,version=version+1 where version=#version#
登录后复制

--结束END--

本文标题: 高并发下的接口如何保证幂等性

本文链接: https://www.lsjlt.com/news/364375.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 高并发下的接口如何保证幂等性
    一、背景我们实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果。例如:前端重复提交选中的数据,应该后台只产生对应这个数据的一个反应结果。我们发起一笔付款请求,应该只扣用户账户一次钱,当遇到网络重发或系统bug重发,也...
    99+
    2023-07-26
  • 怎么保证接口的幂等性
    本篇内容介绍了“怎么保证接口的幂等性”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言不知道你有没有遇到过...
    99+
    2024-04-02
  • java怎么保证接口的幂等性
    在Java中,可以通过以下几种方式来保证接口的幂等性:1. 使用唯一标识符:在每次请求中,为每个操作生成一个唯一的标识符(例如UUI...
    99+
    2023-08-17
    java
  • 如何理解接口幂等性
    本篇内容主要讲解“如何理解接口幂等性”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解接口幂等性”吧!什么是接口幂等性首先看看幂等性的概念:幂等性原本是数学...
    99+
    2024-04-02
  • 关于消息队列如何保证消息的幂等性
    目录什么是幂等性什么是消息的幂等性为什么会出现消息幂等性问题该如何解决消息幂等性问题在分布式系统中,消息队列是一个常用的组件,用于解耦发送者和接收者之间的耦合。在消息队列中,保证消息...
    99+
    2023-05-18
    消息队列 消息队列 幂等性
  • java分布式面试接口如何保证幂等及概念理解
    目录引言1、幂等的概念问题分析:事后问题分析:关于这个接口的幂等设计深入分析:2、工作中常见的幂等设计场景3、幂等接口常见设计方案总结引言 稳定性设计第一篇:这一小节开始讲设计系统稳...
    99+
    2024-04-02
  • 如何保证Redis的高并发
    小编给大家分享一下如何保证Redis的高并发,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!  单机的redis几乎不太可能说QPS超过10万+,一般在几万。  除非一些特殊情况,比如你的机器性...
    99+
    2024-04-02
  • 从架构思维角度分析高并发下幂等性解决方案
    目录1 背景2 幂等性概念3 幂等性问题的常见解决方案 3.1 查询操作和删除操作3.2 使用唯一索引 或者唯一组合索引3.3 token机制3.4 悲观锁3.5 乐观锁...
    99+
    2024-04-02
  • Python 接口 api 并发:如何提高并行性能?
    在现代软件开发中,API 已经成为了必不可少的一部分。然而,对于高流量的应用程序来说,API 的性能往往是一个瓶颈。这时候,我们就需要使用并发来提高 API 的性能。 Python 是一种流行的编程语言,它提供了多种并发技术来提高程序的性...
    99+
    2023-07-19
    接口 api 并发
  • 高并发如何保证数据安全
    高并发保证数据安全的方法:在java中我们可以使用 setnx 的原子性来实现分布式锁保证数据唯一性。尽量让HTML静态化。将图片与页面进行分离。使用缓存、镜像、负载均衡的方法。需要使用数据库集群或者库表散列。...
    99+
    2024-04-02
  • 高并发怎么保证数据的准确性
    高并发保证数据准确性的方法:在DB层开启事务,然后select 一行for update给这一行加上排它锁,再去更新行,然后提交,其他事务就会阻塞在select for update。在业务层面乐观锁CAS,使用版本号解决ABA问题,实际使...
    99+
    2024-04-02
  • java如何提高接口的并发
    Java提高接口的并发性能可以通过以下几种方式: 使用线程池:通过使用线程池来管理并发请求,可以有效控制并发数量,避免资源耗尽和...
    99+
    2024-04-03
    java
  • PHP打包的同时如何保证并发性?
    PHP是一种广泛使用的编程语言,用于开发各种类型的应用程序。在开发过程中,打包是一个必不可少的步骤。打包可以将多个文件或目录压缩成一个单独的文件,以便在不同的环境中进行部署。但是,在打包的同时保证并发性也是一个关键问题,因为在高并发环境下,...
    99+
    2023-07-27
    打包 并发 面试
  • 如何使用 Laravel 打包 PHP 接口并确保接口安全性?
    Laravel 是一个流行的 PHP 框架,它提供了很多强大的工具和功能,使得我们可以轻松地构建和管理我们的 PHP 应用程序。在本文中,我们将讨论如何使用 Laravel 打包 PHP 接口,并确保接口的安全性。我们将通过演示代码来说明这...
    99+
    2023-11-14
    laravel 接口 打包
  • Java 接口重定向和 JavaScript:如何保证兼容性?
    在开发网站或应用程序时,我们经常会使用 Java 和 JavaScript。这两种语言都是非常强大的工具,但在某些情况下,它们可能会出现兼容性问题。其中一个问题是 Java 接口重定向和 JavaScript 的兼容性问题。在本文中,我们...
    99+
    2023-07-10
    接口 重定向 javascript
  • 高并发下Redis如何保持数据一致性(避免读后写)
    “读后写” 通常意义上我们说读后写是指针对同一个数据的先读后写,且写入的值依赖于读取的值。 关于这个定义要拆成两部分来看,一:同一个数据;二:写依赖于读。(记...
    99+
    2024-04-02
  • 如何使用 Python 接口 api 实现高并发?
    在当今互联网时代,高并发已经成为了一种常见的现象。许多网站或者应用程序需要面对大量的请求,而如何保证系统的稳定性和可靠性,成为了一项重要的任务。本文将介绍如何使用 Python 接口 api 实现高并发,帮助你提高系统的性能和响应速度。 一...
    99+
    2023-07-19
    接口 api 并发
  • Unix 系统下的 Java 开发,如何保证代码同步性?
    在 Unix 系统下进行 Java 开发,代码同步性是一个非常重要的问题。代码同步性指的是多个开发者在同一个代码库中同时开发时,如何保证每个人的代码更改都能够被其他开发者及时地获取到,并且不会出现冲突。本文将介绍几种常用的方式来保证代码同...
    99+
    2023-10-31
    npm unix 同步
  • 如何在 PHP 和 Django 中优化接口性能,实现高并发?
    随着互联网的快速发展,越来越多的网站和应用需要处理大量的并发请求。为了确保用户的体验和网站的稳定性,我们需要优化接口性能,实现高并发。在本文中,我们将介绍如何在 PHP 和 Django 中优化接口性能,实现高并发。 PHP 中优化接口...
    99+
    2023-06-13
    django 并发 接口
  • 总结高并发下Nginx性能如何优化
    目录特点优势安装和命令配置文件代理模式和配置反向代理正向代理(forward proxy) :反向代理(reverse proxy)︰透明代理∶动静分离日志管理日志格式日志切割高并发...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作