解析探秘fescar分布式事务实现原理

解析探秘fescar分布式事务实现原理

分布式事务是一个难点,因为分布式事务牵涉到多个不同的计算节点之间的协作,要实现一个高效且可靠的分布式事务控制系统并不是一件容易的事。在这篇文章中,我们将讲解如何解析探秘fescar分布式事务实现原理,并通过两个示例说明其工作原理。

什么是fescar

fescar是一个基于Java的分布式事务解决方案,旨在解决分布式事务控制的难点。它采用了类似于2PC(两阶段提交协议)的机制,但不同之处在于fescar具备更高的性能和更好的可扩展性,同时避免了"阻塞式"和"单点故障"等问题。fescar被广泛应用于电商、支付、体育和航空等行业。

fescar实现原理

fescar的分布式事务控制框架主要由两部分组成:事务协调者(Transaction Coordinator)和事务参与者(Transaction Participant)。

  • 事务协调者:它是整个分布式事务环境的核心,负责协调和管理整个事务的生命周期,它维护着一个全局事务记录(Transaction Record),通过二阶段提交(Two-Phase Commit)协议来保证数据一致性。

  • 事务参与者:它是参与分布式事务的业务逻辑服务,它具备对全局事务提交和回滚的能力,可以将自身纳入到全局事务的管理之中。

fescar的实现流程如下:

(1)全局事务的启动

  • 客户端调用fescar提供的API,创建一个全局事务分支(Global Transaction Branch),并将该分支内涵的信息(事务ID、服务名称等)发送给服务端。

(2)事务的注册

  • fescar服务端接收到客户端的请求后,先在服务端的全局事务记录中创建一个事务记录,并生成一个唯一的事务ID。

  • fescar服务端将该事务ID返回给客户端,并以该ID作为分支事务的ID,帮助客户端在服务端的全局事务记录中注册对应的分支事务。

(3)分支事务的注册

  • 客户端在得到事务ID后,将该ID放入自己业务逻辑服务所需要的上下文信息中。

  • 当客户端的业务逻辑服务被执行时,fescar会首先判断这是一个全局事务分支。

  • 当确认是全局事务分支时,fescar将从上下文中获取事务ID,并用该ID注册分支事务。

(4)业务逻辑服务调用

  • 当上下文中的事务ID被确认,表示该方法是一个"分布式事务"的一部分。

  • fescar会自动在Context上下文中记录全局事务的ID和分支事务的ID。

  • 接下来,业务逻辑服务会执行,并异步地将更新操作发送到各个分支事务的处理程序。

(5)提交/回滚分支事务

  • 当分支事务处理成功后,它会将该分支的执行状态和结果通知给事务协调者,并等待全局事务的提交。

  • 处理程序仅当在检测到全局事务执行成功后才会提交分支事务,否则它将撤销当前分支事务的所有操作(即回滚操作)。

(6)全局事务的提交

  • 当所有的分支事务都已被提交,fescar的事务协调者将发送一个"提交"命令给所有的所有的分支事务。然后等待所有参与者的响应。

  • 如果所有分支事务都提交成功,fescar会标记全局事务为"成功"状态,并返回结果给客户端。

示例一:电商订单支付示例

假设有一个大型的电商站点,支持同时在线购买多个商品,一个订单可以购买多件商品。此时,我们需要处理"下单"(即创建订单)和"付款"(即减少用户的账面余额)两个操作的原子性。

  1. 当用户点击"购买"按钮时,会触发一个下单请求,该请求会自动注册一个全局事务分支。

  2. 在下单请求完成后,启动事务注册,fescar服务端为该请求生成唯一的事务ID。

  3. 在收到事务ID后,创建订单信息,并提交一个"提交"事务操作。

  4. 接下来,启动一个付款请求,该请求会查询用户账户余额,并判断余额是否足够,如果足够则提交一个"提交"事务操作,如果余额不足则提交一个"回滚"事务操作。

  5. 当下单和付款操作均执行成功后,fescar事务协调者会向所有已注册的分支事务发送提交命令,完成全局事务提交。

  6. 如果在中途发生意外情况(比如付款请求中用户账户余额不足),fescar事务协调者会向所有已注册的分支事务发送回滚命令,回滚分支事务,避免出现数据异常的情况。

示例二:旅游预订示例

假设有一个旅游预订应用,客户可以在线预订机票、酒店和租车等服务。在客户预订这些服务时,需要提供分布式事务保证原子性。

  1. 当客户预订一项服务时,会发送一个预订请求,该请求会先自动注册一个全局事务分支。

  2. 在收到事务ID后,服务提供方将分支事务注册到fescar事务协调者中。

  3. 服务提供方将订单/预订信息存储在数据库中,并异步地将数据更新发送到各个已注册的分支事务的处理程序中。

  4. 如果遇到出现预订失败的场景(如酒店或者机票已满),所有此次预订涉及到的分支事务都将会被回滚。

  5. 当所有分支事务都已成功提交时,fescar协调者会发送提交命令到每个已注册的分支事务,完成全局事务提交。

这两个示例说明了fescar的工作原理及其应用场景。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解析探秘fescar分布式事务实现原理 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • 浅谈Linux下修改/设置环境变量JAVA_HOME的方法

    下面我将详细讲解在Linux下如何修改/设置环境变量JAVA_HOME的方法。 1. 查看Java安装路径 首先要查看Java安装路径,在命令行输入以下命令: which java 此命令会返回Java的安装路径,例如 /usr/bin/java。 2. 设置JAVA_HOME环境变量 在命令行中输入以下命令: export JAVA_HOME=/usr/b…

    database 2023年5月22日
    00
  • 推荐一款神仙颜值的 Redis 客户端工具(速收藏)

    推荐一款神仙颜值的 Redis 客户端工具(速收藏) Redis 是一个高性能的 in-memory 数据库,被广泛应用于缓存、队列、计数器等应用场景中。随着 Redis 的广泛使用,可视化的 Redis 客户端工具也越来越多,其中一个比较不错的工具是 RedisInsight。 1. RedisInsight RedisInsight 是一个由 Redis…

    database 2023年5月22日
    00
  • mysql动态游标学习(mysql存储过程游标)

    MySQL动态游标学习 在MySQL存储过程中,游标是用于遍历一个结果集并对每一行进行处理的机制。它可以将结果集的某个字段的值赋给一个变量,并在每一次处理时将游标移动到下一个记录上。MySQL存储过程提供了两种类型的游标: 静态游标和动态游标。本文主要介绍动态游标的使用。 动态游标 动态游标在定义时必须使用一个SELECT语句,这个语句的结果集就是动态游标的…

    database 2023年5月22日
    00
  • mysql派生查询必须有别名问题记录

    最近在做mysql sql兼容,原来是oracle的sql都要保证在mysql数据库运行业务场景:原来是一个带有子查询的sql,在oracle是可以正常运行的,迁到mysql就发现报错了,报错信息如: Every derived table must have its own alias 这个报错的意思是,派生出来的查询结果必须有一个别名,比如SQL: se…

    MySQL 2023年4月13日
    00
  • 关于mysql 的时间类型选择

    关于MySQL的时间类型选择,我们需要先了解MySQL中可选的时间类型,常用的时间类型包括: YEAR:年份,范围为1901~2155年,占用1个字节 DATE:日期,范围为1000-01-01到9999-12-31,占用3个字节 TIME:时间,范围为-838:59:59到838:59:59,占用3~5个字节(无符号和有符号的存储方式不同) DATETIM…

    database 2023年5月22日
    00
  • MongoDB db.serverStatus()输出内容中文注释

    MongoDB是一款常用的数据库,通过db.serverStatus()命令可以查看MongoDB服务器的状态信息。其中输出内容含有大量信息,而且有些信息默认是英文,不太容易理解。为了更好地解读这些信息,可以通过向命令添加参数,来获取MongoDB db.serverStatus()的中文注释。 具体方法如下: 登录MongoDB,在命令行输入以下命令: d…

    database 2023年5月22日
    00
  • MySQL查看版本的五种方法总结

    下面就给您详细讲解“MySQL查看版本的五种方法总结”的完整攻略。 一、查看 MySQL 版本的意义 在开发和维护 MySQL 数据库时,经常需要查看 MySQL 的版本号,以此为基础确定它是否支持所需的功能,特别是在特定情况下,如升级或修复问题时。 二、五种查看 MySQL 版本的方法 1. 使用命令行方法 打开终端, 进入 MySQL 的 bin 目录,…

    database 2023年5月22日
    00
  • 使用SpringAop动态获取mapper执行的SQL,并保存SQL到Log表中

    使用Spring AOP动态获取mapper执行的SQL并保存到Log表中,可以方便我们在程序调试和优化时快速定位问题,本攻略分为以下步骤: 步骤一:添加依赖 首先,在项目的pom.xml中添加以下依赖: <dependency>     <groupId>org.aspectj</groupId>     <art…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部