分布式计算 – “最终一致性”vs“强大的一致性”vs“强一致性”?

我遇到了“强大的一致性”的概念。
它应该比“最终一致性”更强,但弱于“强烈一致性”吗?有人可以用适用的例子解释这三个概念之间的差异吗?

http://en.wikipedia.org/wiki/Eventual_consistency#Strong_Eventual_Consistency
http://en.wikipedia.org/wiki/Conflict-free_replicated_data_type

非常感谢。

最佳答案
免责声明:以下文字应大致了解最终一致性,强烈的一致性和强烈一致性之间的差异。但它们在某种程度上是过度简化的。所以用一粒盐来拿他们)

第一件事:当我们谈论一致性时,我们参考不同实体(节点)有自己的一些数据对象的副本的场景。现在,冲突出现是因为每个节点可以更新自己的副本(例如因为有客户端,每个节点连接到某个节点,要求他们这样做),所以如果我从不同的节点读取数据,我会看到不同的值。这是最终一致性(EC),强大的一致性(SEC)和强一体性(SC)发挥作用的地方。

最终一致性
可能会出现冲突,但是节点会相互通信他们的变化来解决这些冲突,所以在时间上他们同意最终的价值。因此,如果在一段时间内不再对数据进行更改,则所有节点将同意数据值(即它们最终将一致),因此数据读取器最终将看到相同的值。

示例:两个节点A和B(nA和nB)都有一个字符串的每一个副本,它与操作read()和write(string)进行更新。假设每个人都有自己的客户(cliA和cliB)。假设最初两个节点存储相同的值“Joe”,但是在某个时候,nA将其更新为“Frank”(调用write(“Frank”))。那么nA会告诉nB该值已经被更新了;由于这两个值都有差异,所以出现了冲突,但是可以使用某些策略(例如上一次写入获胜)来解决,所以nB终于将其记录更新为“Frank”。在冲突解决之前,cliA和cliB将看到不同版本的数据(read()op的结果会有所不同),但是最终都会再次看到相同的值。

请记住,如果两个节点同时更新其值,则冲突解决仍然可行,但更复杂。这是SEC发光的地方。

强有力的一致性
这是EC的特殊情况,仅适用于某些数据类型。

我们假设共享的数据对象是一个计数器,并且通过add(int value)和substract(int value)操作进行更新。在这种情况下,我们应用更新的顺序并不重要!因此,如果nA和nB都以0的计数值开始,并且如果nA运行add(10)和nB运行substr(5)(同时),则只需要在不关心解决冲突的情况下将更新操作发送给对方最终确保它们达到相同的价值(记住,相反,在以前的EC示例中,可能需要一些冲突解决)!

不幸的是,SEC仅适用于具有特定属性(可交换性和其他特性)的某些数据类型和操作。这种数据类型被表示为无冲突复制数据类型(CRDT)。

一致性强
与其他两个不同。这里要求在更新操作之前,所有节点都同意新值,才能使新值对客户端可见。这样,所有客户端的更新可以同时看到’,所以他们将一直读取相同的值。现在这就介绍了在更新操作中有些阻塞的要求。一旦本地副本更新,EC和SEC中的更新操作都结束了(然后将操作广播到其他节点)。这里客户端更新不会返回,直到所有节点已经同意数据值,并且完成所有对该数据的任何副本的访问都是“锁定”(因此其他客户端读取被阻止)。在我们的EC示例中,如果cliA运行write(“Frank”),cliA将被阻塞,直到更新被nA和nB同意,然后它将同时对cliA和cliB可见,即读()操作应该从那时起返回相同的值。

转载注明原文:分布式计算 – “最终一致性”vs“强大的一致性”vs“强一致性”? - 代码日志