基于本地事务表+MQ实现分布式事务

基于本地事务表+MQ实现分布式事务

  • 引言
    • 1、原理
    • 2、本地消息表优缺点
    • 3、代码实现
      • 3.1、代码执行流程
      • 3.2、项目结构
      • 3.3、项目源码

引言

本地消息表的方案最初由ebay的工程师提出,核心思想是将分布式事务拆分成本地事务进行处理。本地消息表实现最终一致性。本文主要学习mallchat开源项目中的实现方案,向mallchat开发团队致敬!

1、原理

分布式事务解决方案有许多比如二阶段提交、TCC、最大努力通知、Saga事务等,本文介绍本地消息表+MQ这种方式解决分布式事务消息最总一致性问题。目前利用本地消息表+MQ方案实现最终消息一致性的比较多,它的核心思想是,将分布式事务拆分成本地事务进行处理,不同事务之间通过消息表和MQ通信,最后通过定时任务扫描失败的数据进行重试,当在有效重试次数限制内,再次重试回调失败的数据,最终实现消息重复发送,达到一致性。
在这里插入图片描述
在这里插入图片描述

2、本地消息表优缺点

本地消息表实现了分布式事务的最终一致性,优缺点比较明显。
优点
1.实现逻辑简单,开发成本比较低
缺点
1.与业务场景绑定,高耦合,不可公用
2.本地消息表与业务数据表在同一个库,占用业务系统资源,量大可能会影响数据库性能

3、代码实现

首先本地启动rocketmq服务。

1:在D:\rocketmq-all-5.3.1-bin-release\bin目录下,执行cmd命令
启动服务
start mqnamesrv.cmd
启动broker
start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true
关闭服务
mqshutdown namesrv
关闭broker
mqshutdown broker
2:启动rocketmq-dashboard项目,输入127.0.0.1:8080进入可视化界面

其中rocketmq-dashboard可视化代码参考windows下安装启动rocketmq可视化界面
将rocketmq-dashboard导入到idea中,在idea编译启动。
在这里插入图片描述

3.1、代码执行流程

请添加图片描述
由于在代码中写死了模拟1/3概率发送消息失败,所以刚开始会将数据插入secure_invoke_record,然后通过TransactionSynchronizationManager执行后置处理,最后通过定时任务,扫描失败的任务,从secure_invoke_record取出数据利用MQ再次重试,并且删除secure_invoke_record表刚刚重试的数据,最后执行完成,达到消息最终一致性。
(1)数据库层面执行验证效果
刚开始1/3概率发送消息失败,通过切面将消息保存到本地消息表secure_invoke_record中。
请添加图片描述
可以看出创建时间为00:25,下一次重试时间为00:27,到了00:27定时任务启动,执行重试,成功后把这个本地消息删除,并重发MQ
请添加图片描述

自定义的topic也已经经过重试发送消息成功
在这里插入图片描述
(2)本地idea控制台日志层面分析
在这里插入图片描述
在这里插入图片描述

在时间为00:25发送失败,写入本地消息表。在重试时间为00:27,发送MQ消息成功。

3.2、项目结构

在这里插入图片描述
主要提交代码如下
在这里插入图片描述
提交MR地址

3.3、项目源码

项目源码demo-springboot-mybatisplus,欢迎star!

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

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

相关文章

HTML<label>标签

例子 三个带标签的单选按钮&#xff1a; <form action"/action_page.php"> <input type"radio" id"html" name"fav_language" value"HTML"> <label for"html">HTML</label><br&…

2025,“鱿鱼游戏”闯入AI赛道

文 | 智能相对论 作者 | 叶远风 “鱿鱼游戏”一词随着同名剧集的火爆而持续走红&#xff0c;在全球范围掀起了广泛热议。而这种无限生存流的游戏模式&#xff0c;既残酷又现实&#xff0c;像极了商业市场的搏杀与淘汰。 1月20日&#xff0c;DeepSeek发布了全新的开源推理大模…

CSS 中的 id 和 class 选择器

在 CSS 中&#xff0c;id 和 class 是两个常用的选择器&#xff0c;它们用于为 HTML 元素添加样式。虽然它们的功能相似&#xff0c;但在使用场景和具体用法上有很大的区别。本文将详细介绍 id 和 class 的区别&#xff0c;并通过实例帮助你更好地理解它们的应用场景&#xff0…

Prometheus+grafana实践:Doris数据库的监控

文章来源&#xff1a;乐维社区 Doris数据库背景 Doris&#xff08;Apache Doris&#xff09;是一个现代化的MPP&#xff08;Massive Parallel Processing&#xff0c;大规模并行处理&#xff09;数据库&#xff0c;主要用于在线分析处理&#xff08;OLAP&#xff09;场景。 D…

【unity游戏开发之InputSystem——02】InputAction的使用介绍(基于unity6开发介绍)

文章目录 前言一、InputAction简介1、InputAction是什么&#xff1f;2、示例 二、监听事件started 、performed 、canceled1、启用输入检测2、操作监听相关3、关键参数 CallbackContext4、结果 三、InputAction参数相关1、点击齿轮1.1 Actions 动作&#xff08;1&#xff09;动…

现代JavaScript网页设计

现代JavaScript网页设计&#xff1a;打造沉浸式3D粒子交互系统 案例概述 本文将实现一个基于WebGL的3D粒子交互系统&#xff0c;结合物理引擎与光线追踪技术&#xff0c;创造出具有以下高级特性的现代网页体验&#xff1a; 动态粒子矩阵&#xff08;100,000粒子实时渲染&…

基于 WEB 开发的在线学习系统设计与开发

标题:基于 WEB 开发的在线学习系统设计与开发 内容:1.摘要 摘要&#xff1a;随着互联网技术的飞速发展&#xff0c;在线学习已经成为一种重要的学习方式。本文介绍了基于 WEB 开发的在线学习系统的设计与开发过程。该系统采用了 B/S 架构&#xff0c;使用 Java 语言和 MySQL 数…

从Spring请求处理到分层架构与IOC:注解详解与演进实战

引言 在Spring开发中&#xff0c;请求参数处理、统一响应格式、分层架构设计以及依赖管理是构建可维护应用的核心要素。然而&#xff0c;许多开发者在实践中常面临以下问题&#xff1a; 如何规范接收不同格式的请求参数&#xff1f; 为何要引入分层架构&#xff1f; 什么是控…

逐笔成交逐笔委托Level2高频数据下载和分析:20250124

逐笔成交逐笔委托下载 链接: https://pan.baidu.com/s/1UWVY11Q1IOfME9itDN5aZA?pwdhgeg 提取码: hgeg Level2逐笔成交逐笔委托数据分享下载 通过Level2逐笔成交与逐笔委托的详细数据&#xff0c;这种以毫秒为单位的信息能揭示许多关键点&#xff0c;如庄家意图、误导性行为&…

详解Redis的Zset类型及相关命令

目录 Zset简介 ZADD ZCARD ZCOUNT ZRANGE ZREVRANGE ZRANGEBYSCORE ZPOPMAX BZPOPMAX ZPOPMIN BZPOPMIN ZRANK ZREVRANK ZSCORE ZREM ZREMRANGEBYRANK ZREMRANGEBYSCORE ZINCRBY ZINTERSTORE 内部编码 应用场景 Zset简介 有序集合相对于字符串、列表、哈希…

深度解析:哪种心磁图技术是心脏检查的精准之选?

在全球心血管疾病的阴影日益笼罩的今天&#xff0c;医学界正积极寻求一种无损、无创、无辐射的心脏健康监测方式。心磁图仪&#xff08;MCG&#xff09;&#xff0c;这一前沿技术&#xff0c;凭借其独特的优势&#xff0c;悄然成为心脏电磁功能监测的新星。它不仅为心肌缺血、心…

jupyter配置说明

使用以下命令修改jupyter的配置文件参数&#xff1a; vim /root/.jupyter/jupyter_lab_config.py #这里填写远程访问的IP名&#xff0c;填*则默认是主机IP名 c.ServerApp.ip * # 这里的密码填写上面生成的密钥 c.ServerApp.password ************************************…

对grid布局有哪些了解【css】

CSS Grid 布局是现代网页设计中非常强大的布局方式之一&#xff0c;它能够使你以更加灵活且直观的方式来设计网页的布局&#xff0c;特别适用于复杂的多行多列的布局。它允许你在网页上创建非常精确的网格&#xff0c;帮助你把内容放置在多个行和列中。 1. Grid 布局的基本概念…

Node.js下载安装及环境配置教程 (详细版)

Node.js&#xff1a;是一个基于 Chrome V8 引擎的 JavaScript 运行时&#xff0c;用于构建可扩展的网络应用程序。Node.js 使用事件驱动、非阻塞 I/O 模型&#xff0c;使其非常适合构建实时应用程序。 Node.js 提供了一种轻量、高效、可扩展的方式来构建网络应用程序&#xff0…

软件越跑越慢的原因分析

如果是qt软件&#xff0c;可以用Qt Creator Profiler 作性能监控如果是通过web请求&#xff0c;可以用JMeter监控。 软件运行过程中逐渐变慢的现象&#xff0c;通常是因为系统资源&#xff08;如 CPU、内存、磁盘 I/O 等&#xff09;逐渐被消耗或软件中存在性能瓶颈。这个问题…

leetcode_链表 203.移除链表元素

203.移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回新的头节点 。 # Definition for singly-linked list. # class ListNode(object): # def __init__(self, val0, nextNone): # …

日志收集Day005

1.filebeat的input类型之filestream实战案例: 在7.16版本中已经弃用log类型,之后需要使用filebeat,与log不同&#xff0c;filebeat的message无需设置就是顶级字段 1.1简单使用&#xff1a; filebeat.inputs: - type: filestreamenabled: truepaths:- /tmp/myfilestream01.lo…

Vue中设置报错页面和“Uncaught runtime errors”弹窗关闭

文章目录 前言操作步骤大纲1.使用Vue自带的报错捕获机制添加报错信息2.在接口报错部分添加相同机制3.把报错信息添加到Vuex中方便全局使用4.添加报错页面备用5.app页面添加if判断替换报错界面 效果备注&#xff1a;vue项目中Uncaught runtime errors:怎样关闭 前言 在开发Vue项…

01、硬件设计常用经典电路

前言 一直想入职嵌入式软件&#xff0c;但是25年作为学历一般的应届生真是太难了&#xff0c;于是今年实习就不想跑太远了&#xff0c;就在老家5线小城市进入了一家小企业&#xff0c;当电子工程师实习&#xff08;学徒&#xff09;。 抱着入职什么&#xff0c;就学习什么的态…

使用Cline+deepseek实现VsCode自动化编程

不知道大家有没有听说过cursor这个工具&#xff0c;类似于AIVsCode的结合体&#xff0c;只要绑定chatgpt、claude等大模型API&#xff0c;就可以实现对话式自助编程&#xff0c;简单闲聊几句便可开发一个软件应用。 但cursor受限于外网&#xff0c;国内用户玩不了&#xff0c;…