如何通过本地消息表实现分布式事务?

本地消息表步骤

通过本地消息表(也称为可靠消息表)实现分布式事务是一种常见的做法,用于保证在分布式环境中消息的可靠传递和事务的一致性。以下是使用本地消息表实现分布式事务的一般步骤:

  • 消息生产方(也就是发起方),需要额外建一个消息表,并记录消息发送状态。消息表和业务数据要在一个事务里提交,也就是说他们要在一个数据库里面。然后消息会经过MQ发送到消息的消费方。如果消息发送失败,会进行重试发送。

  • 消息消费方(也就是发起方的依赖方),需要处理这个消息,并完成自己的业务逻辑。此时如果本地事务处理成功,表明已经处理成功了,如果处理失败,那么就会重试执行。如果是业务上面的失败,可以给生产方发送一个业务补偿消息,通知生产方进行回滚等操作。

  • 生产方和消费方定时扫描本地消息表,把还没处理完成的消息或者失败的消息再发送一遍。

图片

分布式事务-本地消息表 (1).png

以下是具体步骤:

0. 创建本地消息表:

在数据库中创建一个本地消息表,用于存储待发送的消息以及消息的发送状态和相关信息。表结构可以包含字段如下:

  •  message_id:消息的唯一标识。

  • message_body:消息内容。

  • status:消息状态,如待发送、已发送等。

  • create_time:消息创建时间。

  • 其他字段,如重试次数、发送时间等。

1. 业务处理: 业务处理时通常进行db变更

2. 将业务变更信息插入记录表:在业务逻辑中,当需要发送消息时,首先将消息插入到本地消息表中,设置状态为待发送。

3. 发送消息,1、2、3步骤在同一个本地事务中。如果本地事务执行成功,提交本地事务和消息表的记录;如果本地事务失败,回滚本地事务和消息表的记录。

3.1,3.2. 消息确认机制:

单独创建一个后台线程或定时任务,定时扫描本地消息表中状态为待发送的消息,并将这些消息发送到消息队列。在成功发送到消息队列后,将消息表中对应的状态修改为已发送。此外,可以根据需要实现消息发送失败后的重试机制。

4. B系统消费消息:

消费者监听消息队列,解析消息内容。

5. B系统进行业务逻辑处理:

进行业务逻辑处理,更改DB。此步骤必须要保证幂等性

4、5 如果失败依赖3.1、3.2的定时投放

6. 确认消费完成:

当消息消费完成后,调用A系统进行状态变更

6、7如果失败相当于两个分布式系统的数据已经一致了,但是本地消息表的状态还是错的。这种情况下借助3.1、3.2的重新投放策略,让下游幂等处理再更改消息表的状态也能解决。或者A系统也可以查询B系统的处理状态,如果成功直接更改状态

注意事项

使用本地消息表实现分布式事务可以确保消息在分布式环境中的可靠传递和一致性。然而,需要注意以下几点:

  • 消息的幂等性: 消费者一定需要保证接口的幂等性,消息的幂等性非常重要,以防止消息重复处理导致的数据不一致。

  • 本地消息表的设计: 本地消息表的设计需要考虑到消息状态、重试次数、创建时间等字段,以便实现消息的跟踪和管理。

  • 定时任务和重试机制: 需要实现定时任务或者重试机制来确保消息的可靠发送和处理。

本地消息表实现分布式事务缺点及解决方式

  • 数据大时,消息堆积,扫表效率慢

  • 定时扫表存在延迟问题

消息堆积、扫表效率慢

  • 索引优化:在消息表中对状态字段增加索引,以加速扫表操作。索引可以加速消息的检索和筛选,从而提高操作效率。

  • 分页查询:将扫表操作划分为多次分页查询,避免一次性查询大量数据造成的性能问题。

  • 表较大时进行分库分表:如果表较大可以进行分库分表操作。

  • 多线程分段查询:

    • 如果有业务标识,可以通过业务标识进行多线程分段扫表查询。

    • 如果没有业务标识可以按区间查询比如线程1查询0-1000的数据,线程2查询1001-2000的数据。

定时任务扫表延迟问题

定时任务可能由于各种原因导致扫表延迟,进而影响事务处理的实时性。以下是一些应对方法:

  • 异步发送MQ改为同步调用接口:异步改为同步调用B系统接口,如果失败了再进行异步发送MQ消息。

  • 发送MQ延迟消息,去掉定时任务,避免大量扫表处理。

  • 分布式定时任务:使用分布式定时任务框架,将定时任务分散到多个节点上执行,以减少单个节点的压力,同时提高定时任务的稳定性和准确性。

  • 增加资源:增加定时任务执行节点的数量,以提高并发处理能力,减少延迟。

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

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

相关文章

力扣724. 寻找数组的中心下标(前后缀和)

Problem: 724. 寻找数组的中心下标 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 分别求取nums数组的前、后缀和(不包括当前元素),并比较当某个位置的前后缀和相等时,返回该位置; 复杂度 时间复杂度: …

电脑进水无法开机怎么办 电脑进水开不了机的解决方法

意外总是会不定时打破你的计划,电脑这类电器最怕遇到的除了火还有水,设备进水会导致数据丢失,那么我们遇到电脑进水怎么办?进水之后不正确处理也会引起很多不必要的麻烦. 解决办法 第一步:关机 如果您的电脑是在开…

软件测试面试常见问题【含答案】

一、面试技巧题(主观题) 序号面试题1怎么能在技术没有那么合格的前提下给面试官留个好印象?2面试时,如何巧妙地避开不会的问题?面试遇到自己不会的问题如何机智的接话,化被动为主动?3对于了解程度的技能,被…

软考33-上午题-【知识产权】-计算机软件的商业秘密权

一、商业秘密的定义 不为公众所知悉的,能为权利人带来经济利益、具有实用性并经权利人采取保密措施的技术信息和经营信息。 技术信息和经营信息是商业秘密的基本内容。 二、真题 真题1: 真题2: 申请专利、注册商标。 软件著作权&#xff0…

回归分析中的异方差性

在简单线性回归或多元线性回归中,我们对误差项做了一些基本假设。 简单线性回归: 多元线性回归: 假设条件: 1.误差均值为零 2.误差具有恒定方差 3.误差不相关 4.误差呈正态分布 第2个假设称为同方差性,因此&…

基于SSM实现的人事管理系统(源代码+数据库脚本)

文章目录 系统介绍技术选型成果展示账号地址及其他说明源码获取 系统介绍 系统演示 微信视频号:【全栈小白】查看视频 基于SSM实现的人事管理系统使用JavaEE开发,基于SpringMVCMybatis框架,该项目包含了用户管理、部门管理、职位管理、员工…

拯救者Legion Y9000K 2021H(82K6)原厂oem预装Win11系统镜像

lenovo联想拯救者Y9000K(82K6)原装出厂Windows11系统安装包下载,恢复出厂开箱状态 链接:https://pan.baidu.com/s/1DGWU7gctJerff6LJrgHD5w?pwdrbs5 提取码:rbs5 原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、Office…

Linux桌面

系统信息的截图 登录界面右下角可以切换 Ubuntu on Wayland ,虽然还是测试版,不过体验已经比之前的 Xorg 好多了,最笔记本上使用最影响体验的高分屏适配功能,在 wayland 中也是几乎完美支持的。 卸载 snap 这个 snap 是 Ubuntu …

WEB 3D技术 three.js 3D贺卡(4) 添加鼠标滚轮移动屏幕 改变贺卡文字功能

好,上文 WEB 3D技术 three.js 3D贺卡(3) 点光源灯光动画效果 那么 我们来做一下 鼠标滚动相机和滚动时不同文字的切换 首先 我们要设置多个场景 其实也不能完全叫场景 也可以说多个位置 反正简单说就是多个位置 展现多个场景 我们先在代码的最下面 加上一个对象数…

RocketMQ高可用架构涉及常用功能整理

RocketMQ高可用架构涉及常用功能整理 1. 集群高可用系统架构和相关组件1.1 架构说明1.2 相关概念说明1.3 消息模型1.3.1 点对点模型1.3.2 发布订阅模型1.3.3 消息过滤 2. rocketmq的核心参数3. rocketmq常用命令4. 事务性4.1 数据写入流程4.2 数据读流程4.3 事务消息 5. 疑问和…

Linux下HTTP隧道技术的应用场景与优势分析

亲爱的Linux侠们,今天我们来聊一聊Linux下HTTP隧道技术的应用场景与优势。在这个网络时代,HTTP隧道技术就如同一位神秘的“魔法师”,为我们解决了许多棘手的网络问题。 首先,让我们来看看HTTP隧道技术在哪些场景下能大展身手。 …

GenAI的“关键一跃”:推理与知识

当前的人工智能领域正通过生成式人工智能(GenAI)经历一场重大转变。这一转变不仅代表了技术上的飞跃,更标志着人工智能领域的范式转变,引发了有关GenAI的独特特性及其深远影响的关键问题讨论。 植根于计算革命的丰富历史&#xff…

JavaWeb——002JS Vue快速入门

目录 一、JS快速入门​编辑 1、什么是JavaScript?​编辑 2、JS引入方式​编辑 2.1、示例代码 3、JS基础语法 3.1、书写语法 3.2、变量​编辑 3.3、数据类型 3.4、运算符​编辑 3.5、流程控制语句​编辑 4、JS函数 4.1、第一种函数定义方式 function funcName(参数…

【统计分析数学模型】聚类分析

【统计分析数学模型】聚类分析 一、聚类分析1. 基本原理2. 距离的度量(1)变量的测量尺度(2)距离(3)R语言计算距离 三、聚类方法1. 系统聚类法2. K均值法 三、示例1. Q型聚类(1)问题描…

【2024软件测试面试必会技能】Appium自动化(4):Appium工作原理及Desired Capabilities配置

Appium工作原理 Appium工作原理图如下: 脚本请求——>4723端口appium server——>解析参数给PC端4724端口——>发送给设备4724端口——>通过设备4724端口发给bootstrap.jar——>Bootstrap.jar把命令发给uiautomator; sonWireProtocol&a…

java常用应用程序编程接口(API)——Objects类和包装类

前言: Object类和Objects类是完全不同的两个类,之前有说过Object类,这次说一下Objects类。打好基础,daydayup! Object类可以看这篇:java常用应用程序编程接口(API)——Object类概述及常用方法 O…

计算机网络基础之计算机网络组成与分类

计算机网络基础 计算机网络是计算机技术与通信技术发展相结合的产物,并在用户需求的促进下得到进一步的发展。通信技术为计算机之间的数据传输和交换提供了必需的手段,而计算机技术又渗透到了通信领域,提高了通信网络的性能。 计算机网络的…

【谈一谈】: 我们工作中的单例模式有哪些写法?

单例模式的多种写法 我们要实现一个单例,首先最重要的是什么? 当然是把构造函数私有化,变成private类型,(为啥? 单例单例,如果谁都能通过构造函数创建对象,还叫单例吗?是不~) 嗯~我们构造函数私有化后,我们应该操作啥呢? 接着我们需要提供一个方法,这个方法要保证初始化有且…

数据脱敏(六)脱敏算法-加密算法

脱敏算法篇使用阿里云数据脱敏算法为模板,使用算子平台快速搭建流程来展示数据 "加密脱敏"是一种数据处理技术,主要用于保护个人隐私和数据安全。它通过将敏感信息(如姓名、身份证号、电话号码等)进行加密处理,使其无法…

阿里同学聊测试开发与测试平台

在一线大厂,没有测试这个岗位,只有测开这个岗位,即使是做业务测试,那么你的title也是测开。 所以想聊一聊测开的看法,但不代表这是正确的看法,仅供参考。 没来阿里之前我对测开的看法 一直以为专职做自动…