首页 > 其他分享 >分布式事务一致性:本地消息表设计与实践

分布式事务一致性:本地消息表设计与实践

时间:2024-09-21 19:19:14浏览次数:7  
标签:COMMENT status 发送 消息 本地 一致性 NULL 分布式

概念

本地消息表是一种常见的解决分布式事务问题的方法。其核心思想是将分布式事务拆分成本地事务来处理,通过消息队列来保证各个本地事务的最终一致性。

实现步骤

  • 创建本地消息表:在数据库中创建一个本地消息表,用于存储待发送的消息以及消息的发送状态和相关信息。表结构通常包含字段如 message_id(消息唯一标识)、message_body(消息内容)、status(消息状态,如待发送、已发送等)、create_time(消息创建时间)等;

  • 业务处理与消息记录:在业务逻辑中,当需要发送消息时,首先将消息插入到本地消息表中,设置状态为待发送。然后执行业务逻辑,并将业务变更信息与消息记录插入操作放在同一个本地事务中;

  • 消息发送:创建一个后台线程或定时任务,定时扫描本地消息表中状态为待发送的消息,并将这些消息发送到消息队列。在成功发送到消息队列后,将消息表中对应的状态修改为已发送;

  • 消息消费:消费者监听消息队列,解析消息内容,并执行相应的业务逻辑处理。此步骤必须保证幂等性,即多次消费相同的消息不会导致数据不一致;

  • 消息状态确认:当消息消费完成后,进行状态变更。如果消费失败,需要根据失败原因进行重试或人工处理;

在这里插入图片描述

注意事项

  • 消息的幂等性:消费者必须保证接口的幂等性,以防止消息重复处理导致的数据不一致;
  • 本地消息表的设计:需要考虑到消息状态、重试次数、创建时间等字段,以便实现消息的跟踪和管理;
  • 定时任务和重试机制:实现定时任务或者重试机制来确保消息的可靠发送和处理;

缺点及解决方式

  • 消息堆积、扫表效率慢:可以通过索引优化、分页查询、分库分表、多线程分段查询等方法提高效率;
  • 定时任务扫表延迟问题:可以通过异步发送MQ改为同步调用接口、发送MQ延迟消息、分布式定时任务等方法减少延迟;

应用场景

本地消息表适用于金融、电商等领域,尤其适用于涉及多个服务交互的复杂交易场景,如资金转账、订单创建等。通过其强大功能,可以确保在分布式环境中实现事务的一致性和可靠性,有效防止数据不一致的问题。

通过上述方法,可以在不使用开源框架的情况下,利用本地消息表实现分布式事务,保证数据的一致性和系统的稳定性。

实际使用

下面是一个消息表的设计

CREATE TABLE ` mq_notify ` (
  ` id ` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  ` payment_no ` varchar(30) NOT NULL COMMENT '订单号',
  ` message ` varchar(1000) DEFAULT NULL COMMENT 'mq message',
  ` retry ` tinyint(4) NOT NULL COMMENT '发送剩余次数',
  ` status ` tinyint(4) NOT NULL COMMENT '状态',
  ` yn ` tinyint(4) NOT NULL COMMENT '是否有效',
  ` create_time ` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  ` update_time ` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
  PRIMARY KEY (` id `) ,
  KEY ` idx_status ` (` status `)
) ENGINE = InnoDB COMMENT = 'mq消息表'

在插入消息表时,可以设置重试的最大次数,比如 3。

在定时任务扫描时,筛选retry > 0 且 status = 'init' 的消息记录,发送mq成功,status 更新为'finish',发送mq失败,retry 次数减一。

如果消息发送 3 次还没有成功,此时就需要报警人工介入了。

标签:COMMENT,status,发送,消息,本地,一致性,NULL,分布式
From: https://blog.csdn.net/yqq962464/article/details/142392487

相关文章

  • 远程访问本地基于Debian Linux用于运行虚拟机和容器的Proxmox VE
    文章目录前言1.局域网访问PVE2.安装Cpolar工具3.创建PVE公网地址4.远程访问PVE5.设置固定域名6.固定地址访问前言本文主要介绍如何在Windows环境安装内网穿透工具,实现公网环境远程访问本地局域网中的ProxmoxVE平台WEB管理界面。ProxmoxVE是一个完全开源......
  • 了解“无法获取本地颁发者证书”错误
    在SSL/TLS领域,“无法获取本地颁发者证书”错误是开发人员和系统管理员在使用安全连接时遇到的常见障碍。当证书链无法完全验证时,通常会出现此错误,这意味着系统无法验证证书的真实性,因为它无法识别颁发者。了解此错误对于确保依赖SSL/TLS的Web应用程序、服务器和其他系统中的......
  • uniapp - 实现安卓App打包上架应用商店详细教程,详解Hbuilder打包编译apk发布上传到应
    前言【苹果App】打包上架Appstore应用商店,请访问。在uni-app安卓App项目开发中,详解打包app及上架应用市场教程,uniapp打包app安卓应用并发布到软件商店,提供多种方式打包编译为APK文件(HbuilderX云打包/本地原生打包/离线打包),附带申请Android签名证书多种方法、对要上......
  • Redis面试题-如何保持缓存一致性
    1、延迟双删延迟双删策略是一种用于解决缓存与数据库之间数据一致性问题的方法。其基本思想是在更新数据库时,通过两次删除缓存的操作来尽可能地保证数据的一致性。具体步骤包括:首先,在更新数据库之前删除缓存;然后,执行数据库更新操作;最后,在延迟一段时间后再次删除缓存。优点:减......
  • 在一台服务器docker下载mysql和redis镜像,保存到本地,然后在另外一台服务上导入镜像
    要在一台服务器上下载MySQL和Redis的Docker镜像并保存到本地,然后在另一台服务器上导入镜像,您可以按照以下步骤进行操作:步骤1:在第一台服务器上下载MySQL和Redis镜像下载MySQL镜像:dockerpullmysql:latest下载Redis镜像:dockerpullredis:latest步骤2:......
  • 将阮一峰老师的《ES6入门教程》的源码拷贝本地运行和发布
    你好同学,我是沐爸,欢迎点赞、收藏、评论和关注。阮一峰老师的《ES6入门教程》应该是很多同学学习ES6知识的重要参考吧,应该也有很多同学在看该文档的时候,想知道这个教程的前端源码是怎么实现的,也可能有同学下载了源码,发现运行起来不能正常切换,然后放弃了。今天分享下《ES6......
  • 本地搭建虚拟机以及配置记录
    1.下载镜像&安装1.1VMware安装略。1.2CentOS安装1)下载CentOShttps://mirrors.aliyun.com/centos/7/isos/x86_64/?spm=a2c6h.25603864.0.0.11444511lXIy8R 2)一路默认,参数自由选择。3)配置网络、日期和时间、硬盘格式化 参数注1:如果设置网络的时候,显......
  • xxl-job适配sqlite本地数据库及mysql数据库。可根据配置指定使用哪种数据库。
    xxl-job整合sqlite根据mysql的脚本,整理为sqlite的脚本,详见tables_xxl_job.sqllite.sql创建sqlite数据库文件并执行上述sql,得到xxl-job-admin的resource下db/xxl-jobxxl-job-admin的pom中添加sqlite驱动依赖<!--sqlite-jdbc--> <dependency> <groupId>org.xeria......
  • 实战教程:Minio与etcd本地部署 + Milvus本地数据库配置(亲测成功)
    一.minio本地部署1.获取安装包wgethttps://dl.minio.io/server/minio/release/linux-amd64/miniowgethttps://dl.min.io/client/mc/release/linux-amd64/mcchmod+xminiochmod+xmc#命令移到系统路径直接调用命令cpminio/use/local/bincpmc/use/local/......
  • 集中式存储和分布式存储的优缺点
    集中式存储和分布式存储是两种常见的存储架构,它们各自具有不同的优缺点,适用于不同的业务场景。集中式存储的优缺点:优点:数据传输速度快:集中式存储通常提供高速的数据传输能力,传输损耗低,稳定性好。对结构化数据支持性好:非常适合数据库、虚拟化环境等需要处理结构化数据的场景。存储稳......