Azure CosmosDB 一致性保证

问题描述

Microsoft 在他们的 documentation 中声明了一致前缀的一致性如下:

在一致前缀选项中,返回的更新包含一些 所有更新的前缀,没有间隙。一致的前缀一致性 级别保证读取永远不会看到乱序写入。

下面有两段,他们说:

以下是一致前缀的一致性保证:

  • 单个写入区域 = 一致前缀的帐户在同一区域的客户端的一致性

  • 单个写入区域 = 一致前缀的帐户在不同区域的客户端的一致性

  • 为具有多个写入区域的帐户写入单个区域的客户端一致性 = 一致前缀

  • 为具有多个写入区域 = 最终的帐户写入多个区域的客户端的一致性

我真的不明白客户端如何为具有多个写入区域的帐户写入多个区域可以保证最终一致性。由于一致前缀一致性保证读取永远不会看到乱序写入,那么下面的语句(多次写入)应该是错误的,因为它保证了最终一致性

有人可以帮我弄清楚我遗漏了什么吗?

解决方法

通常,一致性保证是在假设它是单区域写入(单主)的情况下写入的。由于 Cosmos DB 提供多区域写入(多主)能力,一致性保证需要进一步解释以详细说明给定不同数量的读取器和写入器的服务行为,包括多区域写入(多主)。

当您有多个写入器并使用多区域写入时,在帐户中配置的区域内本地写入的数据会在本地提交,然后通过 WAN 复制并合并到主要区域中。一旦数据在主要区域中合并,它就会复制回完全提交到帐户中的所有其他区域。

因为这是通过 WAN 发生的,所以无法保证写入多个次要区域的数据将按照在本地提交的顺序精确地复制和合并到主要区域中。数据在 WAN 中并不总是以相同的速率和速度复制。这既是因为区域之间的距离不同,也因为 WAN 有时会有些不稳定。

出于这个原因,当使用多个写入者的多区域写入时,读取者只能获得最终的一致性保证。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...