最近在看《大型网站系统与java中间件事件》这本书,收获颇多。java
分布式事务但愿在多机环境下能够像单机系统那样作到强一致,这须要付出比较大的代价。而在有些场景下,接受状态并不用时刻保持一致,只要最终一直就行。sql
CAP(Consistency Availability Partition-Tolerance)数据库
Consistency: 即全部的节点在同一时间读到一样的数据,这就是数据上的一致性。网络
Availability: 保证不管时成功仍是失败,每一个请求都可以收到一个反馈。这里的重点是系统必定要有响应。nosql
Partition-Tolerance:即使系统中有部分问题或者有消息的丢失,但系统仍可以继续运行。这被称为分区容忍性。分布式
可是,在分布式系统中并不能同时知足上面三项。网站
1 选择CA,放弃分区容忍性,增强一致性和可用性。这其实就是传统的单机数据库的选择。设计
2 选择AP,放弃一致性,追求分区容忍性及可用性。这是不少分布式系统在设计时的选择,例如不少nosql系统就是如此。中间件
3 选择CP,放弃可用性,追求一致性和分区容忍性。这种选择下的可用性会比较低,网络的问题会直接让整个系统不可用。事件
从上面的分析能够看出,在分布式系统中,咱们通常仍是选择增强可用性和分区容忍性而牺牲一致性,而是首先知足A和P,而后看如何解决C的问题。
BASE(Basically Available Soft state Eventually consistent)
Basically Available: 基本可用,容许分区失败。
Soft state: 软状态,接受一段时间的状态不一样步。
Eventually consistent: 最终一致,保证最终数据的状态时一致的。
当咱们在分布式系统中选择了CAP中的A和P后,对于C,咱们采用的方式策略就是保证最终一致,也就是不保证数据变化后全部节点马上一致,可是保证它们最终是一致的。在大型网站中,为了更好地保持扩展性和可用性,通常都不会选择强一致性,而是采用最终一致的策略来实现。