公司创立之初,一个web服务和一个数据库实例便可知足户需求。随着业务量的增加,性能问题就会愈来愈突出。架构因而变成了多个web服务,和一个读写分离的数据库群( 主多从),这种架构或许也能 撑上千万的用户。但随着进一步发展,会发现业务复杂度愈来愈高 ,耦合也比较严重,并且数据库也成了性能瓶颈。这时就不得不面临分布式改造。将相关业务抽取成独 的服务和独立的数据库。数据量的业务还要进行分库分表的改造。这就是分布式系统架构。web
在分布式系统架构中,就不得不面临分布式事务这一巨大挑战。 什么是分布式事务?通俗点说,就是一个大的操做,调用了多个分布在不一样机器上的小的服务。事务要保证这些小的服务,要么所有执行成功,要么所有回滚。本质上来讲,分布式事务就是为了保证不一样数据库的数据一致性。面试
分布式系统的事务一致性自己就是一个让人头疼的难题,没有一个简单完美的解决方案可以适 于全部业务场景。在一致性,高性能和易用性方面 ,每每三者很难兼得。数据库
首先,一致性,一个大的操做结束,保证全部小的操做数据协同一致。这里说的是一致指的是强一致性。目前大部分互联网公司的分布式事务解决方案,采用的是最终一致性。大都是经过结合消息中间件来实现。好比说,A、B在一个操做事务里,A调用成功后发送一个消息到消息队列,另外一个消费任务负责消费消息,而后执行B操做。这里有个问题就是,消息可能被重复消费,因此B操做须要支持幂等性调用,消费任务会一直调用B,直到成功为止,必要时候还须要人工介入。不得不认可,最终一致性是由于解决不了高性能强一致的无奈之举。架构
其次,高性能。性能不好,天然就没有实用价值。业界也有像两步提交这样的解决方案,如XA。可是并无什么知名互联网公司在使用 ,究其缘由仍是性能问题严重,多数企业没法接受。因此他们更愿意转而求其次,使用最终一致性解决方案,或者放弃事务人工订正。运维
最后,易用性。若是非要追求强一致性和高性能,就不得不进行特殊场景特殊处理。但一般会要求业务开发者遵照必定的规则,对业务侵入性很强,也带来了很大的开发成本。好比有的 案要求数据库操做必须写成存储过程,有的方案要求必须实现它的一堆接口,有的方案必须侵 入业务按照它的套路改造,等等。这都给产品开发、升级、运维带来困难。理想的方案是对业务无侵入,业务与事务分离,用户开发仅须要关注于业务自己,事务方面须要作的只是界定事务边界,事务一致性交给事务中间件处理。分布式
看到这里,你确定知道:什么是分布式事务,分布式事务为何那么难解决。因此,若是初入职场者,面试中被问到分布式事务时,不用慌张,这原本就是个世界难题,答不上来也没必要灰心,甚至你还能够反问面试官:大家是怎么解决的。性能