通过 CosmosDB v3 Bulk API 处理不成功的文档更新插入/删除

问题描述 投票:0回答:1

我已使用 Azure CosmosDB SDK 将我的应用程序迁移到 v3(版本

3.43.1
),并且我正在使用批量功能更新插入 200 到 1000 个项目。

使用 BulkExecutor 及其配置,我在更新插入时获得了 100% 的成功率 - 所有文档均已保存。

在 V3 中,我收到 429 响应,并且仅保存了一些文档。我不知道该如何处理那些没有保存的人。

ClientOptions
设置:

var options = new CosmosDbOptions
{
  AllowBulkExecution = true,
  MaxRetryWaitTimeOnRateLimitedRequests = TimeSpan.FromSeconds(60),
  MaxRetryAttemptsOnRateLimitedRequests = 19,
}

我正在使用 BulkOperations 包装器,如 docs 中所述。

我的批量更新插入的主要方法如下所示:

public async Task<BulkOperationResponse<TDocument>> ImportAsync(IEnumerable<TDocument> documents)
{
     var bulkOperations = new BulkOperations<TDocument>(documents.Count());

    foreach (var document in documents)
    {
        bulkOperations.Tasks.Add(CaptureOperationResponse(_container.Value.CreateItemAsync(document, new PartitionKey(document.PartitionKey)), document));
    }

    var response = await bulkOperations.ExecuteAsync();
    return response;
}

检查后

BulkOperationResponse<T>
我经常看到只保存了一大块文档。

enter image description here

我在尝试通过方法批量删除文档时遇到同样的问题:

public async Task<BulkOperationResponse<TDocument>> DeleteAsync(IEnumerable<TDocument> documents)
{
    var bulkOperations = new BulkOperations<TDocument>(documents.Count());

    foreach (var document in documents)
    {
        bulkOperations.Tasks.Add(CaptureOperationResponse(_container.Value.DeleteItemAsync<TDocument>(document.Id, new PartitionKey(document.PartitionKey)), document));
    }

    var response = await bulkOperations.ExecuteAsync();

    return response;
}

我正在使用 4 个容器的共享吞吐量 - 400 RU/s。

知道重试更新插入失败文档的推荐方法是什么吗? 它应该由 SDK 处理还是应该在我的代码中重试?

提前感谢您的指导:)

.net azure-cosmosdb
1个回答
0
投票

您应该让 SDK 来处理它。它已经实现了一个经过彻底测试的重试处理程序,并且知道瞬态错误和其他错误之间的区别。

如果您只关心上传所有文档,您只需增加

MaxRetryAttemptsOnRateLimitedRequests
MaxRetryWaitTimeOnRateLimitedRequests
即可。就您而言,仅增加尝试次数可能就足够了,因为您仍然在等待时间限制内。

© www.soinside.com 2019 - 2024. All rights reserved.