免费的分布式事务来了——阿里巴巴Fescar

简介: 背景每次说起分布式事务相信都是许多开发者的心头痛,分布式事务往往伴随着大量的业务逻辑的侵入,需要写大量的回滚操作的业务流程,而且还生怕哪里漏掉了。而现在,于2019年1月10日,阿里巴巴开源了内部的分布式事务框架——Fescar。

背景

每次说起分布式事务相信都是许多开发者的心头痛,分布式事务往往伴随着大量的业务逻辑的侵入,需要写大量的回滚操作的业务流程,而且还生怕哪里漏掉了。而现在,于2019年1月10日,阿里巴巴开源了内部的分布式事务框架——Fescar。Fescar是Fast Easy Commit And Rollback的缩写。

目前业界的分布式事务分为两种,一是业务0侵入的,使用的是数据库的XA组件,但是缺陷也很明显。所用的数据库必须支持XA组件,另外这种方式锁占用时间长,需要搭配重量级的容器使用,在分布式系统场景中并不合适。二是业务侵入的,例如TCC,目前用得比较多的是这种,也有成熟的方案,只是这样需要开发大量的回滚流程,十分耗费人力物力。而Fescar就是解决了这两个问题,既能做到适配各种关系型数据库,又能业务0侵入。

阿里巴巴内部一直有在做分布式事务的探索,TXC是目前阿里巴巴内部使用的分布式框架,而GTS则是在阿里云上分布式事务,而这次开源的Fescar也是源自这两者,当然开源的是免费的,开源一个月的时间现在Github上已经有5000多颗星了,可见大家对分布式事务有多渴望。

原理

首先先说说什么是分布式事务,以电商购物为例,当消费者购买了下单一件商品时,库存系统会扣减库存,而支付系统会进行扣款,当扣款失败时,库存应该要重新回滚到原来的数量,可是在分布式系统中,系统往往不是使用同一个数据库,因此数据库没法保证本地事务外的事务,这就是分布式事务。

目前流行的TCC分成三个阶段,一是Try,尝试把资源冻结和锁住,若全部服务均成功,则执行Confirm操作,执行真实的写操作,否则执行Cancel,取消资源冻结。TCC伴随着大量的业务逻辑以及需要可靠的MQ支撑,虽然比较成熟,可是需要开发者花大量的心思去开发。

而Fescar作为业务0侵入的框架是如何实现的呢?
image

免费的分布式事务来了——阿里巴巴Fescar
如上图所示(图片来自Github),Fescar由RM、TM、TC组成。

RM是资源管理器,主要是做分支/本地事务的提交和回滚。

TM是事务管理器,主要是确定全局事务的开始和全局事务的提交和回滚。

TC是事务协调器,主要是当TM确定要提交或回滚时协调各个分支事务做相应的操作。

流程是这样的,还是拿回开始的那个例子,当用户下单时,TM会发起全局事务,并向TC注册一个XID作为事务的唯一标志,然后在调用库存系统扣减库存,此时库存系统的RM会向TC注册并执行本地事务,支付系统同理。当支付系统的RM执行失败时,TM会向TC发起全局事务回滚的决议,此时TC会组织两个系统的RM同时进行回滚操作,整个分布式事务完成。

特点

不依赖数据库的协议支持

Fescar的RM是处于应用层,与数据库本身的协议无关,而XA则相反,它也有类似RM的概念,可是它的RM是处于数据库层,这就意味着XA需要强依赖数据库支持XA协议,因此Fescar是非常适合弱耦合的分布式系统的。

锁的时间短

Fescar与XA同样都是两阶段提交,但是区别在于XA是两阶段均结束后才会释放锁,而Fescar若是做全局事务的提交操作则会在阶段一结束后就释放锁,只有是做回滚操作才会两阶段后才释放锁。而大部分场景都是能正常提交的,所以Fescar能保证锁的占用时间控制到最短,这也变相地提高了数据库的qps。(这里可能会有人会问阶段1结束就释放锁不会造成资源会被的事务占用吗,Fescar在这里实际上做了一个全局写操作的隔离,不会出现脏写的情况,这里不展开说)

隔离性

Fescar默认支持读未提交的隔离性,因为主要是考虑到其实大部分场景用这个隔离性就已经足够了。不过官网也支持读已提交的隔离性配置,不过就需要对业务进行侵入了,所以在选型时也要考虑业务本身的需求。

总结

总的来说Fescar是对目前分布式事务版图的一个很好的补充,而且已在阿里巴巴有长时间的成功经验,相信大多数的开发者都可以放心使用。

相关文章
|
Oracle 关系型数据库 数据库
一次解决RAC实例状态为“Stuck Archiver”的经历
一个客户反映Oracle数据库恢复后,有一个数据文件报错
579 0
|
小程序 JavaScript 关系型数据库
weixin118电影院订票选座系统设计及实现+ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的电影院订票选座系统。该系统采用WXML、WXS、JS小程序语言开发,结合微信开发者工具和MYSQL数据库,实现了便捷的订票选座功能。用户无需下载安装,通过微信即可快速访问,操作简单高效。系统分为用户与管理员两大模块,支持电影信息查询、在线选座、订单管理等功能,同时确保数据安全与用户体验。经过可行性分析、功能设计、测试等环节,系统表现出良好的稳定性、实用性和可扩展性,为用户提供了一个全面、便捷的订票平台。
|
传感器 人工智能 数据可视化
数智入海,GIS赋能智慧海洋
随着科技发展,各国积极推进海洋数字化建设,建立全球海洋观测网络,获取实时数据并挖掘价值。我国从“十四五”规划到二十大报告强调海洋强国战略,利用地理空间信息技术和物联网整合监测数据,提供智能管理与决策支持,实现海洋环境的可视化三维场景、实时监测、环境保护、灾害预警及专题图件服务,推动海洋经济高质量发展。
1043 6
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
917 15
Android 系统缓存扫描与清理方法分析
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端开发
本文将带你走进Node.js的世界,从基础到进阶,逐步解析Node.js在后端开发中的应用。我们将通过实例来理解Node.js的异步特性、事件驱动模型以及如何利用它处理高并发请求。此外,文章还会介绍如何搭建一个基本的Node.js服务器,并探讨如何利用现代前端框架与Node.js进行交互,实现全栈式开发。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供新的视角和深入的理解。
556 4
|
机器学习/深度学习 编解码 PyTorch
基于MeshCNN和PyTorch的三维对象分类和分割
基于MeshCNN和PyTorch的三维对象分类和分割
703 0
基于MeshCNN和PyTorch的三维对象分类和分割
|
Kubernetes 安全 网络协议
|
存储 缓存 JavaScript
Qt+QtWebApp开发笔记(六):http服务器html实现静态相对路径调用第三方js文件
为了解决调用一些依赖的如echarts等一些js的代码模块引入的问题,就需要静态文件了。 本篇解说StaticFileController,在返回的html文本中调用外部js文件,类似的,其他文件都是一样了,只是引入的后缀名不一样。
Qt+QtWebApp开发笔记(六):http服务器html实现静态相对路径调用第三方js文件
|
存储 SQL 数据采集
SaaS厂商数据库设计(3)-租户元数据管理&数据管理
SaaS厂商设计中元数据管理以及逻辑视图方式下数据管理
1115 2
SaaS厂商数据库设计(3)-租户元数据管理&数据管理
|
新零售 监控 小程序
DingTalk「开发者说」钉钉工作台的能力开放
DingTalk「开发者说」是钉钉开发者最新上线的开发者栏目,联合阿里云ACE团队,分享钉应用开发解决方案、技术更新、实战技巧,致力于成为钉钉与开发者的桥梁与纽带,让更多的钉钉开发者传播技术、提升技能、分享观点。在数字化变革的时代,“云钉一体”“钉钉全面开放”战略之后,希望钉钉技术可以持续激发开发者的创造力,为组织数字化赋能。 本文主要针对钉钉工作台,讲解钉钉自定义工作台的开发方式、开放能力和优秀案例,以及工作台的开发实践。
2340 0
DingTalk「开发者说」钉钉工作台的能力开放