zoukankan      html  css  js  c++  java
  • 分布式事务笔记

    一、分布式相关概念

      1.1 分布式CAP定理

      1. 一致性(Consistency):分布式系统不同节点的数据在同一时刻完全一致

      2. 可用性(Availability):分布式系统随时对外提供正常服务,不是异常或超时(访问某个节点)

      3. 分区容错性(Partition Tolerance):分布式系统出现网络故障后,节点间不能相互通信,此时要保证整体功能是可用的

      由于各种网络故障无法避免,CAP不能全部满足,但必须保证发生故障后,分布式系统是可用的,因此共分成PA和PC两种。

      选择PA,当某个节点更新延迟,外部访问该节点,获得的是旧数据,牺牲了一致性。

      选择PC,则这种情况访问某个节点,这个节点的数据是旧数据,为了保证一致性,必须等到其他节点同步数据,但是因为网络异常节点通信被阻塞了,这个时候请求超时得不到正常响应。

      1.2 BASE理论

    • 基本可用:在系统出现故障后,允许损失部分功能,保证核心功能可用
    • 软状态:允许某些情况下,节点间的数据不一致
    • 最终一致性:经过一段时间后,所有节点数据必须一致

      BASE是对CAP中一致性和可用性权衡的结果,无法做到强一致性则采取适当的方式达到最终一致性

    二、分布式事务的解决方案

      2.1 基于XA协议的两段式提交

      2.1.1 2PC

    1. 协调者接收客户端请求,向参与者发送准备命令(其中包含了需要执行的命令)
    2. 参与者锁定资源,执行命令,在事务提交前等待,向协调器发送 执行完成/执行失败 的回答
    3. 协调者根据返回,给参与者们发出提交事务或者回滚事务的命令
    4. 参与者根据命令执行相应的操作,返回操作的结果

      需要数据库的隔离级别是串行:https://www.zhihu.com/question/58308824

       缺点:协调者单点问题,参与者若未收到提交/回滚则会一直阻塞

      2.1.2 3PC

      1. 协调者接收客户端请求后,询问参与者是否可以进行事务操作

      2. 当全部协调者返回OK,协调者发送准备命令,参与者锁定资源,执行命令并返回执行结果,等待提交

      3. 协调者等待执行结果,等待超时则发送回滚命令。获取执行结果,判断是全部成功则发送提交命令,参与者提交事务;否则发送回滚命令。

      4. 参与者等待提交/回滚命令超时,则默认提交,并释放资源

      2.2 TCC两阶段补偿型

    1. Try阶段:事务管理者收到客户端请求,向下属服务预留和锁定业务资源
    2. Confirm阶段:下属服务全部成功锁定。管理者进行确认,操作完成。这一阶段需要保证幂等性
    3. Cancel阶段:下属服务存在失败,管理者对资源进行取消,操作撤回。这一阶段需要保证幂等性

      如果Try阶段成功,则Confirm必须成功。如果Try失败,则Cancel必须成功。如果Confirm或者Cancel有失败,TCC框架将记录,一段时间后重试

      案例参考:https://www.jianshu.com/p/70e4ca5e7c53

      TCC和XA的区别

    1. XA是资源层的分布式事务,锁定时间长,但业务代码不需要改造。
    2. TCC是业务层的分布式事务,最终一致性,锁定时间可控,但需要对业务的代码改造,跟业务紧耦合 

      2.3 本地消息表(异步确保)

      把分布式事务拆分成若干个本地事务。各个系统本地有一个本地消息表,用于存放发往其他系统的请求,并且会记录下系统的返回,比如成功失败。发起方将执行自身业务和保存本地消息表封装成一个事务。保证了放入消息表中的业务自己已经执行完成。然后将消息发往下一个系统,收到了回复则更新消息表的执行状态。返回成功则事务完成,返回失败则需要回退自身业务,或者重试。如果一直没有收到回复,则扫描消息表,将没有返回的消息重发。 

      2.4 MQ事务消息

      RocketMQ支持事务消息(网图已附参考,侵权联系即删)

      

    1. 发起方发送prepare消息到Broker,Broker返回成功。此时相当于告知MQ我正在执行本地事务,一会儿会告诉你结果
    2. 确认MQ返回成功后,发起方执行本地事务,并通知MQ执行结果 Commit(代表成功),RollBack(代表失败)。通知可能丢失,Broker会定时回调发起方提供的反查事务状态接口
    3. Broker收到是Commit,则将prepare消息发送给订阅方,订阅方执行成功则消费消息,否则由MQ负责重试
    4. Broker收到是Rollback,则丢弃prepare消息 

      2.5 Sagas事务模型

      将长事务拆成多个短事务,由Sagas工作流引擎负责协调,如果某过程执行失败,Sagas会以相反的顺序调用补偿操作,进行回滚。

    参考:https://zhuanlan.zhihu.com/p/183753774

    Open/X XA:https://www.jianshu.com/p/6c1fd2420274

    人生就像蒲公英,看似自由,其实身不由己。
  • 相关阅读:
    Python2 cmp() 函数
    Python round() 函数
    Python floor() 函数
    Python ceil() 函数
    Python abs() 函数
    Python oct() 函数
    Python ord() 函数
    Python hex() 函数
    Python2 unichr() 函数
    Android--------工具类StatusBarUtil实现完美状态栏
  • 原文地址:https://www.cnblogs.com/walker993/p/14559247.html
Copyright © 2011-2022 走看看