当前位置: 首页 > news >正文

基于本地事务表+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.lryc.cn/news/526140.html

相关文章:

  • 数据结构:二叉树—面试题(一)
  • 【Wordpress网站制作】切换语言的问题
  • 【第二天】零基础入门刷题Python-算法篇-数据结构与算法的介绍-五种常见的排序算法(持续更新)
  • Neural networks 神经网络
  • 汽车免拆诊断案例 | 2007 款日产天籁车起步加速时偶尔抖动
  • 代码随想录day3
  • Spring 面试题【每日20道】【其一】
  • leetcode刷题记录(八十九)——35. 搜索插入位置
  • Flutter 与 React 前端框架对比:深入分析与实战示例
  • 基于Docker的Spark分布式集群
  • Web 代理、爬行器和爬虫
  • MySQL 事件调度器
  • 直线拟合例子 ,岭回归拟合直线
  • Flutter android debug 编译报错问题。插件编译报错
  • 关于IPD流程的学习理解和使用
  • C# 类(Class)
  • Jenkins pipline怎么设置定时跑脚本
  • PostgreSQL模糊查询相关学习参考
  • 【电脑无法通过鼠标和键盘唤醒应该怎么办】
  • Java 大视界 -- Java 大数据中的数据脱敏技术与合规实践(60)
  • Vue3.5 企业级管理系统实战(三):页面布局及样式处理 (Scss UnoCSS )
  • 【xcode 16.2】升级xcode后mac端flutter版的sentry报错
  • windows在命令行中切换盘符
  • 亚博microros小车-原生ubuntu支持系列:11手指控制与手势识别
  • JAVA-快速排序
  • 日志收集Day003
  • 基于quartz,刷新定时器的cron表达式
  • 数学大模型MAmmoTH:通过混合说明调整建立数学通才模型
  • Opencv学习
  • python生成图片和pdf,快速