documentdb中的冲突解决方案

时间:2017-05-31 06:54:32

标签: azure azure-cosmosdb

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

的详细信息

答案 1 :(得分:0)

@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 Sync 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