由于最近项目正在作重构,而此次重构实质上比原来更接近于SOA化和微服务的思想。对于咱们金融交易来讲,数据结果的准确性是重中之重。因此今天总结一下分布式事务的实现方法,下次组内周会给你们统一一下概念。算法
刚性事务和柔性事务数据库
刚性事务:严格遵循ACID原则(原子性、一致性、隔离性、持久性)的事务。基本上指的是本地数据库事务。根据CAP原则,分布式下的事务都不是刚性事务。网络
柔性事务:遵循CAP理论或者其变种BASE理论的事务。分布式事务基本上都是柔性事务。异步
由于刚性事务基本上等价于本地数据库事务,而柔性事务基本上等价于分布式事务。只是一个是按照事务严格性来区分,一个是按使用场景来区分。因此平时除了用来作对比,不多直接提刚性事务和柔性事务的概念。分布式
分布式事务理论微服务
分布式事务:在分布式环境下,各个操做步骤并不在同一台机器上,须要保证全部动做都有一个统一的结果的一组操做。性能
CAP原则(记得在以前的博客中屡次写过):分布式环境下,数据一致性、服务可用性、分区容错性三者最多只能知足其中两者。blog
数据一致性(consistency):这里的一致性是强一致性,又叫线性一致性。即一个写操做成功,而读出的必须是写操做后的新数据。而写操做失败读出的必须是写操做前的旧数据。接口
服务可用性(availability):全部的操做在必定时间内都能获得响应。事务
分区容错性(partition-tolerance):在网络分区环境下,被分割的节点仍然能对外提供服务。
选 择 | 说 明 |
AP | 分隔的节点同时对外服务但不能相互通讯,将致使状态不一致,即不能知足C |
CP | 网络分区的状况下为达成C,请求只能一直等待,即不知足A |
CA | 在必定时间内要达到节点状态一致,要求不能出现网络分区,则不能知足P |
BASE理论:这是基于CAP理论权衡以后的结果。核心思想是即便没法作到强一致性,但可使用一些技术手段达到最终一致。BASE是Basically Available(基本可用)、Soft state(软状态)、Eventually consistent(最终一致性)的缩写。
分布式事务一致性实现方案
为了解决分布式一致性问题,前人在性能和数据一致性的权衡过程当中总结了许多经典的协议和算法。比较著名的有:2PC、3PC、TCC、Paxos、Raft、Zab、ISR。除了这些以外,业界用的最多的实际上是基于MQ实现的。
2PC(Two Phase Commit)两阶段提交:通常说的两阶段提交是基于XA协议的。另外JTA协议的也比较常见。
XA是一个分布式事务协议。它大体分为两部分:事务管理器和本地资源管理器。其中本地资源管理器每每由数据库实现,好比Oracle、DB2都实现了XA接口。MySQL对XA的支持不是很好。而事务管理器做为全局的调度者,负责各个本地资源的提交和回滚。
两阶段提交的优势是:原理简单、实现方便。缺点是同步阻塞、单点问题、数据不一致。
3PC(Three Phrase Commit)三阶段提交:分为CanCommit、PreCommit、Do Commit 三个阶段。就是把两阶段提交的Phase 1分红两个,预提交的时候若是有参与者返回No或者超时则中断事务。
三阶段提交的优势是下降参与者阻塞范围,并可以在出现单点故障后继续达成一致。缺点是由于preCommit阶段,在这个阶段若是出现网络分区,协调者没法与参与者正常通讯,参与者仍然会进行实物提交,形成数据不一致。
TCC(Try-Confirm-Cancel)
Try:完成全部的检查,预留必须资源
Confirm:使用Try阶段预留的资源执行业务,若是执行出现异常,要重试
Cancel:释放Try阶段预留资源
TCC可以对分布式事务中的各个资源进行分别锁定,分别提交与释放。适用于严格一致、执行时间短、实时性要求高的场景。
Paxos算法:以前看过《从Paxos到Zookeeper》那本书,没怎么看明白。实现比较复杂,Zookeeper就是用这个来实现的分布式一致性。Paxos算法、Raft协议和Zab(Zookeeper Atomic Broadcast)协议都是一种经过多数投票来保证主备数据一致性的。
ISR(In-Sync Replicas)机制:Kafka使用了这个机制来保证数据一致性。ISR认为对于2f+1个副原本说,多数投票机制要求最多只能容许f个副本发生故障,若是要支持2个副本的容错,则须要至少维持5个副本。
基本MQ实现是一种异步确保型的实现方案。将同步阻塞的事务变成异步的,避免了对数据库事务的争用。
跑题时间:
咖啡就像是有毒的爱情,入口香滑,而后就是心力交瘁、展转难眠,远离咖啡~
坚强是最容易的事情,当本身想哭的时候,却发现没有一个肩膀能够靠着哭,就只能将眼泪强忍回去,笑着走进来~
我最爱的人是个人“生死劫”。一辈子的最爱也是一辈子的最坏。当我心怀执念淌过绝情池水,伤痕累累的来到断念的彼岸。我仍然感激上苍安排的一切。若是有来世,我依然会相信爱,只是不再要爱上你~