CAP是一致性,可用性,分区容错性三个英文单词的首字母缩写。分布式系统中,CAP只能同时满足其中两个特性,然而分布式系统最大的目标就是实现高可用性,所以A是必须的,还能满足一个特性就只能从CP中选择一个了。分布式系统中,大部分情况下都会选择P(分区容错性),看业务决定有的时候也会选择C。
为什么只能满足其中两个特性呢?打个比方,如果分布式系统有一台主机出现故障(网络断线/程序崩溃/内存CPU紧张导致程序运行卡顿),这个时候系统如果要继续保持可用性(A),分区容错也要满足(P),那么在这种情况下,出故障的机器上面的数据无法获取,系统计算出来的结果不一定是准确的,也就失去了一致性,想都满足也满足不了。
如果要满足一致性(C),那么在机器出现故障的情况下,就一定要等待故障机器恢复了再对外提供服务,否则数据不一定是准确的,那么也就失去了分区容错性。
可用性是指实例挂掉一部分但是系统可用,分区容错是指不同服务之间网络出现问题,系统还是可用。
以实际的业务场景举例,一个社交分布式系统。有一个查询用户信息的接口,这个接口在用户服务里面,用户服务部署了多个节点,用户服务挂掉了一个节点,还有其它节点可用,也就满足了可用性(A)。
用户有积分。积分是另一个服务,查询用户信息的时候,用户服务要调用积分服务查询用户的积分,如果积分服务挂掉了,这个时候用户服务要继续对外提供服务,保持可用,那么一定要在用户服务里面存储用户积分。调用积分服务查询失败就直接用本地存储的积分信息。这就满足了分区容错,但是积分不一定准确,牺牲了一致性(C)。
如果要求积分一定是准确的,出现的现象则是用户服务对外提示积分服务不可用,请稍后再试。满足了可用性可一致性,但是牺牲了分区容错性(P)。
像积分还好,如果是金钱,一定是选择满足一致性,救过就是上面那种情况。
但是如果信息不是很敏感,就可以选择P,返回非即时的数据,比如新闻,博客。比如百度搜索到的结果,有的时候明明搜索出来了,但是点进去发现里面的数据和外面显示的不一样。这就是选择了AP。
如果大家觉得我解释还算通俗,希望大家能点个赞,谢谢