启用集成缓存

已完成

启用集成缓存

启用集成缓存分为两个主要步骤来完成:

  • 在 Azure Cosmos DB for NoSQL 帐户中创建专用网关
  • 更新 SDK 代码以将该网关用于请求

创建专用网关

首先,必须在帐户中预配专用网关。 此操作可以使用门户和“专用网关”窗格来完成

Azure Cosmos DB 窗格中打开的专用网关导航

在预配过程中,系统会要求你配置网关实例数和一个 SKU。 这些设置会确定节点数以及每个网关节点的计算和内存大小。 以后可以随着需要缓存的数据量增加而修改节点数和 SKU。

用于 SKU 和节点数的专用网关配置选项

预配新网关后,可以获取网关的终结点。

注意

网关终结点不同于用于 Azure Cosmos DB for NoSQL 客户端的典型终结点。

更新 .NET SDK 代码

若要使 .NET SDK 客户端可使用集成缓存,必须确保满足以下三个条件:

  • 该客户端使用专用网关终结点而不是典型终结点
  • 客户端配置为使用 Gateway 模式,而不是默认的 Direct 连接模式
  • 客户端的一致性级别必须设置为 session 或 eventual

首先,确保终结点设置为专用网关的终结点。 通常,Azure Cosmos DB for NoSQL 终结点的格式为 <cosmos-account-name>.documents.azure.com。 对于专用网关,终结点的结构为 <cosmos-account-name>.sqlx.cosmos.azure.com

将 SDK 配置为使用托管标识进行身份验证,而不是使用帐户密钥。 更新后的代码如下。

using Azure.Identity;
using Microsoft.Azure.Cosmos;

string endpoint = "https://<cosmos-account-name>.sqlx.cosmos.azure.com/";

CosmosClientOptions options = new()
{
    ConnectionMode = ConnectionMode.Gateway,
    ConsistencyLevel = ConsistencyLevel.Session // or ConsistencyLevel.Eventual
};

// Use DefaultAzureCredential to authenticate with managed identity.
CosmosClient client = new(endpoint, new DefaultAzureCredential(), options);

注意

确保应用程序已启用托管标识,并且已向托管标识授予 Azure Cosmos DB 帐户的 Cosmos DB 内置数据参与者角色。

配置点读取操作

若要将点读取操作配置为使用集成缓存,必须创建 ItemRequestOptions 类型的对象。 在此对象中,可以手动将 ConsistencyLevel 属性设置为 ConsistencyLevel.Session 或 ConsistencyLevel.Eventual。 然后,可以在 ReadItemAsync 方法调用中使用 options 变量

string id = "9DB28F2B-ADC8-40A2-A677-B0AAFC32CAC8";
PartitionKey partitionKey = new("56400CF3-446D-4C3F-B9B2-68286DA3BB99");

ItemRequestOptions requestOptions = new()
{
    ConsistencyLevel = ConsistencyLevel.Session
};

ItemResponse<Product> response = await container.ReadItemAsync<Product>(id, partitionKey, requestOptions: requestOptions);

若要观察 RU 使用情况,请使用 response 变量的 RequestCharge 属性。 此读取操作的第一次调用会使用预期数量的请求单位。 在此示例中,它对于点读取操作将是一个 RU。 后续请求不会使用任何请求单位,因为数据在过期之前会从缓存中拉取。

Console.WriteLine($"Request charge:\t{response.RequestCharge:0.00} RU/s");

配置查询

若要将查询配置为使用集成缓存,请创建 QueryRequestOptions 类型的对象。 在此对象中,还应手动更改一致性级别。 然后将 options 变量传入到 GetItemQueryIterator 方法调用

string sql = "SELECT * FROM products";
QueryDefinition query = new(sql);

QueryRequestOptions queryOptions = new()
{
    ConsistencyLevel = ConsistencyLevel.Eventual
};

FeedIterator<Product> iterator = container.GetItemQueryIterator<Product>(query, requestOptions: queryOptions);

还可通过获取与每个结果页关联的每个 FeedResponse 对象的 RequestCharge 属性来观察 RU 使用情况。 如果聚合请求费用,则会获取整个查询的总请求费用。 与点读取非常类似,第一个查询会使用典型数量的请求单位。 在缓存中的数据过期之前,任何额外查询都不会使用请求单位。

double totalRequestCharge = 0;
while(iterator.HasMoreResults)
{
    FeedResponse<Product> response = await iterator.ReadNextAsync();
    totalRequestCharge += response.RequestCharge;
    Console.WriteLine($"Request charge:\t\t{response.RequestCharge:0.00} RU/s");
}

Console.WriteLine($"Total request charge:\t{totalRequestCharge:0.00} RU/s");