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

一种,基于,柔性,事务,分布式,解决,方案设计,探究 · 浏览次数 : 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 同步场景 常见的场

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

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

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

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

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

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

论文复现丨基于ModelArts实现Text2SQL

摘要:该论文提出了一种基于预训练 BERT 的新神经网络架构,称为 M-SQL。基于列的值提取分为值提取和值列匹配两个模块。 本文分享自华为云社区《基于ModelArts实现Text2SQL》,作者:HWCloudAI。 M-SQL: Multi-Task Representation Learni

实现动态表单的一种思路

区别于传统表单前后端配合联调的开发实现方式,动态表单通过一种基于元数据管理的配置化方法来实现表单的动态生成,并能根据配置自由增改删指定字段。实现特定需求的自助化。

【如何提高IT运维效率】深度解读京东云基于NLP的运维日志异常检测AIOps落地实践

日志在 IT 行业中被广泛使用,日志的异常检测对于识别系统的运行状态至关重要。解决这一问题的传统方法需要复杂的基于规则的有监督方法和大量的人工时间成本。我们提出了一种基于自然语言处理技术运维日志异常检测模型。

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

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

7.3 C/C++ 实现顺序栈

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

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

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