首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以为cosmosdb使用客户端构造的会话令牌吗?

我可以为cosmosdb使用客户端构造的会话令牌吗?
EN

Stack Overflow用户
提问于 2020-09-27 03:25:36
回答 1查看 1.1K关注 0票数 4

我已经对在cosmosdb的dotnet中使用会话令牌做了一些研究,到目前为止,我发现了以下两个链接,这些链接为我提供了一些关于如何使用它的提示:利用-会话令牌如何转换会话令牌

在我们的场景中,如果更新属于同一个userId,我们希望具有强一致性(但我们不希望对所有数据使用强一致性),这样当一个实例更新该用户下的数据时,其他所有人都会立即看到结果。我们还希望使用cosmosdb作为另一个场景的锁。

但是,上面的链接只显示了如何重用创建文档时返回的令牌。我想知道我是否能够构造自己的会话令牌,并使用它来获得很强的一致性。

例如,如果我想更新特定userId下的数据,我将使用{userId}:-1#1作为会话令牌。这是否是使用会话令牌的有效方式?我也不确定pkrangeid、Version、GlobalLSN等字段的含义,以及它们在cosmosdb处理一致性问题时所扮演的角色。

提前感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-27 16:19:14

会话令牌包括客户端无法创建的LSN。会话令牌必须由服务发出,因为它是为会话一致性提供一致性保证的唯一方法。

要获得区域内强一致性,或者更准确地说,读取会话一致性提供的您自己的写保证,并且正在使用Cosmos客户端的单个实例,您将已经读取了您自己的写保证。您不需要管理会话令牌。宇宙SDK为你做这件事。

如果您有一个场景,在不同的进程中有多个Cosmos DB客户端实例,并且您希望读取自己的写保证,那么您有两个选项。

  1. 实现有界的丢失一致性,为该区域的所有Cosmos客户端实例的读写提供区域内的强一致性。它通过读取两个副本来做到这一点。由于Cosmos DB总是写入3个副本,因此保证始终读取最新的数据,因为Cosmos DB将从两个副本中检查LSN,如果它们不匹配,则从较高的LSN返回数据。这种方法的优点是它非常容易实现。缺点是点读取(即ReadItemAsync())的开销是从两个副本读取的成本的两倍。
  2. 使用会话一致性,并在持久函数或类似功能中使用状态实体,这些实体将允许您实现分布式互斥对象,以便跨多个Cosmos客户端实例存储和更新会话令牌。优点是点读仍然是1 RU,缺点是这种复杂性,而且所有的写都是序列化的,因为它们要求队列所有写到互斥对象,而互斥必须由每个客户端实例更新。注意:如果您的客户端在同一个进程中,但在多个线程上,您可以使用一个并发集合,它更简单,但仍然需要同步线程,因此当存在高并发性时,会影响客户端的写入吞吐量。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64084499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档