CAP理论与BASE理论的关系及理解

在探讨分布式系统时,我们经常会提到CAP理论。CAP理论是分布式计算中的一个基本原则,它指出在一个分布式数据存储系统中,Consistency(一致性)、Availability(可用性)和Partition Tolerance(分区容错性)这三个特性无法同时被满足。

 一、一致性(Consistency)

一致性是指“所有节点在同一时间看到的数据是一致的”。在并发系统中,一致性问题不可避免。对于客户端来说,一致性指的是并发访问时更新过的数据如何获取的问题。从服务端来看,则是更新如何复制分布到整个系统,以保证数据最终一致。换句话说,一致性是站在分布式系统的角度,对访问本系统的客户端的一种承诺:要么我给您返回一个错误,要么我给你返回绝对一致的最新数据。其强调的是数据正确性。

 二、可用性(Availability)

可用性是指“读写操作总是能够成功”。换句话说,可用性是站在分布式系统的角度,对访问本系统的客户的另一种承诺:我一定会给您返回数据,不会给你返回错误,但不保证数据最新,强调的是不出错。好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。

 三、分区容错性(Partition Tolerance)

分区容错性是指分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性或可用性的服务。换句话说,分区容忍性是站在分布式系统的角度,对访问本系统的客户端的再一种承诺:我会一直运行,不管我的内部出现何种数据同步问题,强调的是不挂掉。对于用户而言,即使分布式系统中有某一个或者几个机器宕掉了,其他剩下的机器还能够正常运转满足系统需求,对于用户而言并没有什么体验上的影响。

CAP理论的权衡

CAP理论的基本观点是,一个分布式系统不可能同时满足C、A、P这三个特性。这并不是在所有时候都只能选择两个特性。在不存在网络失败的情况下(分布式系统正常运行时),C和A能够同时保证。只有当网络发生分区或失败时,才会在C和A之间做出选择。

对于一个分布式系统而言,P是前提,必须保证,因为只要有网络交互就一定会有延迟和数据丢失,这种状况我们必须接受,必须保证系统不能挂掉。所以只剩下C、A可以选择。要么保证数据一致性(保证数据绝对正确),要么保证可用性(保证系统不出错)。

当选择了C(一致性)时,如果由于网络分区而无法保证特定信息是最新的,则系统将返回错误或超时。

当选择了A(可用性)时,系统将始终处理客户端的查询并尝试返回最新的可用的信息版本,即使由于网络分区而无法保证其是最新的。

我们把P去掉,就能保证CA(单机模式).如果要P, 那么就得做出选择,是要准确数据还是服务可用.举例: 如果我们选择C, 那么就得等数据在各个服务中全部同步且一致才返回,这个过程展现给用户的是等待,不能执行别的操作. 如果选择A,用户可以很快得到响应,但是可能数据在其他查询不一致. 这就引出BASE理论.牺牲p就是单机数据库,保障p就是集群部署数据库。引出了BASE理论;

BASE是“Basically Available(基本可用性)、Soft state(软状态)和Eventually consistent(最终一致性)”的缩写。BASE理论是对ACID(原子性、一致性、隔离性和持久性)的一种补充和扩展。BASE理论主要用于分布式系统和大规模数据存储中,提供了一种弱一致性的解决方案。

基本可用性(Basically Available):
系统在面对故障或异常情况时,仍然保证基本的可用性和可操作性,不会因为个别节点或组件的故障而完全不可用。
软状态(Soft state):
系统的状态可以不同步,在一段时间内可以是非一致的。允许系统的某些部分存在中间状态,而不要求立即在所有节点上达到全局一致。
最终一致性(Eventually consistent):
系统的数据在经过一段时间的同步和迁移后,最终会达到一致的状态。尽管在某一时刻数据可能不一致,但系统会尽力保证最终所有节点达到一致性。
BASE理论相对于ACID更加适用于大规模分布式系统和高并发环境,强调可用性和性能,而对数据的一致性要求相对较低。因此,在设计和实现分布式系统时,可以根据具体需求选择使用ACID或BASE理论进行架构和设计。

 实际应用案例:电商购物车系统

基于BASE理论的电商购物车系统是一个典型的实际应用案例,它可以通过合理的设计来确保数据的最终一致性。

数据一致性保障机制:
在电商购物车系统中,用户可以将商品添加到购物车,然后可以进行结算和支付。这涉及到对购物车中商品数量、价格等数据的操作和更新。为了确保数据的最终一致性,可以采取以下措施:

基于异步通信:

  当用户操作购物车时,系统不需要立即更新数据,而是使用异步通信的方式将操作请求发送到消息队列中。这样可以保证用户操作的及时响应,并避免同步更新数据带来的性能瓶颈。

使用消息队列解耦:将购物车处理过程中的各个步骤解耦,例如将商品添加到购物车、删除购物车中的商品、更新购物车中的商品数量等操作分别存储为不同的消息。这样可以确保每个操作在消息队列中独立处理,从而提高系统的可伸缩性和灵活性。
最终一致性机制:

  由于BASE理论中接受最终一致性,可以采用以下方法来保证购物车数据的最终一致性:

使用分布式锁:在对购物车数据进行操作时,使用分布式锁来保证同一时刻只有一个线程可以修改购物车数据,以避免并发问题。

消息队列的消费者幂等性:消费消息的服务节点需要具备幂等性,确保相同消息在处理时只会产生一次结果。例如,当多次收到某个商品被添加到购物车的消息时,只执行一次添加操作。

定时任务的校正机制:定时任务可周期性检查消息队列中未被正确消费的消息,并进行校正。例如,如果某个操作消息没有被正确处理,则定时任务可以重新处理该消息,确保数据最终一致。

 

posted @ 2024-02-15 23:18  qunqingrihe  阅读(82)  评论(0编辑  收藏  举报