适用范围: NoSQL
当多个工作负荷共享同一 Azure Cosmos DB 容器时,资源争用可能会导致限制、延迟增加以及潜在的业务影响。 为了解决此问题,Cosmos DB 允许分配吞吐量存储桶,确保更好地隔离和管理多个工作负荷的资源使用情况。
常见用例
- 由独立软件供应商(ISV)管理的多租户工作负荷
- ETL 作业中的批量执行
- 数据引入和迁移过程
- 存储过程的执行
- 更改源处理
吞吐量存储桶的工作原理
吞吐量存储桶通过限制存储桶可以消耗的最大吞吐量,帮助管理共享 Cosmos DB 容器的工作负荷的资源消耗。 吞吐量并不分配给任何一个特定的存储桶,而是仍然在所有工作负荷之间共享。
- 每个存储桶的最大吞吐量百分比上限,限制容器可以消耗的总吞吐量的分数。
- 分配给存储桶的请求只能消耗高达此限制的吞吐量。
- 如果存储桶超出其配置的限制,将限制后续请求。
- 此机制有助于防止资源争用,确保单个工作负荷不会消耗过多的吞吐量并影响其他工作负荷。
注释
那些没有分配到存储桶的请求将不受限制地消耗容器的处理能力。
入门指南
若要启用吞吐量存储桶,请转到 Azure 门户中订阅页上的 “预览功能 ”部分。 搜索 吞吐量存储桶 功能并注册预览版。 注册获得批准后,可能需要长达一小时才能在订阅中的所有帐户上启用吞吐量存储桶。 启用后,可以为 Cosmos DB 容器创建吞吐量存储桶。
配置吞吐量存储桶
若要在 Azure 门户中设置吞吐量存储桶,请执行以下作:
- 打开 数据资源管理器 并导航到容器的“ 缩放和设置” 窗格。
- 找到“吞吐量存储桶”选项卡。
- 通过将所需吞吐量存储桶从“非活动”切换为“活动”来启用该存储桶。
- 为启用的存储桶(每个容器最多五个存储桶)设置所需的最大吞吐量百分比。
最低 SDK 版本要求
- .NET >= 3.50.0-preview.0
- Javascript >=4.3.0
- Python >=4.11.0b1
在 SDK 请求中使用吞吐量存储桶
若要向特定存储桶分配请求,请在 SDK 中使用 RequestOptions。
using Microsoft.Azure.Cosmos;
string itemId = "<id>";
PartitionKey partitionKey = new PartitionKey("<pkey>");
// Define request options with Throughput Bucket 1 for read operation
ItemRequestOptions readRequestOptions = new ItemRequestOptions{ThroughputBucket = 1};
// Send read request using Bucket ID 1
ItemResponse<Product> readResponse = await container.ReadItemAsync<Product>(
itemId,
partitionKey,
readRequestOptions);
Product product = readResponse.Resource;
// Define request options with Throughput Bucket 2 for update operation
ItemRequestOptions updateRequestOptions = new ItemRequestOptions{ThroughputBucket = 2};
// Send update request using Bucket ID 2
ItemResponse<Product> updateResponse = await container.ReplaceItemAsync(
product,
itemId,
partitionKey,
updateRequestOptions);
若要将吞吐量存储桶应用于客户端应用程序中的所有请求,请使用 SDK 中的 ClientOptions。
using Microsoft.Azure.Cosmos;
using Azure.Identity;
var credential = new DefaultAzureCredential();
// Create CosmosClient with Bulk Execution and Throughput Bucket 1
CosmosClient cosmosClient = new CosmosClientBuilder("<endpointUri>", credential)
.WithBulkExecution(true) // Enable bulk execution
.WithThroughputBucket(1) // Assign throughput bucket 1 to all requests
.Build();
// Get container reference
Container container = cosmosClient.GetContainer("<DatabaseId>", "<ContainerId>");
// Prepare bulk operations
List<Task> tasks = new List<Task>();
for (int i = 1; i <= 10; i++)
{
var item = new
{
id = Guid.NewGuid().ToString(),
partitionKey = $"pkey-{i}",
name = $"Item-{i}",
timestamp = DateTime.UtcNow
};
tasks.Add(container.CreateItemAsync(item, new PartitionKey(item.partitionKey)));
}
// Execute bulk insertions with throughput bucket 1
await Task.WhenAll(tasks);
//Read item with throughput bucket 1
ItemResponse<Product> response = await container.ReadItemAsync<Product>(partitionKey: new PartitionKey("pkey1"), id: "id1");
注释
如果启用了批量执行,则无法使用 RequestOptions 将吞吐量存储桶分配给单个请求。
数据资源管理器中的存储桶行为
- 如果配置 了 Bucket 1 ,则来自数据资源管理器的所有请求都使用此存储桶并遵守其吞吐量限制。
- 如果未配置 Bucket 1 ,则请求会利用容器的完整可用吞吐量。
监视吞吐量存储桶
可以在 Azure 门户中跟踪存储桶使用情况:
请求总数(预览版):通过按 ThroughputBucket 拆分指标来查看每个存储桶的请求数。
请求单位总数(预览版):通过按 ThroughputBucket 拆分指标,监视每个存储桶的 RU/s 消耗情况。
局限性
- 在共享吞吐量数据库中,容器不受支持。
- 不适用于无服务器 Cosmos DB 帐户。
- 分配给存储桶的请求不能利用突发容量。
后续步骤
- 阅读有关吞吐量存储桶的 常见问题解答 。