免费的分布式事务来了——阿里巴巴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是对目前分布式事务版图的一个很好的补充,而且已在阿里巴巴有长时间的成功经验,相信大多数的开发者都可以放心使用。

相关文章
|
安全 测试技术 数据库
测试流程规范--准入准出规则
为了加强测试部软件测试的质量控制及与测试相关部门、人员更好理解测试各阶段的准入/准出条件而建立的准入/准出规范。
3818 0
测试流程规范--准入准出规则
|
6月前
|
缓存 NoSQL Java
Java在大型多人在线游戏(MMO)服务端的运用
大型多人在线游戏(如《魔兽世界》《最终幻想14》《梦幻西游》)的服务端需要同时处理数万玩家的实时交互,包括移动同步、战斗计算、聊天、交易、工会等。
749 0
|
消息中间件 固态存储 Java
RocketMQ 消息发送system busy、broker busy原因分析与解决方案
RocketMQ 消息发送system busy、broker busy原因分析与解决方案
RocketMQ 消息发送system busy、broker busy原因分析与解决方案
|
1月前
|
存储 开发框架 编解码
阿里云国际版代理商:无影云电脑海外节点开通指南 出海网络优化与排障
本文由阿里云国际站代理商云枢国际撰写,详解出海企业部署无影云电脑海外节点时的三大核心问题:网络连通性(需企业实名+精品带宽)、成本控制(带宽动态变配)与跨境延迟排障(GA加速/专线方案),附实操步骤与风险核验清单。
|
5月前
|
数据可视化 数据挖掘 数据建模
百雀羚 x Quick BI:助力百雀羚双11会员下单金额同比增长15%,老客非会入会率提升168%
百雀羚携手阿里云瓴羊,通过重代码实现老客与会员精细化分层运营,精准识别入会与提质双战线。双11期间会员销售占比创历史新高,老客非会入会率提升168%,沉默人群活跃度提升66%。
|
6月前
|
存储 安全 Java
【Java基础】String不可变性、String vs StringBuffer vs StringBuilder、常量池、intern()方法(附《思维导图》+《面试考点背诵版》)
本文系统解析Java字符串核心机制:String不可变性(`final char[]`实现)、String/StringBuffer/StringBuilder三者对比(可变性/线程安全/性能)、字符串常量池(JDK7+移至堆)及`intern()`方法(JDK7+直接存堆引用)。
|
5月前
|
人工智能 持续交付 Python
个人如何用AI搭建轻量业务系统?内容、线索、知识库与交付流程
本文介绍个人如何用AI构建轻量业务系统:以内容入口为起点,串联线索收集、知识库沉淀、AI辅助沟通、模板化交付与数据复盘六大模块,用低代码/AI工具替代传统协作,以极低成本验证需求、积累经验、实现可持续交付。
|
8月前
|
JSON 安全 Shell
CTF中Python_Flask应用的一些解题方法总结
Flask是轻量级Python Web框架,基于Werkzeug和Jinja2,支持快速开发。本文详解其基础用法(路由、请求处理、Session)、安全风险(Session伪造、SSTI、RCE、任意文件读取、原型链污染)及CTF实战技巧,含完整EXP与防护建议。(240字)
501 6
|
9月前
|
机器学习/深度学习 人工智能 算法
自进化≠自我刷题,Agent 真正的突破口是「自己造环境」?——6 位领域学者 · 7 大议题 · 2 万字圆桌观点实录
AI AMA首期聚焦“Agent自进化”,由魔搭等联合发起,邀请翟云鹏主持及5位顶会作者深度对谈。围绕定义、泛化能力、反馈信号、评估体系等7大议题,探讨Agent如何突破“从零开始”瓶颈,实现类人经验积累与策略优化。(239字)
835 6
|
容灾 网络协议 大数据
阿里巴巴为什么不用 ZooKeeper 做服务发现?
服务发现,ZooKeeper 真的是最佳选择么?而回望历史,我们也偶有迷思,在服务发现这个场景下,如果当年 ZooKeeper 的诞生之日比我们 HSF 的注册中心 ConfigServer 早一点会怎样?
13465 6