关于重复消费的一些解决方案

news2024/9/20 22:52:42

重复消费问题一直是一个热点问题,不管是面试还是实际工作过程中都会遇到,今天我就盘一下这个问题。

1. 重复消费是怎么出现的

重复消费的问题出现的情况有很多,我列举一下常见的吧:

  • 用户重复提交表单。

  • 用户使用软件恶意刷单。

  • 消息由于失败,但是并没有失败,存在重试机制导致重复消费。

  • MQ 中的经典重复消费问题。

2. 那怎么解决呢?

解决重复消费问题,就需要保证一个特性,那就是幂等性,即调用一次请求的结果和调用多次相同请求的结果是一样的。

一般情况下,像查询业务,删除业务这些都是幂等的,而用户下单和退款业务这些不是幂等的。

保证幂等性有以下解决方式:

  1. 用户提交表单后,让提交按钮变为 loading 标志确保不能重复点击,同时跳转到一个提交成功的页面。

  2. 去重,每条消息都有一个唯一标识,通过判断标识是否存在从而去重,这样就能避免处理已经处理过的消息。

  3. 保证接口的幂等性,通过先查再更新的方式修改数据库记录。比如消息有一个唯一标识,那么先去数据库中查找是否有这个标识,如果没有再添加;也可以根据业务来,比如支付业务,先去查对应的支付订单是否为未付款,如果是则进行扣款并更新订单状态。

3. 详细说一下去重

上面提到的解决方式中1,3点都是老生常谈了(个人拙见),我重点说一下去重有哪些方案吧。

1.Redisson 客户端的布隆过滤器

它的底层数据结构是一个 bitmap(位图),里面存放的是二进制0或者1。刚开始全是0,当一个key来了之后先经过3次hash运算,模于数组长度找到对应的数组下标,把对应的0改为1。这样的话,三个数组的位置就能标明一个key的存在。查找的过程也是一样的。

但是它存在一定程度的误判,比如一个 key 过来布隆过滤器判断它存在于 bitmap 中,但是实际上不存在。我们可以通过增加数组的长度或者增加 hash 计算的次数从而减少误判率,但是这也会带来一定的内存和性能开销,实际应用中需要结合业务预估误判率,并且我们需要对误判的情况进行兜底操作,比如查询数据库中是否存在相应的记录。

  • 业务代码

2. 创建自定义注解实现去重

可以自定义一个幂等注解,然后配合 AOP 进行方法拦截,对拦截的请求信息(包括ip+方法名+参数名+参数值)根据固定的规则去生成一个 key,然后调用 redis 的 setnx 方法,如果返回 ok,则正常调用方法,否则就是重复调用了。这样可以保证重复请求接口在一定时间内只会被成功处理一次。至于锁的有效时长要根据业务情况而定的。

  • 创建幂等性注解

  • 获取 IP 的工具类

  • 创建幂等性切面

上述解决调用的重复问题,核心是找到一个唯一的标识,从而判断是否为重复操作。

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

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

相关文章

【Qt】基于VTK9.1+VS2019+Qt5.15.2的点云可视化程序开发

目录 0. 写在前面 1. 开发环境 2. VS 2019 PCL 1.12.1 配置 3. Qt 5.15.2安装 & Qt-VS插件安装 & VTK 9.1.0编译安装 4. 点云显示demo 4.1 UI 4.2 头文件 4.3 主程序 4.4 显示效果 5. 写在最后 0. 写在前面 由于工作需要和个人爱好,我最近在学习…

lenovo M7328W 复印二页不同的内容到同一张白纸上,要求要全都是正向,就是一个方向显示。当然也可以不一样,那就随便放不要求正反,只要求位置一致。

1、先上个图,打开软件: 按一下电源键,将休眠中的打印机,变成待机状态,这样才可以复印。 2、打开复印的盖板,将要复印的一面帖在最右侧,右侧要留一些空白距离,然后点击复印按钮&#…

数据存储单位——真题详解

在计算机中,以下哪个选项描述的数据存储容量最小?( ) A. 字节(byte) B. 比特(bit) C. 字(word) D. 千字节(kilobyte) 【答案】 B 【解析】 本题考查计算机数据存储容量单位的比较,这个题目看起来很简单,但有的老师甚至都会做错&am…

华为海思招聘-芯片与器件设计工程师-数字芯片方向- 机试题——(共九套)(每套四十题)

华为海思招聘-芯片与器件设计工程师-数字芯片方向- 机试题-题目分享——共九套(每套四十题) 岗位——芯片与器件设计工程师 岗位意向——数字芯片 真题题目分享,完整版带答案(有答案和解析,答案非官方,未仔细校正&am…

天下通商城:数字时代的智能消费助手

随着数字经济的飞速发展,消费方式也在不断革新。天下通网络科技(海南)有限公司顺应这一趋势,推出了天下通商城,这一平台不仅简化了购物流程,还为用户提供了丰富的智能消费工具,成为现代消费者的…

解决国产手机wda不能联网问题

前言 国产手机在通过tidevice无线调试启动wda(webdriveragent)后,会有报错: request error:(‘Connectionaborted.’, SocketError(‘socket timeout’))AirtestIDE或者appnium inspector 无法连接手机显示模拟器界面&#xff0c…

音频导出后为什么效果变差了 FL Studio音频导出设置推荐

FL Studio是一款功能强大的编曲软件,除了可以编曲之外,FL Studio还支持各种音频格式导出。有的小伙伴在使用FL Studio导出音频后,会发现的导出的音频效果不理想,这很大的原因可能是导出设置不对造成的。下面给大家详细讲解&#x…

20240827让飞凌的OK3588-C核心板在Linux R4下通过rockit工具的VI功能获取SONY索尼8530机芯的YUV图

20240827让飞凌的OK3588-C核心板在Linux R4下通过rockit工具的VI功能获取SONY索尼8530机芯的YUV图 2024/8/27 19:40 缘起,我司使用飞凌的OK3588-C的核心板,系统是Linux R4版本。 机芯选用SONY索尼的HDMI OUT接口的8530,输出格式有BGR3/NV16。…

CMake之PUBLIC、PRIVATE、INTERFACE

竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生~ 个人主页: rainInSunny | 个人专栏: C那些事儿、 Qt那些事儿 文章目录 写在前面抽象版解释头文件和链接库传递测试代码结构PUBLIC传递PRIVATE传递INTERFACE传递 写在前面 使用CMake必然离不开target_include_dir…

LVGL从SD卡读取图片并显示到MCU LCD屏详细笔记教程

1、前言 在上一篇LVGL专题文章中已经讲解了如何将LVGL与FatFs链接起来,实现LVGL对SD卡中的数据进行读写操作。本文在上一文的基础上,将实现LVGL读取文件系统中的图片文件(BMP、PNG、JPG),并显示到MCU设备中的LCD屏中。…

转行软件测试必需要知道的知识

1前言 随着现在互联网行业的迅猛发展,越来越多的人想涌入进来,因为大家都觉得IT行业工资高,做测试门槛又低,是的,入门门槛确实比较低,但是要做好的话,还是有点难的,毕竟术业有专攻嘛…

网约车资格证考试攻略(必备宝典)

考试分数详情及攻略如下: 一、理论部分:(电脑操作,鼠标勾选) 1、全国试题,满分50分,40分过关,每位学员要练习到45分才行; 2、地方试题,满分25分&#xff0c…

Vue3源码调试-第三篇

前言 上两篇已经调试完packages/runtime-dom/src/index.ts下的createApp函数的第一行了,接下来我们看下一行 injectNativeTagCheck 首先说下这个__DEV__估计也是定义在dev.js下,又或者是哪里的,这里控制台输出是true,那我估计是…

Nginx: 代理场景下Nginx接收用户请求包体的处理

Nginx 反向代理图 当用户发过来一个request body的时候,Nginx 是如何处理这样一个body这个body 它对应的就是我们客户请求的一些具体内容 1 )proxy_request_bufering 指令 接收包体的两种方式 接收完全部包体再发送一边接收包体一边发送 接收包体的两种…

前端项目部署到服务器上(nginx)

我这个之前已经部署过项目,所以要进行这个操作 docker imagedocker rm -f nginx //用于强制删除名为“nginx”的容器docker ps //用于列出当前正在运行的Docker容器docker volume -fdocker volume prune //用于删除所有未使用的Docker数据卷,‌释放存…

day11JS-面向对象和js中的设计模式

1. 面向对象 1.1 什么是面向对象 面向对象是一种编程思想,JS就是基于这个思想构建出来的一门编程语言,所以JS中存在对象、类、实例的概念。 对象:万物皆对象。 构造函数(类):把具有某一特征的内容可以划分…

穿梭虚实之间:3DGS与NeRF如何辅助机器人遥控操作?

导读: 本研究介绍了一种用于机器人遥控操作的新型辐射场可视化技术,研究者提出了一种在线训练辐射场的方法,能够实时从多个摄像头获取数据,支持多种辐射方法,包括NeRF和3DGS。该系统与现有的ROS遥控操作系统集成&#…

惠海H6501 DCDC降压恒压ic 60V72V80V100V转24V36V48V实地架构低功耗 仪表仪器供电 兼容XX9487

H6501是一款高压降压型开关稳压器,可输出高达1A的持续电流至负载。它集成了一个 高压高端MOSFET,提供2.5A的典型峰值电流限。其4.5V至48V的宽输入电压范围可适用于各种降压应用,是汽车、工业和照明应用的理想之选。采用滞环电压控制模式&…

行为识别实战第二天——Yolov5+SlowFast+deepsort: Action Detection(PytorchVideo)

Yolov5SlowFastdeepsort 一、简介 YoloV5SlowFastDeepSort 是一个结合了目标检测、动作识别和目标跟踪技术的视频处理框架。这一集成系统利用了各自领域中的先进技术,为视频监控、体育分析、人机交互等应用提供了一种强大的解决方案。 1. 组件说明: Y…

golang笔记——Go堆内存管理

前言 本文主要记录个人学习Golang堆内存管理,涉及到的相关内容,算是对个人所学知识点的梳理与总结。从非常宏观的角度看,Go的堆内存管理就是下图这个样子 学习内存管理,肯定首先需要了解内存管理的基本知识,我会按照 内…