一种基于柔性事务的分布式事务解决方案设计探究

一种,基于,柔性,事务,分布式,解决,方案设计,探究 · 浏览次数 : 623

小编点评

**背景** * 常见分布式事务场景: * 同步场景:方法内依赖外部微服务多个同步接口,等同步接口返回再展开后续逻辑。 * 异步场景:方法内依赖外部微服务多个同步接口同时,本地事务提交并发出异步MQ。 **解决方案** **3.1 数据模型设计事务表** * 记录每次同步方法执行的状态: * 1-进行中(同步方法执行开始) * 2-已完成(同步方法执行成功) * 3-失败(同步方法执行失败) * 4-已回滚(回滚方法执行成功) **3.2 设计原理原理** * 1. 首先每个方法提供回滚接口。 * 2. 事务内每次同步方法执行时,优先维护入参数据到事务表。 * 3. 如果方法执行失败,结束整个事务,并更新事务表状态=失败。 * 4. 事务表通过轮询状态status=3(失败)事务,调用回滚接口。 * 5. 回滚逻辑:找到事务表中失败的执行方法的顺序值,只调用小于失败顺序值的所有回滚接口、入参。 **3.3 执行时序图** **3.4 回滚失败处理方案** * 遇到回滚接口失败,重试机制调用相同方法的接口。 * 避免脏数据,仅使用成功方法的返回结果进行回滚。 **4. 注意问题回滚服务的幂等性** * 确保回滚服务重试机制满足幂等性要求。 **5. 总结** * 本方案提供了一种基于柔性事务设计的简单易上手的分布式事务设计方案,可解决常见的分布式事务常见场景。 * 该方案通过维护事务服务和事务服务中心对应数据表,从而保证整个分布式事务的完整性。 * 实现方式简单、轻量、易于操作,方便地解决了常见分布式事务场景。

正文

1 背景

市面上常见的有,2pc/3pc、tcc、saga等常见的分布式事务解决方案,但是实际实施起来框架比较重,设计开发比较繁琐,不易于快速开发上手。本文提供一种基于柔性事务设计的简单易上手的分布式事务设计方案,用于解决常见的分布式事务常见场景。

2 常见分布式事务场景

2.1 同步场景

常见的场景,方法内依赖外部微服务多个同步接口,等同步接口返回再展开后续逻辑,如下图1描述。


图1 分布式事务同步场景

存在的问题:B/C失败后,A/B不能回滚,造成数据不一致?

2.2 异步场景

方法内依赖外部微服务多个同步接口同时,本地事务提交并发出异步MQ,如下图2描述。


图2 分布式事务异步场景

存在的问题:询价系统无法保证本地事务和mq消息的发送同时成功或失败,会造成数据不一致。

3 解决方案

3.1 数据模型设计

事务表:记录每次同步方法执行的状态,包括:1-进行中(同步方法执行开始)、2-已完成(同步方法执行成功)、3-失败(同步方法执行失败)、4-已回滚(回滚方法执行成功);

方法调用表:记录一个完整的事务内所有方法的执行前入参、同步方法接口、回滚接口、回滚入参、方法执行顺序,如下图3描述:


图3 事务服务数据模型

3.2 设计原理

原理:一个完整事务内,1.首先每个方法提供回滚接口,其次,事务内每次同步方法执行时,优先维护入参数据到事务表,方便后续做回滚补偿;2.整个事务内某一个方法执行失败时,结束整个事务,并更新事务表状态=失败;3.事务表通过轮询状态status=3(失败)事务,调用回滚接口,利用回滚入参进行接口补偿;4.回滚逻辑:找到事务表中失败的执行方法的顺序值,只调用小于失败顺序值的所有回滚接口、入参,注意并不回滚失败值的接口,并根据顺序倒序进行接口回滚补偿。


图4 回滚原理图

3.3 执行时序


图5 回滚执行时序图

3.4 回滚失败处理方案:

  1. 事务服务的高可用保障:柔性事务前提是保证事务服务高可用性,重点保障;
  2. 回滚服务重试机制:回滚接口失败重试机制,保证数据一致性;
  3. 为了避免架构复杂度,做日志记录、报警、人工处理。

4 注意问题

  1. 回滚服务的幂等性:回滚做好业务防重和系统防重,防止因为回滚带来的业务数据不一致;
  2. 脏数据:整个事务中某一方法执行失败,前面调用方法的数据作为脏数据使用。简单的解决方案:依赖事务表整个事务执行状态来决定能否使用脏数据。但缺点就是这样会耦合业务逻辑;
  3. 中心化:整个事务的维护完全依赖事务服务完成,需要保证事务服务的高可用性;
  4. 实时性:事务维护本方案通过定时任务维护,如果业务场景有实时性要求,方式可以改为:在整个事务中某一方法执行失败时,catch异常,catch内更新任务状态成功时,直接进行回滚逻辑调用。

5 总结

除了通过常规本地大事务保证事务完整性方案,本次方案提供了一套基于柔性事务回滚补偿的方式来保证分布式事务,通过维护事务服务和事务服务中心对应数据表,从而保障整个分布式事务的完整性。实现方式简单、轻量、易于操作,方便地解决了常见分布式事务场景。


作者:郑朋辉

与一种基于柔性事务的分布式事务解决方案设计探究相似的内容:

一种基于柔性事务的分布式事务解决方案设计探究

1 背景 市面上常见的有,2pc/3pc、tcc、saga等常见的分布式事务解决方案,但是实际实施起来框架比较重,设计开发比较繁琐,不易于快速开发上手。本文提供一种基于柔性事务设计的简单易上手的分布式事务设计方案,用于解决常见的分布式事务常见场景。 2 常见分布式事务场景 2.1 同步场景 常见的场

AI天后,在线飙歌,人工智能AI孙燕姿模型应用实践,复刻《遥远的歌》,原唱晴子(Python3.10)

忽如一夜春风来,亚洲天后孙燕姿独特而柔美的音色再度响彻华语乐坛,只不过这一次,不是因为她出了新专辑,而是人工智能AI技术对于孙燕姿音色的完美复刻,以大江灌浪之势对华语歌坛诸多经典作品进行了翻唱,还原度令人咋舌,如何做到的? 本次我们借助基于Python3.10的开源库so-vits-svc,让亚洲天

一种基于E3处理器平台的NAS完整方案(从电脑组装到网站部署)

本文介绍了本人基于E3平台搭建NAS系统的一套完整方案,内容涵盖了硬件选择,系统选择,网盘软件与内网穿透方法。

一种基于光电容积波的血压测量神经网络算法,开源、低功耗、低成本的人工智能软硬件提供者

具体的软硬件实现点击 http://mcu-ai.com/ MCU-AI技术网页_MCU-AI人工智能 心血管疾病是最严重的死亡原因之一,每年在全世界造成严重的生命损失。持续监测血压似乎是最可行的选择,但这需要一个侵入性的过程,带来了几层复杂性。这促使我们开发一种方法,通过使用光体积描记图(PPG)

一种基于图片搜索视频的方案

随着移动互联网发展,手机端购物已成为人们生活的常态。人们在搜索商品时采用的手段也越来越丰富,当前的主要搜索方式是文本搜索与拍照搜索。

一种基于实时大数据的图指标解决方案

在电商金融等多个领域,现在主要利用图来建模,并由业务人员根据图指标提出需求。但图指标时效性差、创建修改程序十分繁琐,元数据没有同意的管理分类,这导致开发运维都十分困难,根据此痛点,今天来介绍一项基于实时大数据的图指标解决方案。

鸿蒙HarmonyOS实战-Web组件(基本使用和属性)

前言 Web是一种基于互联网的技术和资源的网络服务系统。它是指由许多互连的计算机组成的全球性计算机网络,使用户能够通过浏览器访问和交互式使用各种信息和资源,如网页、文档、图片、视频、音频等。通过Web,用户可以浏览网页、发送电子邮件、参与在线社交网络、进行在线购物等各种活动。Web的核心技术包括

Linq开发技巧与业务逻辑校验

Linq 是一种基于 .NET Framework 的编程语言,它的出现极大地提高了开发效率。Linq 提供了一种统一的查询语法,使得开发人员可以使用一种语言来查询不同类型的数据源,包括对象、集合、数据库等。这种语言非常直观和简洁,可以大大减少编写代码的时间和工作量。但是,随着业务逻辑的复杂性增加,

7.3 C/C++ 实现顺序栈

顺序栈是一种基于数组实现的栈结构,它的数据元素存储在一段连续的内存空间中。在顺序栈中,栈顶元素的下标是固定的,而栈底元素的下标则随着入栈和出栈操作的进行而变化。通常,我们把栈底位置设置在数组空间的起始处,这样在进行入栈和出栈操作时,只需要维护栈顶指针即可。顺序栈的实现比较简单,它只需要一个数组和一个整型变量`top`即可。其中,数组用于存储栈中的元素,top则用于记录当前栈顶元素在数组中的位置。当

7.5 C/C++ 实现链表队列

链表队列是一种基于链表实现的队列,相比于顺序队列而言,链表队列不需要预先申请固定大小的内存空间,可以根据需要动态申请和释放内存。在链表队列中,每个节点包含一个数据元素和一个指向下一个节点的指针,头节点表示队头,尾节点表示队尾,入队操作在队尾插入元素,出队操作在队头删除元素,队列的长度由节点数量决定。由于链表队列没有容量限制,因此可以处理任意数量的元素,但是相比于顺序队列,链表队列的访问速度较慢,因