CosmosDb SDK v3 是否在批量插入时自动重试?

Does CosmosDb SDK v3 automatically retry while inserting in bulk?

我是 CosmosDB 的新手,我正在尝试掌握 R/U 的设置限制。

情况

在 ASP.NET Core 2.1 应用程序中,我想一次插入 +/- 3000 个文档。循环这些项目并将它们一一添加需要几分钟的时间。所以散装可能是要走的路。我关注了一些资源,例如:

Bulk import data to Azure Cosmos DB SQL API account by using the .NET SDK on docs.microsoft.com

Introducing Bulk support in the .NET SDK

在我的代码中,我使用了博客中的示例代码。

List<Task> concurrentTasks = new List<Task>();
foreach (var entity in entities)
{
    entity.Id = GenerateId(entity);

    concurrentTasks.Add(Container.CreateItemAsync(entity, new PartitionKey(entity.RoleId)));
}

await Task.WhenAll(concurrentTasks);

将一个文档从我的本地开发机器插入 Azure 大约需要 6 R/U。

当我设置默认 400 R/U 秒时,我很快得到 429 太多请求异常。当我切换到 Autoscale 时,大约 20 秒内完成,无一例外。

我的问题是:如果我想限制 R/U 并且仍然使用这种 concurrentTasks 方法,SDK 会进行重试处理吗?或者我需要自己写 429-retry

SDK 捕获 429 错误并重试请求,当前内部默认重试次数为 9,如果超过此限制,客户端将向应用程序抛出状态码为 429 的 DocumentClientException。

您可以通过更改 ConnectionPolicy 实例上的 RetryOptions 来更改默认重试次数。默认情况下,如果请求继续以高于请求速率的速度运行,则在累计等待 30 秒后返回状态代码为 429 的 DocumentClientException。这个错误returns即使当前重试次数小于最大重试次数,无论当前值是默认值9还是用户定义的值。

更多实现细节可以参考以下文章:

  1. https://docs.microsoft.com/en-us/azure/cosmos-db/performance-tips#429
  2. https://docs.microsoft.com/en-us/azure/cosmos-db/bulk-executor-dot-net
  3. https://docs.microsoft.com/en-us/dotnet/api/microsoft.azure.documents.client.connectionpolicy.retryoptions?view=azure-dotnet

V3 中的批量确实在 429 上应用重试(您可以通过查看任何操作中的 Diagnostics 属性 来验证这一点)。

重试次数由CosmosClientOptions.MaxRetryAttemptsOnRateLimitedRequests决定(默认9)。您收到错误的事实意味着 SDK 已经重试了 9 次。您可以增加此值并保持 SDK 重试(这将需要更长的时间)。

启用 Autoscale 有帮助这一事实意味着您要推送的数据负载对于配置的吞吐量(您提到的 400 RU)来说太高了。 Autoscale 将检测限制并增加配置的吞吐量以适应负载。