再有人问你什么是分布式事务,把这篇文章扔给他( 二 )


再有人问你什么是分布式事务,把这篇文章扔给他

文章插图
 
这样的话就无法保证积分扣减了之后,优惠券能否扣减成功 。
resource多个节点同样的,互联网发展得太快了,我们的Mysql一般来说装千万级的数据就得进行分库分表,对于一个支付宝的转账业务来说,你给的朋友转钱,有可能你的数据库是在北京,而你的朋友的钱是存在上海,所以我们依然无法保证他们能同时成功 。
再有人问你什么是分布式事务,把这篇文章扔给他

文章插图
 
分布式事务的基础从上面来看分布式事务是随着互联网高速发展应运而生的,这是一个必然的我们之前说过数据库的ACID四大特性,已经无法满足我们分布式事务,这个时候又有一些新的大佬提出一些新的理论:
CAPCAP定理,又被叫作布鲁尔定理 。对于设计分布式系统来说(不仅仅是分布式事务)的架构师来说,CAP就是你的入门理论 。
  • C (一致性):对某个指定的客户端来说,读操作能返回最新的写操作 。对于数据分布在不同节点上的数据上来说,如果在某个节点更新了数据,那么在其他节点如果都能读取到这个最新的数据,那么就称为强一致,如果有某个节点没有读取到,那就是分布式不一致 。
  • A (可用性):非故障的节点在合理的时间内返回合理的响应(不是错误和超时的响应) 。可用性的两个关键一个是合理的时间,一个是合理的响应 。合理的时间指的是请求不能无限被阻塞,应该在合理的时间给出返回 。合理的响应指的是系统应该明确返回结果并且结果是正确的,这里的正确指的是比如应该返回50,而不是返回40 。
  • P (分区容错性):当出现网络分区后,系统能够继续工作 。打个比方,这里个集群有多台机器,有台机器网络出现了问题,但是这个集群仍然可以正常工作 。
熟悉CAP的人都知道,三者不能共有,如果感兴趣可以搜索CAP的证明,在分布式系统中,网络无法100%可靠,分区其实是一个必然现象,如果我们选择了CA而放弃了P,那么当发生分区现象时,为了保证一致性,这个时候必须拒绝请求,但是A又不允许,所以分布式系统理论上不可能选择CA架构,只能选择CP或者AP架构 。
对于CP来说,放弃可用性,追求一致性和分区容错性,我们的zookeeper其实就是追求的强一致 。
对于AP来说,放弃一致性(这里说的一致性是强一致性),追求分区容错性和可用性,这是很多分布式系统设计时的选择,后面的BASE也是根据AP来扩展 。
顺便一提,CAP理论中是忽略网络延迟,也就是当事务提交时,从节点A复制到节点B,但是在现实中这个是明显不可能的,所以总会有一定的时间是不一致 。同时CAP中选择两个,比如你选择了CP,并不是叫你放弃A 。因为P出现的概率实在是太小了,大部分的时间你仍然需要保证CA 。就算分区出现了你也要为后来的A做准备,比如通过一些日志的手段,是其他机器回复至可用 。
BASEBASE 是 Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent (最终一致性)三个短语的缩写 。是对CAP中AP的一个扩展
  1. 基本可用:分布式系统在出现故障时,允许损失部分可用功能,保证核心功能可用 。
  2. 软状态:允许系统中存在中间状态,这个状态不影响系统可用性,这里指的是CAP中的不一致 。
  3. 最终一致:最终一致是指经过一段时间后,所有节点数据都将会达到一致 。
BASE解决了CAP中理论没有网络延迟,在BASE中用软状态和最终一致,保证了延迟后的一致性 。BASE和 ACID 是相反的,它完全不同于ACID的强一致性模型,而是通过牺牲强一致性来获得可用性,并允许数据在一段时间内是不一致的,但最终达到一致状态 。
分布式事务解决方案有了上面的理论基础后,这里介绍开始介绍几种常见的分布式事务的解决方案 。
是否真的要分布式事务在说方案之前,首先你一定要明确你是否真的需要分布式事务?
上面说过出现分布式事务的两个原因,其中有个原因是因为微服务过多 。我见过太多团队一个人维护几个微服务,太多团队过度设计,搞得所有人疲劳不堪,而微服务过多就会引出分布式事务,这个时候我不会建议你去采用下面任何一种方案,而是请把需要事务的微服务聚合成一个单机服务,使用数据库的本地事务 。因为不论任何一种方案都会增加你系统的复杂度,这样的成本实在是太高了,千万不要因为追求某些设计,而引入不必要的成本和复杂度 。


推荐阅读