系统接口幂等性设计探究

news/2024/4/24 21:22:26/

前言:

刚开始工作的时候写了一个带UI页面的工具,需要设计登录功能,登录功能也很简单,输入用户名密码点击登录,触发后台查询并比对密码,如果登录成功则返回消息给前端,前端把消息弹出提示一下。后来发现如果短时间内双击一下登录按钮则会提示两次登录成功,只要手快,点几下就弹出几次登录成功。后来随着工作的时间的增长,知识也开始慢慢积累,发现这种场景就是一个典型的幂等性问题。前面的例子如果多次点登录,提示多次那还没有问题,但是如果后台还要记录一些登录信息,比如登录时间,登录次数…,那没有幂等性判断则会在后台记录多次登录信息。

幂等性是什么

就是用户对于同一操作发起的一次请求或者多次请求结果是一致的,不会因为多次点击而产生了副作用。

目前的解决方案

1、补偿式

我目前所处的团队就是使用的这种方式。由于涉及账务业务,因此涉及很多的充值,而充值一般都会使用各大银行、或者第三方支付(微信、支付宝)和现金。这些银行或者第三方支付平台都会提供对账文件(支付平台的收支)给我们,程序会自动比对系统当天收支与银行(平台)收支情况,如果发现不平衡,分两种情况,一种是补到账,另一种则是拉资金(改用户的帐户余额)。如果发生现金充值因柜员操作不当,双击了充值导致系统多到账,这种一般直接拉资金处理。这种补偿式的方案,虽然存在幂等性问题,但是会保证系统的最终一致性,最终通过纠错的机制来保证幂等。

2、基于TOKEN机制

这种机制也是我了解到的目前各公司的主流操作,例如:用户通过UI界面进行充值,当发起充值后,前台首先会去后台获取token,同时后台记录token信息到存储介质中(数据库、redis、jvm内存等)随后前台携带token去请求后端,后端接收到请求后先比对token,然后处理业务最后删除存储介质中的token信息(删除token的顺序视情况而定)。如果柜员操作不当双击了充值,那么第二次充值携带token到后端,此时后端已经没有了token信息,所以第二次充值不做处理。这样就保证了幂等。

3、前端防重

第三种方式比较简单,比如前言中提到的登录,第一次点击之后,将登录按钮设置为不可用,这样也可以保证幂等,但是这种是不推荐的。因为可以通过抓包的方式直接调用接口发起请求

总结

以上几个是我了解或者说是接触过的几个幂等性解决方案,各有利弊,就补偿式的而言是我最熟悉的,但是我发现几个其中的不足之处和优点:
不足之处:
1、就提到的案例而言,用户感知度比较大,很容易引起投诉。
2、就充值而言,需要第三方平台配合,如果是个人很可能拿不到这种对账的文件。
3、如果没有主键或者其他唯一性约束的表涉及表数据变更的,不容易稽核。

优点:
1、一个字简单,就是完全不考虑嘛,然后通过异步去稽核,不需要引入其他组件或者流程。


http://www.ppmy.cn/news/47000.html

相关文章

面向计算机视觉的深度学习:1~5

原文:Deep Learning for Computer Vision 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如何实…

MVC和MVVM模式的区别

MVVM 和 MVC 都是软件架构模式,其中 MVVM 表示“Model-View-ViewModel”,而 MVC 表示“Model-View-Controller”。 MVC 模式中,控制器(Controller)充当视图(View)和模型(Model&…

C语言中如何判断大小端字节序?

大小端(Endian)是指多字节整数在内存中存储的方式。在计算机中,一个多字节整数由多个字节组成,而不同的机器和处理器在存储多字节整数时会有两种不同存储方式,分别为大端字节序和小端字节序。 以一个4字节整数0x12345…

RHCE第二次作业

一、配置nto时间服务器,确保客户端主机和服务器主机同步时间 1、NTP是网络时间同步协议,就是用来同步网络中各个计算机的时间的协议。 2、NTP服务端配置 (1)检查系统是否安装了NTP包(Linux一般自带NTP4.2)&…

图染色问题的NP完全性证明

文章目录 1.Overview2.CNF 3-sat3. Gadgets3.1 Concolorous Edges3.2 Starter/Variable Gadget3.3 Splitter Gadget3.4 OR Gadget3.5 Clause Gadget 4. To Planar Graph 最近在学 6.890,然后 devans 刚好问了我这个问题,然后尝试编了一个证明。 1.Overv…

【JSP学习笔记】4.JSP 隐式对象及客户端请求

前言 本章介绍JSP的隐式对象及客户端请求。 JSP 隐式对象 JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。 JSP所支持的九大隐式对象: 对象描述requestHttpServletRequest 接…

【C++】模板进阶--非类型模板参数模板特化及分离编译

文章目录 一、非类型模板参数二、模板的特化1.模板特化的概念2.函数模板的特化3.类模板的特化3.1 全特化3.2 偏特化 4.类模板特化应用示例 三、模板的分离编译四、模板总结 一、非类型模板参数 模板参数分为类型形参与非类型形参,其中,类型形参即出现在…

【Transformer系列(2)】注意力机制、自注意力机制、多头注意力机制、通道注意力机制、空间注意力机制超详细讲解

前言 注意力机制一直是一个比较热的话题,其实在很早之前就提出了,我们在学习图像分类时在SENet就见到过(直通车:经典神经网络论文超详细解读(七)——SENet(注意力机制)学习笔记&…

Vue 3的新特性介绍

Vue是一款流行的JavaScript框架,用于构建现代Web应用程序。Vue 2已经成为前端开发者的首选框架之一,但是在2020年,Vue 3正式发布,带来了一系列重要的新特性和功能。本文将介绍Vue 3相对于Vue 2的新特性和功能,以及它们…

Nature子刊:HPV改变阴道菌群的机制

​ 研究背景 人类乳头瘤病毒(HPV)是最常见的性传播感染,影响全球3亿人以上。 虽然大多数感染像得了场“感冒”一样被免疫系统清除,或保持在无症状或潜伏状态,但致癌(高危)HPV株(如最明显的HPV16和18型)会导致宫颈鳞状上皮内病变[低级别(LSIL…

以ChatGPT为例进行自然语言处理学习——入门自然语言处理

⭐️我叫忆_恒心,一名喜欢书写博客的在读研究生👨‍🎓。 如果觉得本文能帮到您,麻烦点个赞👍呗! 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧,喜欢的小伙伴给个三…

变压器计算—12V1A为例

1、初级圈数NP(Vinmin*Tonmax)/(Ae*Bmax) Vinmin:最小输入电压一般按AC输入90v计算,换算成直流是90*1.4126V Tonmax:最大导通时间如f65K(常用的一个频率) …

【Transformer系列(3)】 《Attention Is All You Need》论文超详细解读(翻译+精读)

前言 哒哒~时隔好久终于继续出论文带读了,这次回归当然要出一手王炸呀——没错,今天我们要一起学习的就是传说中的Transformer!在2021年Transformer一经论文《Attention is All You Need》提出,就如龙卷风一般震惊学术界&#xf…

Qt QVector 详解:从底层原理到高级用法

目录标题 引言:QVector的重要性与简介QVector的常用接口QVector和std::Vector迭代器:遍历QVector 中的元素(Iterators: Traversing Elements in QVector)常规索引遍历基于范围的for循环(C11及以上)使用STL样…

JavaScript从入门到精通

JavaScript从入门到精通 一 Hello World二 Js编写位置三 Js基本语法四 常量和变量五 标识符六 数据类型七 强制类型转换 一 Hello World <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</ti…

网络编程套接字(一)

学习任务&#xff1a; 我们先来认识端口号&#xff0c;区分好主机IP和端口号的区别&#xff0c;以及涉及到进程PID和端口号的区别。 然后简单认识一下TCP协议和UDP协议&#xff0c;这两个协议都是传输层的。接着了解什么是网络字节序&#xff0c;它有什么作用。然后是网络编程的…

javaweb838仓库进销存管理系统

此系统主要分4个模块&#xff0c;分别是&#xff1a; 出库管理模块&#xff1a;对每种出库出去的商品都有相应的记录显示。 入库管理模块&#xff1a;对每种入库来的商品都有相应的记录显示&#xff0c;如果商品管理局显示某一厂家的某一种商品不符合要求&#xff0c;则在入库的…

解决 “Function not implemented“, 为 arm64 架构宿主机重新构建 Nacos 镜像

文章目录 前言重新构建镜像的步骤附录FAQ: "cannot install the best candidate for the job" & "conflicting requests"Dockerfile 文件 前言 官方的 Nacos 镜像在 arm64 架构的系统上运行容器会出现 “Function not implemented” 的相关异常日志以…

Linux内存管理(三十三):vmalloc 详解

源码基于&#xff1a;Linux 5.4 0. 前言 kmalloc()、vmalloc()、malloc() 这三个函数是常用的内存分配函数&#xff0c;但有着本质的区别。 kmalloc() 基于slab 分配器&#xff0c;是建立在一个物理地址连续的大内存块上&#xff0c;所以 kmalloc() 分配的内存物理是上连续的…

c++引用

目录 C 引用的概念&#xff1a; c引用在工程中的好处&#xff1a; c引用的用法 c引用的场景&#xff1a; c引用的场景1&#xff1a;作为函数参数 c引用的场景2&#xff1a;作为函数返回值 引用的优点包括&#xff1a; 在 C 中使用引用时需要注意以下几点&#xff1a; C…