积分接口被刷爆,全体一个月降薪20%,这个项目我们遗漏了什么?

有一些往事总是会在酒后提起

我问朋友,在工作上有什么事情是到现在还记忆尤新的?

我朋友一个激灵坐起来,点上一支烟,只见烟头亮了4、5下,才见他吐出一口烟来,说道:“那还真有”

起因

刚参加工作那会做个积分兑换的项目,做完安安稳稳回家过年,哪知道才第三天,就被主管紧急召回,说是捅了大篓子,让我们快来。

回来了才知道项目被灰产盯上,积分被刷,业主业绩没做上去,东西倒是一箱箱往外兑,粗略估计,一天差不多损失上万。

我们赶紧排查,通过积分明细发现,这些人一秒就能获取一次积分,这远远超过了咱们规则的限定值,这肯定是用脚本了,我们后来联系上他,死活不承认。业主希望把负面影响减小到最大,选择不再追究,从我们的合同中扣。

那是我刚毕业做的第一个项目,上来就是项目人员全体降薪一个月,降20%!

俗话说,吃一堑长一智,所以我对这个事情印象还是蛮深的。

问题原因

先说下接口的逻辑层次结构:

–controller

积分获取接口,用PointController表示

–service

积分获取接口service,用PointService表示

我用伪代码来表示整个调用逻辑:

PointController

1.创建一个分布式锁对象,该分布式锁使用redis的NX命令实现

2.随后创建一个3s过期的分布式锁,以便锁住该新增积分的请求

3.最后在新增积分执行完后,在finally中释放锁

4.最后返回该用户的最终积分

PointService

public class PointService {@Transactional(rollbackFor = Exception.class)public void addPoint() {//查询积分规则PointRule pointRule = getPointRule();//查询用户该积分项的积分获取记录总数Integer total = getPointRecords();//判断该用户的积分记录总数是否大于 积分规则限定的次数//大于则不处理,返回if(total - pointRule.getRuleTimes >= 0) {return;}//生成积分记录int insert = insertPointRecords();//更新用户总积分if(insert > 0) {updateUserPoint();}}
}

PointService 中的添加积分逻辑:

首先查询该项目积分规则,查询用户该积分项的积分获取记录总数

2.判断该用户的积分记录总数是否大于 积分规则限定的次数,大于则不处理,返回

3.生成积分记录

4.更新用户总积分

5.该添加积分的逻辑整体上看好像没什么问题,也确实在一切正常的情况下运行是不会有问题的。

如果PointService 中的添加积分逻辑在分布式锁有效期3s内执行完,是不会有问题的。

但如果PointService中的添加积分逻辑超过3s…那是不是后续请求又可以获取锁了,这也正是这次事故的原因。

因为PointService中的添加积分逻辑超过了3s,并且上一个请求的事务还未提交,后续请求已经获取锁进入PointService,在查询积分记录后,判断还是满足规则,继续执行后续的逻辑,造成用户能够获取多次积分。

处理方案

原因总结一下:

添加积分逻辑处理时间过长

分布式锁超时

第一个问题:逻辑改动过大,需要时间调整,没有采用

第二个问题:换成Redisson,因为redisson在即使超时的情况下也会续锁,避免锁超时

“那时候刚毕业,团队也是一个临时组成的班组,没什么经验,工作也忙,忽略了代码Review,最关键的是没做接口并发测试,或者根本没做出来,也没有去做长事务监控,以及频繁请求。”

“那你有什么经验想跟大家分享的?”我问他。

“有!”

他说:“做项目别忘记测试!”

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

AWTK-LINUX-FB实现多点触摸

两周前的一个地图,需要做手势缩放的功能,比较忙就没有发出来,这次抽时间记录一下实现的过程。 AWTK官方有对实现多点触摸做过描述,可惜只有STM32的实现例子,跟Linux的差别还是比较大的,好在tslib有多点触摸…

NRF52832学习笔记(41)——添加串口库libuarte

一、背景 由于板子上不支持硬件流控,在使用 app_uart_fifo 库接收串口大数据时,频繁报 APP_UART_COMMUNICATION_ERROR 错误,多次重新初始化后,串口也不再产生中断了。查看官方论坛后决定使用串口异步库 libuarte。 二、简介 Li…

ORU 的 Open RAN 管理平面 (M 平面)

[TOC](ORU 的 Open RAN 管理平面 (M 平面)) ORU 的 Open RAN 管理平面 (M 平面) https://www.techplayon.com/open-ran-management-plane-m-plane-for-open-radio-unit/ ORU M 平面 在 ORAN 中,设置参数的 O-RU 管理功能是通过 M-Plane 完成的。管理功能包括 O-…

MQ的基础知识

一.什么是MQ 其实就是不同的程序之间的一种的通信方式,通过将消息发送到中间件里面然后中间件就会将这个消息发送给相应的服务进行一个消息的消费,这个时候就会进行一些的业务逻辑的处理,这个方式提高了整个系统的可靠性,拓展性以及灵活性.常见的类型为Aapache Kafaka&#xf…

蓝牙OPP协议详解及Android实现

文章目录 前言一、什么是蓝牙OPP协议?二、OPP协议工作流程1. 设备配对和连接2. 启动 OPP 服务3. 发送对象4. 传输对象5. 传输完成6. 断开连接 三、 Android OPP协议实现1. 启动 OPP 服务器(接收方)2. 发送文件(发送方)…

医学可视化之涟漪图

在医学领域,数据可视化能够帮助我们更直观地理解和分析复杂的信息。涟漪图作为一种独特的可视化工具,具有重要的作用、价值和广泛的使用场景。 一、涟漪图的特点 涟漪图是一种基于地理位置的可视化图表,它通过在地图上显示不同大小或颜色的…

定义宏将整数的二进制的奇数位和偶数位互换位置

假设这个数为n00000000 00000000 00000000 00001101——13 1.思路 1.1 奇数位:00000000 00000000 00000000 00000101 但是怎么获得奇数位呢?——进行按位与运算 不懂如何运算的可以看我主页的详解操作符-CSDN博客,该章详细写了各个操作符如何…

快要结束的大学时光

目录 大一 大一上学期 Java HTMLCSS 大一下学期 HTMLCSSJS JAVA python 大二 大二上学期 Java 原型 前端 大二下学期 前端 数据结构 Android BootStrap JavaWeb ios程序设计 软件测试​编辑 大三 大三上学期 小程序 大三下学期 JavaWeb 整理数据库 大…

高效实现MySQL数据集成的具体案例分享

MySQL数据集成案例分享:1–BI秉心-店铺信息表–store_z–>store 在数据驱动的业务环境中,如何高效、可靠地实现数据集成是每个企业面临的重要挑战。本文将聚焦于一个具体的系统对接集成案例:将MySQL中的店铺信息表store_z的数据集成到另一…

[Docker#3] LXC | 详解安装docker | docker的架构与生态

目录 1.LXC容器操作 安装LXC LXC容器操作步骤 2.理论 LXC 是什么? Docker 是什么 Docker 和虚拟机的区别 Docker 和 JVM 虚拟化的区别 Docker 版本 ⭕Docker 官方网站(建议收藏) Docker 架构 生活案例 Docker 生态 Docker 解决…

CAP相关的分布式技术

目录 一,CAP理论基础 1.1、一致性(Consistency) 1.2、可用性(Availability) 1.3、分区容忍性(Partition Tolerance) 1.4、CAP理论的核心观点 二,如何选C与A 2.1、网络分区情况…

【春秋云镜】CVE-2023-2130

目录 CVE-2023-2130漏洞利用漏洞检测防御措施 靶标介绍:解法一:解法二: CVE-2023-2130 漏洞详细信息 漏洞编号:CVE-2023-2130漏洞名称:SQL注入漏洞受影响的版本:SourceCodester采购订单管理系统1.0影响范…

Code::Blocks 24.10 全中文优化完整版

Code::Blocks(或者叫做 CodeBlocks)是一款开放源代码、跨平台的集成开发环境(IDE),通过配置不同的编程语言编译器,可以用于多种编程语言程序开发。 网上有很多文章介绍 Code::Blocks 的安装,通…

二叉树-哈夫曼树的构造和应用

重点:哈夫曼树的构造和应用(编码) 选取完最小权值的两个节点后新结点的权值是二者之和,新节点可以和选取剩余的结点结合,也可以在剩余的里面选出最小两个结合后形成的新结点与第一个新结点结合(前提他们是最小的两个结点) 哈夫曼编码 哈夫曼编码优化 130为最小的带权路径长度 …

d3坐标轴系数角度变换-位置不对等问题

svg.append(text).attr(x, 100) // 文本 x 坐标.attr(y,200 ) // 文本 y 坐标// .attr(text-anchor, middle) // 文本居中.attr(fill, black) // 文本颜色.attr(transform, rotate(-90, 25, 30)) // 旋转 -90 度.attr(font-size, 9).text(你的文本); 有些老哥…

rosbag数据导出成pcd文件

目录 步骤 1:安装必要的 ROS 包步骤 2:播放 .bag 文件中的点云数据(非必须)步骤 3:使用 pcl_ros 提取并保存点云数据步骤 4:验证输出 要将 .bag 文件中的点云数据导出为 .pcd 文件,通常需要以…

基于 Spring Boot 和 Vue 的门票销售创新系统

作者介绍:✌️大厂全栈码农|毕设实战开发,专注于大学生项目实战开发、讲解和毕业答疑辅导。 🍅获取源码联系方式请查看文末🍅 推荐订阅精彩专栏 👇🏻 避免错过下次更新 Springboot项目精选实战案例 更多项目…

推荐一款管道数据检索工具:Pipedata-Pro

Pipedata-Pro是一款专为设计石油、天然气、水和蒸汽管道及管道系统的工程师开发的应用程序。该应用程序提供了设计管道系统所需的工程数据,拥有一个全面的管道类型、配件和材料数据库。 软件特点: 1. 技术参数查询:Pipedata-Pro 提供关于管道…

使用 Umami 部署博客分析工具

Umami 简介 Umami 是一款开源且注重隐私的网站分析工具,可替代 Google Analytics。它提供网站流量和用户行为等见解,但不使用 Cookie 或收集个人数据,符合隐私法规。Umami 轻巧易用,可自行托管。 如果你有自己的博客,…

三菱QD77MS定位模块速度更改功能

速度更改功能” 是以任意时机将控制中的速度更改为新指定的速度的功能。更改后的速度直接设置到缓冲存储器中,并根据速度更改指令([cd.15速度更改请求)或者外部指令信号执行速度更改。 但是,机械原点复位的情况下,检测出近点狗 ON 并开始向蠕…