CAP理论,浅谈我的理解

Posted 程序员的压哨绝杀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CAP理论,浅谈我的理解相关的知识,希望对你有一定的参考价值。

想必大多数的IT从业者,都听过CAP理论,但是听过和理解并熟练应用又是两码事,笔者也看了几篇文章,就想在这片里浅谈一下我的理解。

CAP理论,是指在一个互相连接且共享数据的分布式系统中,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition tolerance)三者中的两个,三者不可兼得。

这里有个坑,就是什么样的分布式系统才满足CAP理论呢,就是互相连接并且共享数据的分布式系统,大家都知道,什么是分布式系统,但是分布式系统不一定会互相连接和共享数据呢。举个例子,memcache集群,各节点存储的数据都不一样,所以这类分布式系统就不满足CAP理论,而类似mysql集群,需要互联进行数据复制,就满足CAP理论。

CAP理论关注的是数据的读写操作,而不是分布式系统的所有功能。像分布式系统的负载均衡、容错等都不是CAP理论的讨论范围。

故,CAP理论针对的是互相连接并且共享数据的分布式系统的数据的读写操作。

下面我们先分别解释一下CAP理论里每个理论的概念。

一致性(Consistence),对指定的客户端来说,读操作保证能够返回最新的写操作的结果。举个例子,mysql在事务执行过程中,系统就是一个不一致的状态,不同的节点很可能对应的数据不一致,数据提交前后数据是不一致的,客户端只能读取事务提交成功后的数据,对应客户端来说,这就是符合一致性的状态。

可用性(Availability)故障节点在合理的时间内返回合理的相应。这里说的合理的相应,肯定不是超时或者错误,只要合理即可。举个例子,查询本应是返回A,结果返回的是B,就是满足了可用性,但是显然,没满足一致性。

分区容错性(Partition tolerance),当网络分区后,系统可以继续正常的工作。网络分区指的是网络设备出现的丢包、阻塞、超时等问题。

在分布式系统中,网络不是100%可靠的,所以我们必须选择P。但为什么这三个要素不能同时满足呢?当分布式系统满足P时,如果网络分区,为了保证C,我们会禁止写入,而为了保证A,我们又不能返回error,这就冲突了,所以在分布式系统里,我们只能选择CP或者AP架构。

CP架构,当节点1与节点2之间出现网络分区,节点1与节点2之间不能进行数据交换,假设节点1的数据是最新的,这时client访问节点2,为保证一致性(读操作保证能够返回最新的写操作的结果),节点2只能返回error,违背了A,故这种架构属于CP。

AP架构,同样的情况,当节点1与节点2之间出现网络分区,节点1与节点2之间不能进行数据交换,client访问节点,因需要满足A,故节点2需要给client响应,返回的是b,而不是最新的数据a,虽然不是最新的数据,但是却是合理的,违背了C(对指定的客户端来说,读操作保证能够返回最新的写操作的结果),故这种架构属于AP。

上面介绍了CAP理论中每个要素的含义,以及CP/AP架构的简单的例子。当我们的系统,没有发生网络分区的时候,是会同时满足CAP的,没有必要放弃A/P,而我们系统绝大多数时间都是稳定的,我们只需要考虑网络分区是需要选择AP/CP即可,没有发生网络分区是,我们需要考虑如何保证CA。

所以舍弃A/P,只是在网络分区时才考虑,在网络正常之后,我们要选择适当的补偿机制,来保证之后系统的CA,不能让影响扩大。

选择CP/AP其实一个很大的难题。一个系统里有很多个功能和业务,而对于不同的业务和功能,我们可以选择不同的模型。举个例子,我们做一个秒杀系统,查询商品的时候我们可以选择AP架构,短时间的数据不一致,保证用户可以查询出列表,但购买商品的时候,我们要选择CP架构,没有库存,就不能进行购买。但是整个秒杀系统,不是AP也不是CP,而是AP和CP的混合。

所以在实际的设计和开发中,我们要灵活运用CAP理论,灵活选择AP或CP架构。

以上是关于CAP理论,浅谈我的理解的主要内容,如果未能解决你的问题,请参考以下文章

浅谈我的MongoDB学习

浅谈我的第一个看得见的项目

浅谈我的马拉松与代码之路

浅谈我对DDD领域驱动设计的理解

浅谈我对DDD领域驱动设计的理解

浅谈我对DDD领域驱动设计的理解