互联网系统中,分布式事务是无法避免的,目前多数解决方案是BASE理论,最终一致性,结合事务补偿。
1.什么是CAP理论。
CAP理论,又称为布鲁尔定理,是加州大学伯克利分校的计算机科学家埃里克.布鲁尔(Eric Brewer)在2000年的ACM PODC提出的猜想。2年后,麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了CAP。Robert Greiner的发表的两篇博文更容易理解,第一篇已经被自己标识为过时。
CAP是一致性(Consistence)、可用性(Availability)、分区容错性(Partition tolerance)三个字母的首字母。
- 一致性(Consistence)对于指定节点,读操作保证能返回最新的写操作结果。注意,这里不是同一时刻都能看到相同的数据。因为事务过程中,系统处于一个不一致状态,不同的节点的数据并不完全一致。比如,client无法读取到未提交的事务的数据,也不会读到事务中间写入的数据。
- 可用性(Availability)非故障节点在合理的时间内返回合理的响应(不是错误和超时响应)。不能是错误或者是超时,结果是合理的,并不是一定是"正确"的结果。
- 分区容错性(Partition tolerance)当出现网络分区后,系统能够继续“履行职责”。发生分区现象,不管什么原因,可能是丢包、连接中断、阻塞等,系统都应该能够继续“履行职责”。总结:网络分区后,节点之间就出现隔离。要提高分区容忍性,就要把数据多分布在各个节点中,分区容忍性就提高了。各节点复制数据,就会带来数据不一致的问题。数据分布的节点数越多,容忍性越高,复制数据带来不一致的问题发生的概率就越高,总之,是需要一个权衡的问题。2. CAP为什么不能同时满足?假如现在两个节点A、B同时满足CAP理论,C:AB节点数据同时更新。A:AB同时保证可用性。P:当出现网络分区时,必须保证对外可用。现在假如出现网络分区,A 肯定满足不了,AB不能互相通信,得不到最新的数据。假如必须满足C,就必须同时停止A和B,这时候A就满足不了。总结:分布式系统中,必然选择P,也是选择AP或CP。如果不选择P,当发生网络分区时,为了满足C,系统需要禁止写入,当写入请求时,系统会返回error,这和A冲突了。正常运行情况下,不存在CP和AP的选择,可以同时满足CA。CAP理论说只能选择CP或者AP,前提是系统发生了分区现象。如果没发生分区,我们没必要放弃C和A。也就是说,设计架构时,既要考虑分区发生时选择CP和AP,也要考虑分区没有发生时如何保证CA。
2. CAP为什么不能同时满足?
假如现在两个节点A、B同时满足CAP理论,C:AB节点数据同时更新。A:AB同时保证可用性。P:当出现网络分区时,必须保证对外可用。
现在假如出现网络分区,A 肯定满足不了,AB不能互相通信,得不到最新的数据。假如必须满足C,就必须同时停止A和B,这时候A就满足不了。
总结:分布式系统中,必然选择P,也是选择AP或CP。如果不选择P,当发生网络分区时,为了满足C,系统需要禁止写入,当写入请求时,系统会返回error,这和A冲突了。
正常运行情况下,不存在CP和AP的选择,可以同时满足CA。CAP理论说只能选择CP或者AP,前提是系统发生了分区现象。如果没发生分区,我们没必要放弃C和A。也就是说,设计架构时,既要考虑分区发生时选择CP和AP,也要考虑分区没有发生时如何保证CA。