对资金类服务幂等设计与测试的思考

之前写过一篇《系统设计的幂等性》科普文章。

幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口,多次发出同一个请求,必须保证操作只执行一次。调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生。

对于本文讨论的资金类服务类,如果幂等设计不合理,则会出现一笔交易重复打款的情况,这就出现了资损。

01/为什么会产生接口幂等性问题?

其实可以分两类:

一类是受不可抗且非常规操作导致的重复请求,例如网络波动引起的重复请求;用户重复操作,用户在操作时候可能会无意触发多次下单交易,甚至没有响应而有意触发多次交易应用。

另一类则是请求失败需要重复发起请求的场景,例如用户请求受理成功,需要异步通过定时任务重复执行的情况。

02/如何保证接口幂等性?

幂等的核心是确保唯一性。常规的方法有:

唯一索引:在数据库中建立唯一索引,用作幂等键,可以防止插入重复的数据。

状态机约束: 在设计单据相关的业务,或者是任务相关的业务,肯定会涉及到状态机(状态变更图),就是业务单据上面有个状态,状态在不同的情况下会发生变更,一般情况下存在有限状态机,这时候,如果状态机已经处于下一个状态,这时候来了一个上一个状态的变更,理论上是不能够变更的,这样的话,保证了有限状态机的幂等。 

Token机制:其实本质和唯一索引类似。

摆了这么多,下面引出本文讨论的重点:资金类服务如何做幂等设计与测试

当然回答问题前,还是要聊一下创作来源,这个话题的来源同样来源于对线上问题的思考。下面我娓娓道来。

03/问题背景

图片

退款服务的场景如下:第一次请求:如果用户首次请求应用B失败,则应用A落失败的单据A-1,状态=FAIL;应用B则落受理成功的单据B-1,状态=INIT。初次请求报文如下:

{
"requestId": String,
"amount":Moeny,
"refundDetialList":[
refundDetial-1,
refundDetial-2
]
}

第二次幂等请求:后台重试发起幂等请求应用B失败,则应用A落失败的单据A-2,状态=FAIL;应用B则不对单据B-1做更新,状态=INIT。此时请求报文如下:

{
"requestId": String,
"amount":Moeny,
"refundDetialList":[
refundDetial-1,
refundDetial-2
]
}

第三次幂等请求:后台重试发起发起幂等请求应用B成功,则应用A落成功的单据A-3,状态=SUCCESS;应用B更新单据B-1状态=SUCCESS。(但是应用A与应用B之间的核对不一致。)

  • 但是此时应用A调用应用B的请求报文里refundDetialList的size数量已经包含了A-1、A-2的单据(其实这时候报文是错误的)。

此时请求报文如下:

{
"requestId": String,
"amount":Moeny,
"refundDetialList":[
refundDetial-1,
refundDetial-2,
refundDetial-3,
refundDetial-4
]
}

应用A和B针对幂等请求的处理逻辑:

应用A:幂等字段为requestId,同时校验amount的一致性。捞起DB里根据requestId+status=FAIL关联到的refundDetial组装 对应用B调用的报文。

应用B:幂等字段为requestId,同时校验amount的一致性。捞起DB里根据requestId关联到refundDetial组装报文对下游发起调用。

背景应该描述清楚了,那么下面分析一下问题:

1. 应用A为什么组装报文错误?原因:如果幂等重试在2次以上,组装请求报文由于DB里已经有两条FAIL出现重复组装refundDetialList的情况,导致传给下游错误的报文信息。

2. 应用B面对错误的报文,为什么能处理成功?原因:应用B会将首次请求失败的数据落DB,幂等请求时候,如果requestId不变,且amount不变,则会捞起首次请求落DB的refundDetial,组装对下游的请求报文,因此不会报错。

分析问题与原因后,乍一看感觉应用A和B都有问题,应用A组装refundDetialList的逻辑错误,忽略了2次幂等以上的场景,如果出现这种场景,则组装refundDetialList时候最起码要getFirst()才行。

应用B没有感知到应用A的错误报文,最起码应该拦截到,而不是向下调用才行。

当然,本文的目的不是争个谁对谁错,而是讨论针对这种资金类服务应该如何设计幂等?

04/幂等检验的范围有哪些?

资金类服务的特点就是很容易发生资损。因此在设计幂等逻辑的时候,需要分析请求报文中哪些字段需要严格“幂等”(就是重复请求中哪些字段需要严格保持一致)。

如上文说到的服务,是以requestId作为幂等字段,且对amount做了金额一致性校验,通过后才能继续向下调用。那么refundDetialList是否应该纳入幂等校验的范畴之内的,我觉得这个需要By业务分析,单纯从平台角度无法给出特定的结论。因为平台要提供的是通用能力,理论上是不吃业务的,但是如果针对业务诉求强,那就需要做业务定制的处理逻辑,这显然违背平台设计的初衷。但有时候确实是这样,平台建设没法完全脱离业务。

05/幂等测试场景分析

对于测试来说,通常情况下,我们分析幂等场景一般幂等字段(也可能是多个字段联合作为幂等条件)、关键资金字段如金额作为场景因子设计幂等测试用例:

CASE001:同号发起(幂等条件不变)+不换金额,预期幂等REPEAT_REQUEST;

CASE002:同号发起(幂等条件不变)+换金额,预期幂等校验不通过报错;

CASE003:换号发起(幂等条件变化)+不换金额,预期作为新请求处理;

此外,幂等发起的次数也应该引起关注,作为一个场景因子来对待:

幂等请求次数建议考虑2次以上的场景。

当然,我们设计幂等场景的时候,最好要review下开发的实现思路,不要完全采取黑盒方法,结合白盒方法设计的测试用例才更有效。

- END -


下方扫码关注 软件质量保障,与质量君一起学习成长、共同进步,做一个职场最贵Tester!

新年送福

关注「软件质量保障」微信公众号

菜单栏对话框回复:2024

点击「抽奖」小程序,即可参与新年抽奖活动

我们将从中抽取25位幸运读者,分别为大家送上新年礼物。

图片

温馨提醒:

1. 以上两个活动的截止日期均为:2024年1月22日23:59。

2. 中奖的同学,请填写好邮寄地址,我们会核实后邮寄礼品。如果两周内没有收到礼品,请在后台留言或者私信我们。

图片

好文推荐

往期推荐

聊聊工作中的自我管理和向上管理

经验分享|测试工程师转型测试开发历程

聊聊UI自动化的PageObject设计模式

细读《阿里测试之道》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql进阶-索引基础

目录 1. 概念-索引是什么? 2. 索引的数据结构(索引模型) 2.1 二分查找: 2.2 二叉查找树(BST Binary Search Tree): 2.3 平衡二叉树(AVL Tree Balanced binary search trees) 2.4 多路平衡查找树(B Tree Balanced…

墙地砖外形检测的技术方案-技术方案概述

技术方案概述 墙地砖检测内容包括:轮廓尺寸、边直度和直角度特征。检测墙地砖检测系统的技术路线如图所示,包括的处理模块有:图像获取、图像复原、图像增强、图像分割、外部检测算法。下面分别讲解这个处理模块的作用。 墙地砖检测的技术路线…

WorkPlus企业打破信息孤岛,构建统一工作平台的首选之一

在当今数字化时代,企业内部存在着繁多的工作应用和系统。要实现高效的工作协作,企业需要一个统一的工作平台来打破信息孤岛,提升协作效率。作为一家领先的企业统一工作平台,WorkPlus以其卓越的性能和专业的功能,助力企…

线性调频信号的解线调(dechirp,去斜)处理matlab仿真

线性调频信号的解线调 线性调频信号的回波模型参考信号去斜处理去斜处理傅里叶变换得到脉压结果解线调仿真总结 线性调频信号的回波模型 对于线性调频脉冲压缩雷达,其发射信号为: s ( t ) r e c t ( t T ) e x p ( j π μ t 2 ) \begin{equation} s(…

mac vscode latex实用

网上有教程怎么在vscode里安装macTex以及插件,然后就可以在latex里写代码了,这里需要修改的是对应的json文件,输入command P,可以看到最近打开的json设置文件,结果如下 然后设置这个json文件,我的json文件设置如下 …

基于SSM的网上订餐管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

C语言经典算法之直接排序算法

目录 前言 一、代码实现 二、时空复杂度 时间复杂度: 空间复杂度: 前言 建议:1.学习算法最重要的是理解算法的每一步,而不是记住算法。 2.建议读者学习算法的时候,自己手动一步一步地运行算法。 tips:希尔排序算…

大数据 - Kafka系列《一》- Kafka基本概念

目录 🐶1.1 什么是kafka 🐶1.2 Kafka可以用来做什么 🐶1.3 kafka的特点 🥙1. 高吞吐量、低延迟 🥙2. 可扩展性 🥙3. 持久性、可靠性 🥙4. 容错性 🥙5. 高并发 &#x1f436…

【Maven】001-Maven 概述

【Maven】001-Maven 概述 文章目录 【Maven】001-Maven 概述一、Maven 概述1、为什么学习 MavenMaven 作为依赖管理工具Maven 作为构建工具其它 2、Maven 介绍3、Maven 软件工作模型图 一、Maven 概述 1、为什么学习 Maven Maven 作为依赖管理工具 依赖管理: Mave…

python tcp socket中实现SSL/TLS认证

SSL/TLS介绍 官话说SSL是安全套接层(secure sockets layer),TLS是SSL的继任者,叫传输层安全(transport layer security)。 说白点,就是在明文的上层和TCP层之间加上一层加密,这样就保证上层信息传输的安全。如HTTP协议是明文传输…

git常用命令集合及其演示

文章目录 一.git常用命令集合及其演示1.git config --list 查看配置信息2.git status 查看当前仓库的状态3.git add . 加到暂存区4.git commit -m "描述信息" 添加到版本库5.git diff xxxx 查看xxxx文件修改了哪些内容,相比于暂存区的区别6.git rm --cach…

linux Tcp总结

Tcp连接建立时的影响因素 在Client发出SYN后,如果过了1秒 ,还没有收到Server的响应,那么就会进行第一次重传;如果经过2s的时间还没有收到Server的响应,就会进行第二次重传;一直重传tcp_syn_retries次。 对…

Python3.10安装教程

Python3.10安装 Python的安装按照下面几步进行即可,比较简单。 下载Python安装文件,打开Python的下载页面,我这里选择安装的版本是3.10.11,根据自己电脑版本选择对应安装包 安装包下载完毕后,按照步骤开始安装。选择…

微信小程序rsa加密

没有使用npm下载依赖的方式,直接引入了rsa.js文件,rsa.js文件在后面,目录结构如下: 在index.js文件引用 import { proxyInstance, backendUrl } from ../../util/request.js; import JSEncrypt from ./rsa.js const key -----BE…

数据模型/数据建模的含义

我们可以从以下四个方面来了解 (1)、业务模型 (2)、构建表关系/表链接 (3)、数学模型 (4)、算法模型 业务模型 建立业务模型的重点是懂业务,即了解业务的整个过…

探寻闲鱼SellerId加解密算法

最近一直在研究闲鱼的加密算法,无他,因为阿里的加密可以算是天花板级别的,研究和学习起来才值得。 很多人可能发现了,通过抓包得到的闲鱼数据包,sellerId等等值是加密过的。这就导致了很多人通过抓包或者协议请求得到…

qt图形化界面开发DAY2

作业: 1> 思维导图 2> 使用手动连接,将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中,在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中,在槽函数中判断ui界面上输入的账号是否…

第 5 课 编写简单的发布器 Publisher

文章目录 第 5 课 编写简单的发布器 Publisher 第 5 课 编写简单的发布器 Publisher 本节以创建一个velocity_publisher.py的(发布者)节点为例进行讲解。 输入指令“roscd beginner_hiwonder”,回车。进入beginner_hiwonder软件包。 roscd…

数据结构(c)冒泡排序

本文除了最下面的代码是我写的,其余是网上抄写的。 冒泡排序 什么是冒泡排序? 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交…

JAVA开发入门

文章目录 计算机基本概念DOS常用命令JAVA语言发展史JDK下载JAVA体系与特点JDK安装JAVA环境变量配置 计算机基本概念 计算机组成原理 计算机组装 计算机:电子计算机,俗称电脑。是一种能够按照程序运行,自动、高速处理海量数据的现代化智能电子…
最新文章