首页 > 其他分享 >分布式事务的华丽进化

分布式事务的华丽进化

时间:2023-08-15 11:22:13浏览次数:32  
标签:事务 method2 进化 业务 任务 华丽 定时 分布式

说到分布式事务,大家并不陌生。在实际工作中,用得比较多的还是柔性分布式事务,今天主要把在工作中运用到的几种柔性分布式事务的场景及实现方式做一个简单介绍,也可以看做是柔性分布式事务的一个演进过程。

一、调用方保证

这种方式适合业务内自己使用,当方法内的任务一个逻辑发生异常时,整个方法都异常,由调用方进行重试。该方法不太适合于外部系统的交互,否则,这就是把自己的命运交到别人的手里,是比较危险的做法。

在上述调用示意图中,内部应用APP1和APP2之间,APP1的方法method1调用APP2里的method2方法,method2里有分布式事务逻辑,当分布式事务中的逻辑异常后,method2方法都失败或抛出异常,method1收到返回值是失败或异常后,都需要重试调用method2,确保method2执行成功。method2本身则需要确保逻辑中已经成功的逻辑再次被调用时处理也要正确。

@DistributedTransaction
method2(){
    //write DB
    //send msg
    //RPC invoke
}


该方法不建议大家在工作中使用,仅从保证分布式事务的正确性看是可以使用的,但从Java的规范上看,这种方法属于用异常控制流程,并不是很规范。同时,如果分布式事务中的逻辑是写本地库,发消息或RPC远程调用,则一般不建议把事务和发消息或RPC调用放到事务方法内,避免大事务。

二、定时任务扫描业务表

该场景主要运用于流量小、业务场景较单一的场景,或是业务处于验证阶段,为了快速验证业务是否有价值阶段,直接用业务表来做任务表,避免建多张表。在用本地事务写完业务表后,事务正常提交即可。通过一个定时任务查询业务表的增量数据,在定时任务中处理其他业务逻辑。

@Transaction
void method1(){
    //write DB1 Bueiness Table
    //other business Logic
}

void method2(){
    //查询DB1中的Bueiness Table,时间从上次任务开始执行的时间开始
    //处理自身的业务逻辑
}


该方案一般作为过渡方案,最终业务量上来后,会升级到下面的本地任务表的方案。

三、本地任务表

这是比较典型的分布式事务的解决方案,即:在业务库中,同步建一个任务表。业务表和任务表在本地事务中同时写入,再由一个定时任务定时查询任务表,把任务读取到后根据业务逻辑要求进行处理。

业务表和任务表在一个数据库中,由数据库的一个事务控制器实现事务。在应用中,另起一个定时任务,由定时任务去查询任务表,把任务表中新进的任务抓取后执行该定时任务需要执行的业务逻辑。

@Transaction
void method1(){
    //write DB1 Bueiness Table
    //write DB1 Task Table
}

void method2(){
    //定时查询DB1中的Task Table
    //任务抓取后执行自身的业务逻辑
}


该方案实际运用时,定时任务的稳定性需要我们特别关注,定时任务的稳定性决定我们该方案的可用性。建议把定时任务的执行情况监控起来,确保有问题时能第一时间处理,避免影响业务。

四、组件抽取

目前,对于Java语言开发的团队,其框架大部分都以Spring为主,故可基于SpringEvent异步事件做一个小的组件封装。主要思路为在事务中,发送Event异步事件,当异步事件发送成功则事务提交结束,当异步事件发送失败则异步任务落本地数据库后事务再提交结束,然后通过定时任务从任务表中抓取任务执行。

该方案以SpringEvent异步事件为主做了一个组件,当SpringEvent异步事件发送异常后,降级到本地任务表,确保异步任务的可靠性。即使没有封装为组件,在实际工作中,还是比较推荐大家使用该方案。

@Transaction
void method1(){
    //业务数据写入DB成功
    try{
    //发送SpringEvent事件
    }catch(Exception ex){
    //写入本地任务表
    }
}

void method2(){
    //接收事件或定时任务的数据执行业务逻辑
}


当然,如果项目中没有使用Spring框架也没问题,有了上述的思想,可以根据自身使用的框架情况进行调整。正所谓“只要思想不滑坡,办法总比困难多”。

作者:京东物流 廖宗雄

来源:京东云开发者社区 自猿其说Tech 转载请注明出处

标签:事务,method2,进化,业务,任务,华丽,定时,分布式
From: https://www.cnblogs.com/Jcloud/p/17630790.html

相关文章

  • 分布式事务解决方案-2PC, 3PC
    在分布式系统中,每一个机器节点虽然都能明确的知道自己在事务操作中的结果是成功或失败,但无法直接获取其他节点的操作结果。因此在分布式环境中,为了保持事务的ACID特性,就需要增加一个“协调者”来管理其他节点(“参与者”)事务的提交和回滚。基于这个思想,衍生出二阶段提交2PC和三......
  • 大数据之分布式
    1.什么是计算、分布式计算?计算:对数据进行处理,使用统计分析等手段得到需要的结果分布式计算:多台服务器协同工作,共同完成一个计算任务2.分布式计算常见的2种工作模式分散->汇总(MapReduce就是这种模式)中心调度->步骤执行(大数据体系的Spark、Flink等是这种模式)......
  • Web自动化_分布式测试Grid入门
    要在多台计算机上并⾏运⾏测试吗?那么,Grid正是为你准备的。分布式测试Grid环境:1.需要JDK支持,最新的版本需要11版本,老版本的1.8seleniumserverjar包下载地址:https://github.com/SeleniumHQ/selenium/releases/tag/selenium-4.5.0单机模式:启动命令:java-jar包名<一定要用ta......
  • 分布式事务
    整理自b站1.什么事分布式事务 2.请描述二阶段提交的基本过程,具体的应用3.2PC协议中,如何处理协调者和参与者之间的通信故障,请列举一些解决方案 超时机制心跳机制事务管理器故障->备份消息队列  3.3PC讲一下    预提交第二阶段 将数据库的redolog......
  • 分布式事务
    注解: @GlobalTransactional 手写:GlobalTransactiontx=GlobalTransactionContext.getCurrentOrCreate();try{tx.begin();tx.commit();//不能提交}catch(Exceptione){log.error("下单失败");......
  • 前端进化笔记-JavaScript(四)
    生活想要将我活埋,怎料我是一颗种子基本引用类型对象是引用类型的实例:new后面跟一个构造函数就创建了一个新对象,例如letnow=newDate();,这样就创建了一个Date对象.Date类型方法Date.parse():根据传入的参数返回毫秒数。参数为有固定格式的表示日期的字符串。Date.UTC():......
  • 分布式系统架构
    分布式系统的架构思路  一、前言在计算机领域,当单机性能达到瓶颈时,有两种方式可以解决性能问题,一是堆硬件,进一步提升配置,二是分布式,水平扩展。当然,两者都是一样的烧钱。今天聊聊我所理解的分布式系统的架构思路。二、分布式系统的两种方式平时接触到的分布式系统有很多......
  • jmeter分布式压测
    无论是jdk还是jmeter都放在usr/local目录下jmeter分布式压测过程1.控制机跟代理机中间ping通2.控制机代理机安装相同版本的jdk,并配置jdk环境环境配置成功在cmd打Java或javac可以获取内容java-version查看jdk版本3.控制机代理机安装相同版本的jmter并配置环境将jmeterbin目......
  • LAXCUS分布式操作系统技术创新引领高性能计算与人工智能新时代
    随着科技的飞速发展,高性能计算、并行计算、分布式计算、大数据、人工智能等技术在各个领域得到了广泛应用。在这个过程中,LAXCUS分布式操作系统以其卓越的技术创新和强大的性能表现,成为了业界的佼佼者。本文将围绕LAXCUS分布式操作系统的技术创新,探讨其在高性能计算与人工智能领域的......
  • LAXCUS分布式操作系统:技术创新引领高性能计算与人工智能新时代
    随着科技的飞速发展,高性能计算、并行计算、分布式计算、大数据、人工智能等技术在各个领域得到了广泛应用。在这个过程中,LAXCUS分布式操作系统以其卓越的技术创新和强大的性能表现,成为了业界的佼佼者。本文将围绕LAXCUS分布式操作系统的技术创新,探讨其在高性能计算与人工智能领域......