DocumentDB中的冲突解决方案



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

我以前使用过Riak和Cassandra。riak基于向量时钟工作,我们可以决定解决冲突是系统是否会自动执行或用户必须处理的冲突,通常在敏感日期的情况下,用户不希望系统确定一次保留哪个以及哪个放弃。卡桑德拉(Cassandra(也是基于时间戳记的。

因此,根据cesomosdb的考虑,我们具有从强度到最终的各种一致性水平。根据一致性的选择,系统可能会产生同级。

Q1。因此,我的第一个问题是兄弟姐妹的处理方式以及解决冲突解决方案。

Q2。第二个问题就像riak和cassandra中的矢量时钟和时间戳记。documentdb中的机制是什么。

cosmos db采用单个主写入键范围。不管一致性级别如何,保证的写作都是无冲突的。冲突的唯一可能性是在写入区域的自动故障转移期间。此场景在此处详细说明https://learn.microsoft.com/en-us/azure/cosmos-db/regional-failover。

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

@karthik是正确的,直到Cosmos成为单一主人,但随着多主(并发多个多区域写入的可能性(,冲突是不可避免的。

让Azure处理冲突( lww ,基于时间戳(,如果您未指定任何策略,则默认情况>自定义(。

对于LWW,除了自定义外,您无需做任何事情,一旦指定了策略,就可以根据业务逻辑阅读冲突并解决。PFB关于如何解决冲突的Java片段。

java async 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 */
}

参考:管理冲突解决策略

最新更新