MQ本地消息事务表

纯技术方案水文特此记录

MQ本地消息事务表解决了什么问题?

MQ本地事务表方案解决了本地事务与消息发送的原子性问题,即:事务发起方在本地事务执行成功后消息必须发出去,否则就丢弃消息。实现本地事务和消息发送的原子性,要么都成功,要么都失败。 简而言之就是保证了生产者发送消息的可靠性

实现流程

整体实现思路并不复杂,代码看起来绕,其实就是新增了一张本地消息表,记录消息发送失败的日志,且随当前业务事务一块提交。等到业务事务执行完毕后,在执行发送MQ逻辑,此时如果MQ发送失败了也不打紧,本地表兜着底呢,后面可以通过定时扫表的方式进行MQ消息的重新发送

从代码实现上来看用到了一些小众的 API ,前提知识储备:事务相关组件 TransactionSynchronizationManager 。通过 TransactionSynchronizationManager 我们可以拿到当前线程是否是事务线程,毕竟事务和线程挂钩。我们还可以通过 TransactionSynchronizationManager 为当前事务线程注册一些事件,例如 afterCommit 事件。当事务执行后触发我们的 afterCommit 事件进行真正的 MQ 消息的发送。

手把手带你debug流程

发来一个请求执行事务方法,事务方法里面处理好业务逻辑后,进行MQ可靠消息发送
在这里插入图片描述
由于可靠MQ消息发送被我们的自定义注解做过 @Around 切面处理,因此先走切面逻辑
在这里插入图片描述
来到切面后,由于此时的所有逻辑还在事务里面,因此并不会触发 joinPoint.proceed() 方法《此方法调用会触发 rocketMQTemplate.send(topic, build) 的执行》。开始调用 secureInvokeService.invoke(record, async) 进行MQ消息发送日志入库到本地表。
在这里插入图片描述
入库完了之后呢?开始注册一个 afterCommit 事件,注意这里仅仅是注册事件,并没有触发执行
在这里插入图片描述
注册完成后直接 return null 。其实这个切面针对事务线程就是一个空壳方法,作用仅仅是保存了一条本地MQ消息发送日志而已
在这里插入图片描述
到这一步已经完成了,本地事务与本地MQ消息表的数据原子性了,此时如果如下代码出现业务逻辑异常,不会触发MQ消息发送逻辑。是正常的,如果MQ本地表入库失败的话,业务逻辑会进行回滚。

@Transactional
public void sendSecureMsg(String testRocketMQ, String message, String ccc) {log.info("执行其他的业务逻辑");mqProducer.sendSecureMsg(testRocketMQ, message, ccc);
}

等待 sendSecureMsg 方法执行完成我们的自定义切面后,事务切面最终会进行事务的 commit 操作。commit 完成后调用之前注册过的 afterCommit 事件,具体事务源码可以看我主页的这篇文章:
全面解读spring注解事务失效场景,伪代码+图文深度解析spring源码运行过程
在这里插入图片描述
当事务提交后开始发送MQ消息

在这里插入图片描述
最终发MQ。发送失败重试几次,重试还是发送失败改本地MQ表的数据状态等待,定时任务扫描重新发即可。

在这里插入图片描述

通过 method.invoke(bean, args); 触发事务方法,事务会失效,即使此方法被自定义切面加强,由于切面中有判断如果当前线程不在事务内,执行的是方法本身的逻辑,因此走的是如下图圈红的地方
在这里插入图片描述
最终调用如下代码发送MQ

    @SecureInvokepublic void sendSecureMsg(String topic, Object body, Object key) {Message<Object> build = MessageBuilder.withPayload(body).setHeader("KEYS", key).build();else rocketMQTemplate.send(topic, build);}

本文总结

这个方案就是新增了一张本地消息表,记录消息发送失败的日志,且随当前业务事务一块提交。等到业务事务执行完毕后,在执行发送MQ逻辑,此时如果MQ发送失败了也不打紧,本地表兜着底呢,后面可以通过定时扫表的方式进行MQ消息的重新发送

如果还不懂这套方案童鞋可以先去搞懂一下,再来阅读本文效果更佳

  1. 事务方法失效场景。即必须通过代理对象进行的方法调用事务才会生效。
  2. 声明式事务整个的代理对象是如何创建、事务运行的整套流程

全面解读spring注解事务失效场景,伪代码+图文深度解析spring源码运行过程

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

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

相关文章

Nvidia Orin/Jetson +GMSL/RLINC/VbyOne/FPDLink 同轴AI多相机同步车载视觉解决方案

在本次演讲中&#xff0c;介绍了多相机同步技术在自主机器中的应用情况&#xff0c;围绕无人配送小车、控制器视觉传感器方案升级、人形机器人三个典型案例中如何为客户提供高效的多相机同步解决方案进行了详细的讲解&#xff0c;并进一步介绍如何通过创新的多相机同步技术&…

Spring Boot 统一数据返回格式

在 Spring Boot 项目中&#xff0c;统一的数据格式返回是一种良好的实践&#xff0c;它提高了代码的可维护性和一致性&#xff0c;并改善了客户端与服务端之间的通信。本文将介绍如何在 Spring Boot 中实现统一的数据格式返回。 1 为什么需要统一数据返回格式 ⽅便前端程序员更…

VS Code开发Python配置和使用教程

在Visual Studio Code (VSCode) 中配置和使用Python进行开发是一个相对直接的过程&#xff0c;下面是一份简明的指南&#xff0c;帮助你从零开始设置环境&#xff1a; 1. 安装Visual Studio Code 首先&#xff0c;确保你已经安装了Visual Studio Code。如果还没有安装&#x…

2024年03月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,共50分) 第1题 在Python中,hex(2023)的功能是?( ) A:将十进制数2023转化成十六进制数 B:将十进制数2023转化成八进制数 C:将十六进制数2023转化成十进制数 D:将八进制数2023转化成十进制数 答案:A …

JVM-之GC日志

一、 开启gc 日志 在项目中开启GC 日志打印后会查看gc 日志如下 nohup java -Xms768m -Xmx768m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath./dumplog/dumplog.log -Xloggc:./dumplog/gc.log -XX:PrintGCDetails -XX:PrintGCDateStamps -XX:PrintHeapAtGC -jar xxxx…

188M2传奇BLUEM2引擎源码开源版附带编译教程2024最新开源

2024最新开源188M2传奇BLUEM2引擎源码开源2版最初开源版本附带编译教程 源码下载地址&#xff1a;极速云 如果需要优惠可以选择第一版最初开源188M2传奇BLUEM2引擎源码开源1版最初开源版本附带编译教程2024最新开源

Android 通过布局生成图片

通过布局生成图片 首先效果图 在竖屏的情况下通过&#xff0c;一般情况下&#xff0c;只要布局在页面上可见&#xff0c;并显示全&#xff0c;通过布局生成图片&#xff0c;都可以&#xff0c;但是横屏就不行了&#xff0c;会出现图片显示不完全的情况。 val bitmap Bitmap.c…

HubSpot企业商机管理和销售自动化:提升业务效率的利器

在当今数字化时代&#xff0c;企业出海已成为拓展市场、增加营收的重要途径。然而&#xff0c;如何高效地管理商机和实现销售自动化&#xff0c;成为许多企业面临的挑战。HubSpot作为一款强大的营销、销售和服务自动化平台&#xff0c;为企业提供了全方位的解决方案。今天运营坛…

图解 BERT 模型

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

【Docker】docker-compose 常用命令

启动服务&#xff1a; docker-compose up 如果你想在后台运行服务&#xff0c;可以添加 -d 标志&#xff1a; docker-compose up -d 开启所有服务 docker-compose start 停止服务&#xff1a; docker-compose down 查看服务状态&#xff1a; docker-compose ps 查看…

5-21作业

流式域套接字 服务器端实现 #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <pthread.h> #include <semaphore.h> #include <…

【MiniCPM-V】win10本地部署OCR等性能测试

性能尝试 本地配置如下 --------------------------------------------------------------------------------------- | NVIDIA-SMI 546.80 Driver Version: 546.80 CUDA Version: 12.3 | |-----------------------------------------------------…

QQ名片满级会员装x助手HTML源码

源码介绍 QQ名片满级会员展示生成HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;保存素材去选择QQ个性名片-选择大图模板-把图上传照片墙即可 源码效果 源码下载 蓝奏云&#xff1a;http…

第18章-综合以上功能 基于stm32的智能小车(远程控制、避障、循迹) 基于stm32f103c8t6/HAL库/CubeMX/超详细,包含代码讲解和原理图

这个是全网最详细的STM32项目教学视频。 第一篇在这里: 视频在这里 STM32智能小车V3-STM32入门教程-openmv与STM32循迹小车-stm32f103c8t6-电赛 嵌入式学习 PID控制算法 编码器电机 跟随 第18章-综合以上功能 18-按键和app按钮切换功能 根据上面介绍&#xff0c;我们的模式可…

城市空气质量数据爬取分析可视化

城市空气质量数据爬取分析可视化 一、效果展示二、完整代码2.1 数据爬取代码2.2 数据分析代码一、效果展示 先来看一下数据情况以及可视化效果,本项目使用了pyecharts绘制了日历图、雷达图、折线图、柱状图、饼图和平行坐标系。完整代码附后: 数据如下: 日历图: 饼图: …

Go源码--sync库(1)

简介 这篇主要介绍 sync.Once、sync.WaitGroup和sync.Mutex sync.Once once 顾名思义 只执行一次 废话不说 我们看源码 英文介绍直接略过了 感兴趣的建议读一读 获益匪浅 其结构体如下 Once 是一个严格只执行一次的object type Once struct {// 建议看下源码的注解&#xf…

【找出缺失的观测数据】python

思路&#xff1a; 主要在于分配剩余的部分分配问题 代码&#xff1a; class Solution:def missingRolls(self, rolls: List[int], mean: int, n: int) -> List[int]:m len(rolls)total_sum (n m) * meantoset total_sum - sum(rolls)# 检查 toset 是否在可能的范围内i…

亚马逊高效广告打法及数据优化,亚马逊高阶广告打法课

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89342733 更多资源下载&#xff1a;关注我。 课程内容&#xff1a; 001.1-亚马逊的广告漏斗和A9算法的升级变化.mp4 002.2-流量入口解析和广告的曝光机制.mp4 003.3-标签理论 .mp4 004.4-不同广告类…

影响所有股票、债券和ETF交易!一文看懂美国“T+1”结算新规

T1对投资者有何好处&#xff1f;有哪些风险&#xff1f;T1已经到来&#xff0c;T0还远吗&#xff1f; 美股将在本周迎来历史性时刻。 从当地时间5月28日开始&#xff0c;美股交易结算周期将由T2缩短至T1&#xff0c;即投资者当天卖出的股票&#xff0c;在交易后一个工作日就能…

蓝牙模块唤醒原理是怎样的?

随着科技的发展&#xff0c;蓝牙技术已经广泛应用于各种设备&#xff0c;如智能手机、平板电脑、智能手表等。蓝牙模块作为一种重要的通信手段&#xff0c;为我们的生活带来了极大的便利。然而&#xff0c;蓝牙模块并不仅仅是用于传输数据的工具&#xff0c;它还具有一项独特的…