【发布时间】:2020-02-04 17:38:30
【问题描述】:
我试图了解通过 .NET 客户端 SDK 使用 Azure DocumentDb 时会话一致性的实际含义,即定义(和限制)会话的内容。每次我们创建 DocumentClient 的新实例时是否都会创建一个新会话,如果是这样,如果我们使用 IReliableReadWriteDocumentClient 包装器,行为是否会改变?
【问题讨论】:
标签: azure-cosmosdb
我试图了解通过 .NET 客户端 SDK 使用 Azure DocumentDb 时会话一致性的实际含义,即定义(和限制)会话的内容。每次我们创建 DocumentClient 的新实例时是否都会创建一个新会话,如果是这样,如果我们使用 IReliableReadWriteDocumentClient 包装器,行为是否会改变?
【问题讨论】:
标签: azure-cosmosdb
是的,每次创建 DocumentClient 类的新实例时都会创建一个新会话。每个 DocumentClient 实例维护一个集合映射 -> 会话令牌映射。客户端保存从服务器接收到的最新会话令牌,并在读取请求期间将其作为标头 (x-ms-sessiontoken) 回显。这使 DocumentDB 能够找到您的集合的最新副本,以提供会话(或读取您的写入)一致性。这与 IReliableReadWriteDocumentClient 相同,因为它是 DocumentClient 的包装器。
注意:实现会话一致性的最简单方法是让单个 DocumentClient 实例自动为您管理它。您还可以稍微复杂一点地跨多个 DocumentClient 实例管理逻辑会话。例如,假设您有一个负载平衡的 Web API,其中有两台服务器,每台服务器都有一个 DocumentClient 实例,并且您希望这些服务器之间的会话保持一致。
您可以通过将步骤 1 中返回的 x-ms-sessiontoken 保存为客户端中的 cookie 来实现此目的,然后在读取请求中回显该 x-ms-sessiontoken。通过往返会话令牌,您可以获得会话一致性。
【讨论】: