首页 > 其他分享 > 接口幂等性

 接口幂等性

时间:2024-09-18 12:23:22浏览次数:3  
标签:重复 用户 接口 重试 订单 支付 order

什么是幂等性?

 接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。比如:公交车刷卡,用户上车后刷码支付扣款成功,如果用户再次点击按钮刷卡并扣款成功,用户查询余额返发现多扣钱了,流水记录也变成了两条,这就没有保证接口的幂等性。因此,当你重复刷卡时,会提示:刷码重复。


注意:数据库可能产生幂等性问题,但是幂等性问题不只发生在数据库。


什么场景需要幂等设计?

一般对数据要求比较高的场景,如:金钱交易、数据一致性至关重要的业务场景:


在线支付:当用户发起支付请求时,避免重复扣款。

银行交易:确保同一笔交易不会因网络重试等原因被执行多次。

票务系统:在线购票平台在用户购票时,检查所选座位是否已被重复预订。

通信服务:如短信或通话服务,系统会检查是否已为相同内容的请求计费。

任务调度:在定时任务或批处理系统中,确保不会因为任务重启或重试而重复执行相同的操作。

用户注册:防止因重复提交表单而导致用户信息被创建多次。

如何产生幂等问题?

产生幂等性问题的原因主要有:


网络请求重试:网络波动或超时,客户端可能会重复发送相同的请求。

用户界面重复提交:用户在用户界面上可能会不小心重复点击按钮,导致相同的请求被发送多次。

消息队列重试机制:使用消息队列(如Kafka、RabbitMQ)时,消息可能会被重复消费。

数据库并发操作:数据库的插入、更新和删除操作多个事务同时修改同一条记录,而没有使用适当的锁机制或事务隔离级别。

外部系统API接口重试:对外提供的API接口可能由于调用方的重试逻辑,导致数据库操作被重复调用。

其它......

下面我们简单做些案例说明。


表设计(前期准备)

我们先来设计一张订单表并模拟一些数据:


1、表结构:



2、字段说明:

order_id:作为订单的唯一标识,通常是一个全局唯一的ID,如使用UUID或分布式ID生成器(如Snowflake算法)生成。


user_id:标识下单的用户,用于关联用户信息。


product_id:标识被购买的商品,用于关联商品信息。


quantity:购买的商品数量。


order_status:订单当前状态,用于控制订单的业务流程,确保幂等性。例如,只有当订单状态为“待支付”时,支付操作才会被执行。


create_time:记录订单创建的时间戳。


pay_time:记录订单支付的时间戳,如果订单被支付,这个字段会被更新。


version:乐观锁的版本号,每次更新操作都会增加该字段的值,用于检测在业务处理期间订单是否被其他事务更新过。


3、业务规则:

订单支付:在支付操作前,先检查order_status是否为“待支付”,若是,则执行支付逻辑,并更新order_status为“已支付”;如果不是,则拒绝支付,保持订单状态不变。


订单取消:在取消操作前,同样检查order_status,只有订单在特定状态下才允许取消操作。


插入订单:使用order_id作为唯一约束,防止重复插入相同订单。


乐观锁:在更新订单状态时,使用version字段来确保在读取和更新之间没有其他事务更改了订单,如果读取的version和数据库中的version不一致,则拒绝更新。


4、数据状态



标签:重复,用户,接口,重试,订单,支付,order
From: https://blog.51cto.com/u_16270487/12044974

相关文章

  • 一文轻松掌握Kotlin接口与类
    程序员常用的IDEA插件:https://github.com/silently9527/Toolkit接口Kotlin接口定义依旧使用interfaceinterfaceAnimal{funsay()}classDog:Animal{overridefunsay(){println("汪汪...")}}Kotlin使用冒号来替代Java中的extend,implementsKotli......
  • 设计一个高质量的API接口:提升应用性能的关键步骤
    在当今的软件开发世界中,API(应用程序编程接口)接口扮演着至关重要的角色。一个设计精良的API不仅能够提高开发效率,还能提升用户体验,并确保系统的可扩展性和安全性。本文将探讨如何设计一个高质量的API接口,并分析其对现代应用程序的重要性。什么是高质量的API接口?高质量的API接口通常......
  • M:接口耗时很短,页面数据回显慢?
    1、页面卡顿,需要好长一段时间才能加载完成,可能是资源请求过多,再加上请求响应慢的原因。每个浏览器都有资源请求并发数的限制,如何查看请求阻塞情况到前端如何针对该限制进行优化?先看问题:1、设置服务端请求耗时(3S)客户端并发调用20个请求。(预留问题-见下方:20个请求建立多少个TCP......
  • SpringBoot 如何利用异步接口,提高系统吞吐量
    一、前言Servlet3.0之前:每一次Http请求都由一个线程从头到尾处理。Servlet3.0之后,提供了异步处理请求:可以先释放容器分配给请求的线程与相关资源,减轻系统负担,从而增加服务的吞吐量。在springboot应用中,可以有4种方式实现异步接口:AsyncContextCallableWebAsyncTaskDeferredResult......
  • 前端大模型入门:掌握langchain的核心Runnable接口(一)
    在构建复杂的对话式AI应用程序时,Langchain是一个绕不开的工具,它帮助开发人员轻松地处理各种语言模型的集成与管理。v0.3是该框架的一个重要版本,它进一步优化了功能,提升了在JavaScript/TypeScript环境下的易用性。本文将介绍Langchainv0.3的核心功能,并特别着重于其Runnab......
  • 后台上传大文件时提示上传接口错误
    后台上传大文件时提示上传接口错误,通常有以下几个可能的原因:文件大小限制:服务器或框架对上传文件的大小有限制。内存限制:PHP或其他后端语言的内存限制。超时限制:上传大文件时可能会超过默认的执行时间限制。存储空间不足:服务器上的存储空间不足。网络问题:网络不稳定或中断......
  • D10【python接口自动化学习】-python基础之内置数据类型
    day10列表学习日期:20240917学习目标:内置数据类型--列表:如何处理同类数据?学习笔记:列表的定义创建列表#创建列表colours=['red','blue','green']print(colours)#将列表打印出来['red','blue','green']print(type(colours))#<class&#......
  • 【Arthas】记录一次使用Arthas优化接口速度的经历
    1.概述本日有个接口耗时1.2分钟,这个接口本身就是很慢的,但是想看看有没有能优化的地方。这个接口的能力就是获取kafka几个消费组的详情,并且判断是否延迟。这里我们主要使用Arthas的trace命令,使用的命令格式是traceservice实现类方法名称下面是排查过程[arthas@......
  • 微信授权登录接口开发
    微信登陆过程在项目开发中,难免会遇到微信授权登录这一操作,本讲来讲一下微信登陆是如何实现的?关于校验登录,有诸多方法,记录方法如下:使用SpringMVC提供的拦截器网关服务全局过滤器使用AOP面向横切面实现对于使用SpringMVC提供的拦截器来实现,其大致的思路如下:注意:用户......
  • go使用泛型实现接口通用结构体转换
    packagepagemodelimport("gitee.com/leijmdas/gobase/goconfig/common/base/basedto""gitee.com/leijmdas/gobase/goconfig/common/base/baseiface""gitee.com/leijmdas/gobase/goconfig/common/base/jsonutils""......