"Eventual Consistency" vs "Strong Eventual Consistency" vs "Strong Consistency"?

"Eventual Consistency" vs "Strong Eventual Consistency" vs "Strong Consistency"?

我遇到了 "Strong Eventual Consistency" 的概念。 它应该比 "Eventual Consistency" 强但比 "Strong Consistency" 弱吗?有人可以用适用的例子解释这三个概念之间的区别吗?

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(nAnB)各有一个字符串副本,它是用操作更新的read()write(string)。假设每个都有自己的客户端(cliAcliB)。假设最初两个节点存储相同的值 "Joe",但在某个时刻 nA 将其更新为 "Frank"(调用 write("Frank"))。然后nA会告诉nB这个值已经更新了;由于两个值不同,出现了冲突,但可以使用某些策略(例如最后写入获胜)解决冲突,因此 nB 最终也将其记录更新为 "Frank"。在冲突解决之前 cliAcliB 会看到不同版本的数据(read() op 结果会不同),但最终两者都会再次看到相同的值。

请记住,如果两个节点同时更新它们的值,那么仍然可以解决冲突,但会更复杂。这就是 SEC 的亮点。

强最终一致性 这是 EC 的特例,仅对某些数据类型有效。

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

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

一致性强 与其他两个截然不同。这里要求在更新操作时,所有节点在使新值对客户端可见之前就新值达成一致。这样所有客户端 'at the same time' 都可以看到更新,因此它们将始终读取相同的值。现在这引入了更新操作中一些阻塞的要求。在 EC 和 SEC 中,更新操作在本地副本更新后立即结束(然后该操作被广播到其他节点)。在这里,客户端更新不会 return 直到所有节点都同意数据值,并且在完成此操作时对该数据的任何副本的所有访问都是 'locked'(因此其他客户端读取被阻止)。在我们的 EC 示例中,如果 cliA 运行 write("Frank")cliA 将被阻止,直到 同意更新]nAnB,然后它将对 cliAcliB[=64= 可见] 同时,即 read() 操作应该 return 从那时起相同的值。