我已使用 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>
我经常看到只保存了一大块文档。
我在尝试通过方法批量删除文档时遇到同样的问题:
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 处理还是应该在我的代码中重试?
提前感谢您的指导:)
您应该让 SDK 来处理它。它已经实现了一个经过彻底测试的重试处理程序,并且知道瞬态错误和其他错误之间的区别。
如果您只关心上传所有文档,您只需增加
MaxRetryAttemptsOnRateLimitedRequests
和 MaxRetryWaitTimeOnRateLimitedRequests
即可。就您而言,仅增加尝试次数可能就足够了,因为您仍然在等待时间限制内。