架构探索:事务处理三
![架构探索:事务处理三](https://static001.geekbang.org/infoq/fd/fd31ddbad2267ce7b6f12c86b12ea58d.jpeg)
讨论范围
分布式事务:多个服务同时访问多个数据源的事务处理机制
CAP(以下特性只能2选1)
一致性
可用性
分区容错性
CA,放弃P
主流RDBMS集群通常是采用放弃分区容错性的工作模式,例如RAC集群采用共享磁盘的方式来避免网络分区的出现。每个节点都有SGA,UNDO LOG 和REDO LOG,但各节点共享同一份数据文件和控制文件
CP,放弃A
先假设一旦出现网络分区,节点之间信息的同步可以无限的延长。从而采用2PC/3PC手段来,同时获取分区容错性和一致性。
AP,放弃C
目前大多数分布式系统设计的主流选择,大多数的NoSQL库和支持分布式的缓存都是AP系统。
分布式事务实现方式
最终一致性的实现方式:可靠消息队列、TCC、SAGA
可靠消息队列
通过持续重试的机制,来保证可靠性。最大努力交付
具体实现如下:
系统把最有可能出错的业务,以本地事务的方式完成后,通过不断重试的方式,来促使同个事务的其他关联业务来完成。
缺点:没有任务隔离性,在电商场景中可能导致的问题就是超售
TCC
TCC天生适合用于需要强隔离性的分布式事务中。他需要先把资源给冻住,然后执行后续的操作。
Try,尝试执行阶段,完成所有业务可执行性的检查(保障一致性),并且预留好事务需要用到的所有业务资源(保障隔离性)
Confirm,确认执行阶段,确认执行阶段,不进行任何业务检查,直接使用Try阶段准备的资源来完成业务处理
Cancel,取消执行阶段,释放Try阶段预留的业务资源
一般通过事务中间件(阿里seata)来完成
缺点:
业务侵入性较强
如果出现不合作(不可控)的第三方,往往在第一步Try就无法施行了。
SAGA
引入事务补偿的机制来代替回滚的操作。
实现原理:将大事务拆解为N个小事务,并且为每个事务设计一个对应的补偿机制
评论