documentdb 中的冲突解决

Conflict resolution in documentdb

在分布式容错系统中,冲突解决至关重要,因为将镜像同一日期的多个副本,并且任何请求都可以在写入时同时转到任何节点。

我以前用过Riak和Cassandra。 Riak 基于矢量时钟工作,我们可以决定冲突解决是系统自动执行还是用户必须处理,通常在敏感日期的情况下,用户不希望系统决定保留哪一次和哪一次放弃。 Cassandra 也是如此,它基于时间戳。

因此,根据 cosomosdb 的考虑,我们有从强到最终的各种一致性级别。基于一致性的选择,系统可能会生成兄弟。

Q1。所以我的第一个问题是如何处理兄弟姐妹并因此解决冲突 happening.Is 有一种方法可以从用户端以编程方式处理兄弟姐妹,而不是系统决定在兄弟姐妹的情况下保留哪个兄弟姐妹以及丢弃哪个兄弟姐妹。

Q2。第二个问题是 Riak 和 Cassandra 中的矢量时钟和时间戳,documentdb 中的机制是什么。

Cosmos DB 对分区键范围采用单主写入。无论一致性级别如何,写入都保证无冲突。唯一可能发生冲突的时间是在写入区域的自动故障转移期间。此处 https://docs.microsoft.com/en-us/azure/cosmos-db/regional-failover.

更详细地解释了这种情况

在写入区域故障转移的情况下,任何未复制的写入都将被注册为冲突。应用程序可以对该记录执行手动合并。以下是 ConflictFeedAsync https://msdn.microsoft.com/en-us/library/microsoft.azure.documents.client.documentclient.readconflictfeedasync.aspx

的详细信息

@Karthik 在 Cosmos 是单主之前是对的,但是随着多主的引入(有可能同时进行多区域写入)冲突是不可避免的。

要么让 azure 处理冲突(LWW,基于时间戳),如果您没有指定任何策略,这是默认设置,或者您编写自定义逻辑以根据您的应用需求(自定义).

对于 LWW,除了自定义之外,您无需执行任何操作,一旦您 specify 策略,您就可以读取冲突并根据您的业务逻辑解决。 PFB 关于如何解决冲突的 java 片段。

Java 异步 API

FeedResponse<Conflict> response = client.readConflicts(this.manualCollectionUri, null).first().toBlocking().single();
for (Conflict conflict : response.getResults()) {
/* Do something with conflict */
}

Java同步API

Iterator<Conflict> conflictsIterator = client.readConflicts(this.collectionLink, null).getQueryIterator();
while (conflictsIterator.hasNext()) {
Conflict conflict = conflictsIterator.next();
/* Do something with conflict */
}

参考:Manage conflict resolution polices