最近比较忙,很少来更新博客。这一次我们简单聊一聊一致性的问题。对于一个分布式系统来讲,一致性问题是一个非常重要,非常基础的问题。对于分布式系统的框架设计者,可以说是一个需要考虑的基本问题。在分布式系统中一个基础理论是CAP,具体说就是一致性(Consistency),可用性(Availability),分区容错(Partition tolerance)。一个个具体解释一下:
一致性:每一个读操作可以接收到最新的数据或者是错误
可用性:每一个请求可以接收到一个没有错误的相应,但是不保证该相应包含最后写的数据
分区容错:在网络的节点间发生任意数量的错误,比如延迟或者丢包,系统仍然可以正常工作。
从理论上讲,CAP是不可能完全实现的,为了拥有其中两个特性必须要损害第三个性能。对于分布式系统一般认为分区容错是一个必须支持的特性,原因在于分布式系统必然基于网络构建,而网络上的传输错误是不可避免的。在这里多说一句,partition的概念在AWS里很多服务中都会涉及,是一个非常普遍的需要了解的概念。以后再谈到具体的服务时再讨论。在我们只能选择两个而放弃一个的情况下,可用性和一致性只能二选一了。我们如果仔细看AWS的服务,会发现有些服务是允许用户选择那个特性优先的,比如DynamoDB,也有很多系统是不可选择的。当不可选择时,也就是说系统已经默认了哪个优先,大多数情况下是可用性优先,也有些服务是一致性优先。
当可用性优先时,又会涉及到另一个话题,这个时候什么样的系统行为是可以接受的?对于AWS来说这涉及到幂等(idempotent)和最终一致性(eventua