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,一经查实,立即删除!

相关文章

LeetCode //C - 132. Palindrome Partitioning II

132. Palindrome Partitioning II Given a string s, partition s such that every substring of the partition is a palindrome. Return the minimum cuts needed for a palindrome partitioning of s. Example 1: Input: s “aab” Output: 1 Explanation: The palind…

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…

Git如何将pre-commit也提交到仓库

我一开始准备将pre-commit提交到仓库进行备份的&#xff0c;但是却发现提交不了&#xff0c;即使我使用强制提交都不行。 (main) $ git add ./.git/hooks/pre-commit(main) $ git status On branch main nothing to commit, working tree clean# 强制提交(main) $ git add -f .…

医学预测模型进入临床实践的三个考量

医学预测模型进入临床实践的三个考量 预测模型能够从患者的临床数据中挖掘出有价值的信息&#xff0c;用于辅助诊断、预后评估、治疗决策和风险分层等。随着&#xff0c;临床预测模型不断地被构建出来&#xff0c;需要考虑的一个问题是临床预测模型如何进入临床实践&#xff0…

前端基础入门三大核心之JS篇:解锁JavaScript的魔法密钥

前端基础入门三大核心之JS篇&#xff1a;解锁JavaScript的魔法密钥 &#x1f9d9; 基础概念与作用&#xff1a;JS&#xff0c;不仅仅是“脚本”&#x1f468;‍&#x1f4bb; 基础语法探险&#xff1a;从Hello World到变量声明&#x1f3af; Hello JavaScript&#x1f4da; 变量…

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

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

Android 通过布局生成图片

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

异常捕获知识点

作用 通过异常捕获&#xff0c;可以避免当代码报错时&#xff0c;造成程序卡死的情况。 //将玩家输入的内容&#xff0c;存储string类型的变量&#xff08;容器&#xff09;中 string str Console.ReadLine(); //Parse转字符串为数值类型时&#xff0c;必须要合法合规 int i…

TCP/UDP 套接字的编写

文章目录 基础知识 socket编程UDP套接字编程TCP套接字编写 套接字编写注意事项 基础知识 IP地址&#xff1a;互联网协议地址&#xff08;Internet Protocol Address&#xff09;&#xff0c;分配给互联网互联中设备的单一标识&#xff0c;理解成生活中的邮箱地址是比较类似的。…

mac pro 解决No module named ‘_lzma‘

问题描述: Traceback (most recent call last): File "/Users/liutiecheng/Tylers Job/finetuning/tiny/train.py", line 1, in <module> import datasets …… import lzma File "/Users/liutiecheng/.pyenv/versions/3.9.2/lib/python3.9/lzma.py&quo…

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

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

图解 BERT 模型

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

busco,checkM2,checkM:基因组或MAG完整度分析

busco安装&#xff08;应该是一般用于真核生物&#xff09; mamba create -n BUSCO biopython1.79 conda activate BUSCO mamba install -c bioconda python3.8 sepp4.3.10 mamba install -c bioconda busco5.7.1 busco 使用 #下载数据库&#xff08;2024-01-08&#xff09…

【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 <…

Host头攻击

Host头攻击&#xff08;也被称为HTTP Host头注入攻击&#xff09;是一种Web安全漏洞&#xff0c;攻击者通过篡改HTTP请求中的Host头部字段来执行恶意操作。在HTTP协议中&#xff0c;Host头部字段用于指定请求所针对的域名&#xff0c;以便服务器能够正确地将请求路由到相应的We…