记一次事务里发普通消息的线上问题排查过程

news2024/9/19 23:17:06

1 结论

结论先行:事务+MQ的使用场景,使用方式一定得正确,稍有不慎,可能就会带来数据不一致问题。

2 问题背景及现象

图片

图片

3 排查过程

3.1 初次分析

图片

图片

发现问题,及时修复,加完锁上线,以为问题修复了,结果高兴太早了。

图片

3.2 问题再次出现

图片

图片

3.2.1 分析思路一

图片

3.2.2 分析思路二

图片

图片

图片

3.2.3 分析思路三

图片

图片

图片

b.updateCostSuccess接口里,其实包含了三步操作,执行完后,还处于大事务中,事务并未提交,后面还有处理流程。

图片

图片

c.具体过程如下

图片

3.3 解决方案

找到问题,测试环境验证一下猜想,updateCostSuccess后,延迟事务提交,基本可以稳定复现问题。

图片

解决方案就清晰了,发送MQ移步到事务提交成功后即可,修复上线后,继续观察了一段时间预警,没有再次出现该问题了,到此,该问题得到彻底解决。

图片

完整流程如下:

图片

4 总结与反思

对于有经验的工程师来说,可能一眼就知道了问题在哪里,比如我们架构的同事们,但是对于没经验,或者没有考虑到这个点上的工程师来说,可能就比较难发现原因,属于典型但不复杂的场景。

大家可以想一想,这个问题中,哪些环节有问题,可能带来当前的数据不一致结果。
数据不一致,有两个大方向的原因:

  • a.数据冗余导致;

  • b. 并发控制不好导致。

这个问题,这两个都有一定的关联,对于cost字段,系统A里已经有一份原始数据,是否有必要在系统B的业务订单表biz_business_order中再存一份,值得思考。对于并发控制,系统B消费系统Atopic,不同tag=create || update的MQ时,如果不做并发锁控制,也可能导致系统B中cost字段产生不一致。
基于本次出现的这个case,我们内部也进行了讨论学习,对于数据一致性问题,总结了几条建议,分享给大家。

  1. 数据是否冗余值得思考,如果选择冗余来降低系统复杂性,就需要用程序保证数据一致性。

  2. 涉及到数据一致性的场景,对于重要的业务场景,最好有数据校对和预警,便于提前发现问题。

  3. 对于业务较复杂的场景,大事务+MQ结合的使用,代码一定要多review,否则可能存在隐患,要谨慎。

  4. 如果事务中发MQ,就需要用事务MQ,保证逻辑处理的结果和发送MQ的结果一致,否则就可能产生不一致(业务不一致或数据不一致)。比如这个场景中,系统A update后发出的MQ,发送成功,如果后续事务回滚了,消费方系统B就可能产生业务不一致问题。

  5. 对于大事务操作,比如用注解直接包住一个大方法这种方式,要慎用。

最后说一句(求关注!别白嫖!)

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、转发、在看。

关注公众号:woniuxgg,在公众号中回复:笔记  就可以获得蜗牛为你精心准备的java实战语雀笔记,回复面试、开发手册、有超赞的粉丝福利!

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

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

相关文章

const、inline、nullptr的使用

目录 1.const引用 1.1权限的放大 1.2权限的缩小 2.inline 3.nullptr 1.const引用 可以引用一个const对象,但是必须用const引用。const引用也可以引用普通对象,因为对象的访 问权限在引用过程中可以缩小,但是不能放大。 不需要注意的是…

C#从入门到精通(20)—C#目录类Directory用法总结

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家!人工智能学习网站 前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任…

【硬核】开源的高性能轻量级ORM框架

简介 easy-orm是一款简洁、轻量高效的数据库对象关系映射框架,它的代码编写规范基于SQL语义,学习成本低,可以快速掌握。 下图是与业界mybatis-plus框架相比。 功能mybatis-pluseasy-orm单表CRUD√√多表CRUD√子查询x√多数据源√预编译√…

一文带你深度了解FreeRTOS信号量——二值信号量

本篇文章深度讲述FreeRTOS信号量——二值信号量的知识,希望我的分享对你有所帮助! 关于FreeRTOS信号量的相关介入,大家可以参考一下这篇文章: 一文带你初探FreeRTOS信号量_freertos 二进制信号量-CSDN博客 目录 一、二值信号量简…

25届最近5年自动化考研院校分析

哈尔滨工程大学 目录 一、学校学院专业简介 二、考试科目指定教材 三、近5年考研分数情况 四、近5年招生录取情况 五、最新一年分数段图表 六、初试大纲复试大纲 七、学费&奖学金&就业方向 一、学校学院专业简介 二、考试科目指定教材 1、考试科目介绍 2、指定…

顺序结构就是“千里走单骑”

顺序结构&#xff0c;就是把工作分成若干个步骤&#xff0c;然后让计算机按步骤依次执行。 对于代码而言&#xff0c;顺序结构就是从上到下依次执行每一条语句。 #include<stdio.h>int main(){//The steps of putting an elephant into the fridge.printf("First,…

【Python知识宝库】掌握列表与元组,轻松处理数据集合

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 在Python编程中&#xff0c;列表&#xff08;List&#xff09;和元组&#xff08;Tuple&#xff09;是两种非常基础且强大…

Unity实战案例 2D小游戏HappyGlass(游戏管理类脚本)

本案例素材和教程都来自Siki学院&#xff0c;十分感谢教程中的老师 本文仅作学习笔记分享交流&#xff0c;不作任何商业用途 基础效果 游戏管理脚本 using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; using UnityEngine; using Uni…

FineBI修改地图配置

前言 在使用FineBI绘制地图时&#xff0c;有时候我们可能发现FineBI中的默认地图模型不是最新的&#xff0c;导致某些地区的区域地图与现实不一致&#xff0c;比如说FineBI的默认地图中深圳地图没有大鹏新区&#xff0c;并且将现在大鹏新区的地方标记为了龙华区&#xff0c;为…

Leetcode19删除链表的倒数第K个节点(java实现)

今天分享的题目如下&#xff1a; 说一下我们的解题思路&#xff1a;我们要想删除第k个节点&#xff0c;那么指针必须落在k-1节点上&#xff0c;比如我们想要操作题目中的节点4&#xff0c;那么指针必须落在节点3&#xff0c;然后让节点3.next 3.next.next即可。 所以明白了这个…

【精选】计算机毕业设计之:基于springboot汽车租赁系统

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

推荐3款免费的数据恢复软件,从此再也不怕数据丢失

Handy Recovery Handy Recovery是一款功能强大且易于使用的数据恢复软件&#xff0c;能够帮助用户恢复因误删、病毒攻击、系统崩溃等原因丢失的数据。该软件支持多种文件系统&#xff0c;包括FAT12/16/32、NTFS、NTFS5以及HFS等。它不仅可以从硬盘、闪存驱动器、U盘等设备中恢复…

Linux学习(13)计算机网络基础概论

本节学习内容 1.网络的基本概念&#xff08;网络、互联网、IP地址、MAC地址、常用网络协议&#xff09; 2.网络分层模型&#xff08;OS的7层模型与tcp/ip协议族体系4层结构、数据链路层、网络层、传输层、应用层&#xff09; 3.网络应用程序通信流程 一、网络的基本概念 1…

python可视化-直方图

1、加载数据 import pandas as pd from sklearn.datasets import load_iris import warnings# 禁用所有警告信息 warnings.filterwarnings(ignore)# 加载数据 iris load_iris() iris iris.keys() df pd.DataFrame(iris.data, columnsiris.feature_names) df[target] iris.t…

联华证券_股票特大单买入意味什么,主力入市

“股票特大单买入”通常意味着有大量资金集中在某一时刻涌入该股票&#xff0c;这往往被视为主力资金入市的迹象。以下是这一现象的详细解读&#xff1a; 1. 主力资金入市 特大单买入: 指的是单笔大额资金买入某只股票&#xff0c;通常是由机构投资者或其他大资金操盘者进行的…

动手学深度学习(pytorch)学习记录19-参数管理[学习记录]

文章目录 参数访问目标参数一次性访问所有参数从嵌套块收集参数 参数初始化内置初始化自定义初始化 参数绑定延后初始化 本节内容&#xff1a; 访问参数&#xff0c;用于调试、诊断和可视化&#xff1b; 参数初始化&#xff1b; 在不同模型组件间共享参数&#xff1b; 延后初始…

C++必修:unordered_set与unordered_map的实现

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. unordered_set与unordered_map的结构 我们知道STL中的unordered_set与unorder…

PowerDesigner生成数据库表结构

PowerDesigner生成数据库表结构 目录 1. 安装32位JDK 2. 更改当前DBMS 3. 下载MySQL驱动 4. 生成数据库表结构 安装32位JDK PowerDesigner只支持32位JDK 更改当前DBMS 下载MySQL驱动 下载地址&#xff1a; MySQL :: Begin Your Download 生成数据库表结构 选择Dire…

同城外卖系统开发方案解析

外卖系统开发是一个复杂而细致的过程&#xff0c;涉及多个方面的考虑和技术实现。以下是对外卖系统开发的详细解析&#xff1a; 一、需求分析 在开发外卖系统之前&#xff0c;首先需要进行详尽的需求分析。这包括用户需求、商家需求和后台管理需求三个方面&#xff1a; 用户需…

怎样把两个pdf合并成一个pdf?教你7种方法轻松完成合并!

新手小白如何将pdf合并成一个文件&#xff1f;pdf是目前较为主流的一种传输格式&#xff0c;内容包含了丰富的多媒体数据&#xff0c;包括文本、图像、表格等多种元素&#xff0c;很多企业和教育工作者都喜欢使用pdf格式。 pdf文件体积较小&#xff0c;兼容性高&#xff0c;平…