CAP理论,指的是在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性),Eric Brewer 说,这三个指标不可能同时做到。
- 分区容错性(Partition tolerance)
比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通信。介于分区状态下,G1 和 G2
是两台跨区的服务器,G1 向 G2 发送一条消息,G2 可能无法收到,因为网络总是不可靠的,因此可以认为P总是成立的。 - Availability(可用性)
只要收到用户的请求,服务器就必须给出回应,但此时由于网络问题会导致服务器之间的数据无法做到实时同步,牺牲了一致性,此时满足AP。 - Consistency(一致性)
用户A访问系统A,用户B访问系统B,系统A和系统B保持同步,当用户A对系统A的data做出更改后,用户B查询系统B的data时,需要查询出用户A操作后的数据,而同步是要通过网络,网络却又总是不可靠的,所以为确保用户B能查询出用户A修改的数据,必须在用户B查询前将系统A的data同步到系统B上,这样就牺牲了可用性,此时满足CP。
简单的来说,在一个分布式系统中,最多能支持上面的两种属性。但显然既然是分布式注定我们是必然要进行分区,既然分区,我们就无法百分百避免分区的错误。因此,我们只能在一致性和可用性去作出选择。
在分布式系统中,我们往往追求的是可用性,它的重要性比一致性要高,那么如何实现高可用,这里又有一个理论,就是 BASE 理论,它给 CAP 理论做了进一步的扩充。
BASE理论
BASE 理论指出:
- Basically Available(基本可用)
分布式系统在出现不可预知故障的时候,允许损失部分可用性,保证核心功能的可用。 - Soft State(软状态)
软状态也称为弱状态,和硬状态相对,是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。 - Eventually consistent(最终一致性)
最终一致性强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。
BASE 理论是对 CAP 中的一致性和可用性进行一个权衡的结果,理论的核心思想就是:我们无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。
BASE理论并没有要求数据的强一致性,而是允许数据在一定的时间段内是不一致的,但在最终某个状态会达到一致。在生产环境中,很多公司,会采用BASE理论来实现数据的一致,因为产品的可用性相比强一致性来说,更加重要。比如在电商平台中,当用户对一个订单发起支付时,往往会调用第三方支付平台,比如支付宝支付或者微信支付,调用第三方成功后,第三方并不能及时通知我方系统,在第三方没有通知我方系统的这段时间内,我们给用户的订单状态显示支付中,等到第三方回调之后,我们再将状态改成已支付。虽然订单状态在短期内存在不一致,但是用户却获得了更好的产品体验。
参考
cap理论与base理论