首页 > 其他分享 >分布式事务的华丽进化 | 京东物流技术团队

分布式事务的华丽进化 | 京东物流技术团队

时间:2023-08-15 13:05:44浏览次数:48  
标签:事务 method2 业务 任务 华丽 定时 京东 分布式

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

一、调用方保证

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

分布式事务的华丽进化 | 京东物流技术团队_业务逻辑

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

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

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

二、定时任务扫描业务表

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

分布式事务的华丽进化 | 京东物流技术团队_定时任务_02

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

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

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

三、本地任务表

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

分布式事务的华丽进化 | 京东物流技术团队_定时任务_03

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

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

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

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

四、组件抽取

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

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

分布式事务的华丽进化 | 京东物流技术团队_定时任务_04

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

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

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

作者:京东物流 廖宗雄

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

标签:事务,method2,业务,任务,华丽,定时,京东,分布式
From: https://blog.51cto.com/u_15714439/7086812

相关文章

  • 聊聊JDK1.0到JDK20的那些事儿 | 京东云技术团队
    1.前言最近小组在开展读书角活动,我们小组选的是《深入理解JVM虚拟机》,相信这本书对于各位程序猿们都不陌生,我也是之前在学校准备面试期间大致读过一遍,emm时隔多日,对里面的知识也就模糊了。这次开始的时候从前面的JDK发展史和JVM虚拟机家族着手,之前都是粗略读过,这次通过查阅相关资料......
  • 分布式、微服务、集群、SOA之间的关系及区别
    概念介绍分布式、微服务、集群和SOA(面向服务的架构)是现代软件架构中的一些重要概念,它们之间有一些联系和关系,但又有一些区别。下面是它们之间的关系解释:分布式官方解释分布式是一种计算资源或任务在多个节点之间分散的方式。它旨在提高系统的性能、可靠性和可扩展性。类比来说,可以......
  • 分布式事务的华丽进化
    说到分布式事务,大家并不陌生。在实际工作中,用得比较多的还是柔性分布式事务,今天主要把在工作中运用到的几种柔性分布式事务的场景及实现方式做一个简单介绍,也可以看做是柔性分布式事务的一个演进过程。一、调用方保证这种方式适合业务内自己使用,当方法内的任务一个逻辑发生异常......
  • 分布式事务解决方案-2PC, 3PC
    在分布式系统中,每一个机器节点虽然都能明确的知道自己在事务操作中的结果是成功或失败,但无法直接获取其他节点的操作结果。因此在分布式环境中,为了保持事务的ACID特性,就需要增加一个“协调者”来管理其他节点(“参与者”)事务的提交和回滚。基于这个思想,衍生出二阶段提交2PC和三......
  • 大数据之分布式
    1.什么是计算、分布式计算?计算:对数据进行处理,使用统计分析等手段得到需要的结果分布式计算:多台服务器协同工作,共同完成一个计算任务2.分布式计算常见的2种工作模式分散->汇总(MapReduce就是这种模式)中心调度->步骤执行(大数据体系的Spark、Flink等是这种模式)......
  • 京东金融,你到底是坏,还是码农裁多了??
    7.12更新:部分基金赎回的钱已经到账小金库了,今日从小金库提现时又提示银行卡已删除,不过这次可以点击重新绑定,重新绑定时会报错“绑定的卡与原卡一致”,流程没法走完。但这时候再退回去却发现“银行卡已删除”的提示没有了。于是,我顺利快速提现了1万到银行卡。剩余的几万只能等几个工......
  • 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("下单失败");......
  • JDK 17 营销初体验 —— 亚毫秒停顿 ZGC 落地实践 | 京东云技术团队
    前言自2014年发布以来,JDK8一直都是相当热门的JDK版本。其原因就是对底层数据结构、JVM性能以及开发体验做了重大升级,得到了开发人员的认可。但距离JDK8发布已经过去了9年,那么这9年的时间,JDK做了哪些升级?是否有新的重大特性值得我们尝试?能否解决一些我们现在苦恼的......