自动还款业务事故案例,与金融场景幂等性思考

一、自动还款业务 事故 案例

事故名称:

自动还款业务事故

事故描述:

事故发生时间:201x-0x-18 0x:15:00
事故响应时间:201x-0x-20 0x:18:00
事故解决时间:201x-0x-20 0x:28:00

事故现象:

自动扣款,出现扣款重复,同一用户在当天扣款多次.

事故造成影响:

重复给n个用户扣款,重复扣款的多支付金额部分已退款给用户。

事故发生原因:

1.自动还款的防重有问题,当出现并发进行消费MQ时,通过读库的防重是不起作用的。

事故解决过程描述:

1、0x:15左右:收到运营人员的反馈,自动扣款有几笔在x.18号进行重复扣款.
2、0x:18左右:进行线上排查,在数据库里发现同一笔用户在当天有多笔的扣款数据信息,并且时间上都是同一时间内。
3、0x:20左右:调取线上的相关日志,分析 MQ在同一秒内推送了3~5条一样的消息进来,走查代码发现防重是通过uuid来查询数据库,如果查询没有数据信息,则insert一条新数据。
4、0x:25左右:排查线上数据库对uuid的唯一性约束,发现线上没有做uuid的唯一性约束.
5、0x:28左右 : 提工单将uuid做成唯一性约束.
6、201x-0x-21 8:00 左右,验证线上数据,没有重复扣款的记录信息,扣款正常。

事故总结教训:

1、 强化对于防重技术的实现,防重通过读是解决不了的(并发情况也需要考虑),通过写防重是更好的解决办法
2、 针对于数据库表字段的唯一性的字段的处理,检查是否增加唯一性的约束条件。
3、 消费MQ消息必做防重处理。
4、加强业务逻辑上的监控,针对于同一用户在当天执行多次扣款进行监控告警处理。

二、金融场景幂等性思考

  重复出款特指代付或者转账场景下,服务消费者A重复向服务提供者B发起的重复交易,导致资金损失;后续特指各类重复金融性交易导致的资金损失。出错的原因如下:
1、程序逻辑错误:

1)状态控制出错:由于程序、网络和系统异常等原因,A未得到B答复,A发起了新交易。2)未做幂等性设计:由于A未收到B明确响应,A发起重试交易,B未做幂等性处理,重复交易。

2、跨会计日场景

1)由于A发起交易为T日,而B处理交易为T+1日,所以A未收到T日的结果,可能再次发起交易。
2)有些系统没有会计日,是按照机器时间为准,A和B的交易时间不一致,导致重复出款

3、多任务并发:通常是指定时任务中,同一个定时任务并发处理的资源导致;
4、提交并发:也就是防重复提交指引提到的;
5、服务器异常:由于服务异常崩溃,消息或者缓存信息丢失,等服务器重启后,可能导致;

设计原则:

  1. 先扣款,再生成处理订单,宁可长款也不能短款,宽进严出。
  2. 数据校验:设置校验规则,同一时间段,同一客户,相同金额的交易发起记录;如果是客户发起,提示客户确认;如系统发起(例如代付),建议转人工处理。
  3. 状态控制:交易状态为,成功、失败、未知(或处理中),对于未知状态,不能再重复自动发起。
  4. 时间控制:对于未实现24小时服务的应用,尽可能避免在23点30后做出款处理。
  5. 提交并发控制:审核提交等做防重复提交控制。
  6. 定时并发控制:禁止提交同一个文件给多个定时任务。
  7. 对账及差错处理:要对交易进行对账,并对差错交易进行差错处理

相关阅读:
支付系统的防重设计 (qq.com)

三、服务间超时处理

在一个很普遍的场景中,涉及到双端通信的情况下,不论是传统的单机服务,还是现在的微服务,甚至事异步通信技术(进程内,进程与进程),一直都存在着三态的问题,即成功,失败,超时。

如下图两个服务间:
在这里插入图片描述
成功失败具有明确的业务语义和边界,正常处理即可。最复杂的就是超时,因为网络通信原因,双端都不总是确定,到底哪个环节超时。

3.1 同步调用超时

在这里插入图片描述
超时点:

  1. -请求超时;
  2. -服务端内部处理超时:比如操作耗时的资源,调用第三方系统等造成客户端请求整体超时而主动断开连接;
  3. -服务端处理正常,但响应结果阶段超时;

3.1.1 处理

客户端:
无论那个阶段,客户端都不确定请求是否被应答,即服务端处理的结果,客户端不知道是否成
功。客户端此时能做的,有两种方法:

1、 -重试,客户端需要主动做好重试方案,比如类似mq的重试队列(1s 5s 10s 30s 1m 2m 3m 4m 5m6m 7m 8m 9m 10m 20m 30m 1h 2h),主要的技术,spring-retry框组件,将请求扔到自产自销的mq,依靠mq的重试队列主动重试,或者建立定时任务表重试;

2、-主动查询结果:超时后客户端主动查询,查询的时机类似重试机制,因为快速的查询,并不总是有效,当发生网络抖动的时候,很大概率就地查询,也是网络抖动阶段;

不管哪种方式,需要服务端接口具备幂等性。

服务端:
服务端不存在请求超时和响应超时,但存在自身超时的情况,解决方案:

  1. 自身rt值需要优化,比如慢sql等;
  2. 以来三方接口的时候,跟第三方接口又形成了一个客户端-服务端模式,根据具体场景或者快速失败,或者做好容错措施,必要的时候,还会有比如金融领域的冲正操作;

3.2 异步调用超时

异步调用,类似ajax,客户端同步请求,服务端异步响应
在这里插入图片描述
超时点:

  1. 请求超时;
  2. 服务端内部处理超时:比如操作耗时的资源,调用第三方系统等造成客户端请求整体超时而主动断开连接;
  3. 服务端处理正常,但响应结果阶段超时;
  4. 异步响应超时;

客户端:
参考同步-客户端

服务端:
服务端不存在请求超时和同步响应超时,对于内部处理超时,同同步情况一样。那么就只剩下异步响应超时了。
比较有代表性的就是支付结果通知,可参考: 支付结果通知文档

存在此问题就是服务端通知客户端的时候(客户端需要同步提供响应服务端结果通知的接口),未接受
到客户端的响应。

MQ超时:
在这里插入图片描述
在此处讨论的超时,其实相当于另外一个话题,如何保证mq不丢消息,无论是kafka和RocketMQ,都支持ack的机制,用以确认消息的发送和接受的成功.

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch离线安装

1. 上传和解压软件 将elasticsearch-7.11.2-linux-x86_64.tar.gz和kibana-7.11.2-linux-x86_64.tar.gz 上传到/data/es目录 解压文件 tar -zxvf elasticsearch-7.11.2-linux-x86_64.tar.gz tar -zxvf kibana-7.11.2-linux-x86_64.tar.gz 2. 创建es用户 因为安全问题&#xff…

Java系统操作日志之数据修改变化记录

系统操作日志之数据修改变化记录 前言效果图如何实现总结 相信大家在自己的系统中都有记录日志吧,像登录日志、操作日志等等 但是一般来说,大家都是获取操作了什么东西,包括它的参数,模块等等,但是你有关心过他的数据变…

蓝桥杯每日一题2023.11.6

取位数 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 由题意我们知道len中为现阶段长度&#xff0c;如果其与k相等也就是找到了正确的位数&#xff0c;否则就调用递归来进行搜索&#xff0c;每次搜索一位数。 #include <stdio.h> // 求x用10进制表示时的数位长度 int …

最长非递减子序列,Python实现

from time import time from bisect import bisect from random import choices, seed from itertools import combinationsdef func1(seq):# 暴力穷举&#xff0c;从最长的子序列开始查找&#xff0c;大约耗时5小时for n in range(len(seq)-1, 0, -1): # 依次查找长度为len(se…

四阶龙格库塔与元胞自动机

龙格库塔法参考&#xff1a; 【精选】四阶龙格库塔算法及matlab代码_四阶龙格库塔法matlab_漫道长歌行的博客-CSDN博客 龙格库塔算法 Runge Kutta Method及其Matlab代码_龙格库塔法matlab_Lzh_023016的博客-CSDN博客 元胞自动机参考&#xff1a; 元胞自动机&#xff1a;森林…

密度聚类与层次聚类

大家好&#xff0c;我是带我去滑雪&#xff01; 密度聚类&#xff08;Density-based Clustering&#xff09;和层次聚类&#xff08;Hierarchical Clustering&#xff09;是两种不同的聚类方法&#xff0c;用于将数据集中的数据点分组成簇。 目录 一、密度聚类 &#xff08;…

面试题:线上MySQL的自增id用尽怎么办?

文章目录 前言表定义自增值idInnoDB系统自增row_idXidInnodb trx_id InnoDB数据可见性的核心思想为什么要加248&#xff1f;为何只读事务不分配trx_id&#xff1f;thread_id 总结 前言 MySQL的自增id都定义了初始值&#xff0c;然后不断加步长。虽然自然数没有上限&#xff0c…

【广州华锐互动】气象卫星监测AR互动教学软件为气象学习带来更多乐趣

由VR制作公司广州华锐互动开发的气象卫星监测AR互动教学软件是一款结合了增强现实(AR)技术与气象监测技术的教育软件。它通过直观、互动的方式&#xff0c;帮助学生更好地理解和掌握气象监测的基本知识和技能。本文将从气象卫星监测AR互动教学软件的应用场景、优势分析、实际意…

怎样选择文件外发控制系统,让数据实现高效安全交换?

制造型企业都非常重视其知识产权&#xff08;IP&#xff09;的安全性&#xff0c;尤其是其最有价值的产品设计数据的安全问题。基于复杂的供应链生态&#xff0c;每天可能要与几十家甚至上百家供应商及合作伙伴进行数据交换。不管是一级还是二级供应商&#xff0c;合作伙伴还是…

pycharm pro v2023.2.4(Python开发)

PyCharm是一种Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;PyCharm提供了强大的功能&#xff0c;包括语法突出显示、智能代码完成、代码检查、自动重构和调试等特性&#xff0c;这些都可以帮助Python开发人员更加高效地编写代码。 PyCharm Pro是PyCharm的高级版…

Ripro-V5 6.4最新版 不限域名无限搭建(授权激活文件)

RiPro主题全新V5版本&#xff0c;是一个优秀且功能强大、易于管理、现代化的WordPress虚拟资源商城主题。支持首页模块化布局和WP原生小工具模块化首页可拖拽设置&#xff0c;让您的网站设计体验更加舒适。同时支持了高级筛选、自带会员生态系统、超全支付接口等众多功能&#…

百度上线“文心一言”付费版本,AI聊天机器人市场竞争加剧

原创 | 文 BFT机器人 百度不愧是我国AI技术领域的先行者&#xff0c;每年致力于人工智能领域取得技术产品的突破和创新。据爆料称&#xff0c;百度的文心一言有突破了新境界&#xff0c;开创了文心大模型4.0会员版本。从线上的to C产品到试水商业化&#xff0c;百度都是争先走…