启用集成缓存
启用集成缓存
启用集成缓存分为两个主要步骤来完成:
- 在 Azure Cosmos DB for NoSQL 帐户中创建专用网关
- 更新 SDK 代码以将该网关用于请求
创建专用网关
首先,必须在帐户中预配专用网关。 此操作可以使用门户和“专用网关”窗格来完成。
在预配过程中,系统会要求你配置网关实例数和一个 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");