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还是用户定义的值。
更多实现细节可以参考以下文章:
V3 中的批量确实在 429 上应用重试(您可以通过查看任何操作中的 Diagnostics
属性 来验证这一点)。
重试次数由CosmosClientOptions.MaxRetryAttemptsOnRateLimitedRequests
决定(默认9)。您收到错误的事实意味着 SDK 已经重试了 9 次。您可以增加此值并保持 SDK 重试(这将需要更长的时间)。
启用 Autoscale 有帮助这一事实意味着您要推送的数据负载对于配置的吞吐量(您提到的 400 RU)来说太高了。 Autoscale 将检测限制并增加配置的吞吐量以适应负载。
我是 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还是用户定义的值。
更多实现细节可以参考以下文章:
V3 中的批量确实在 429 上应用重试(您可以通过查看任何操作中的 Diagnostics
属性 来验证这一点)。
重试次数由CosmosClientOptions.MaxRetryAttemptsOnRateLimitedRequests
决定(默认9)。您收到错误的事实意味着 SDK 已经重试了 9 次。您可以增加此值并保持 SDK 重试(这将需要更长的时间)。
启用 Autoscale 有帮助这一事实意味着您要推送的数据负载对于配置的吞吐量(您提到的 400 RU)来说太高了。 Autoscale 将检测限制并增加配置的吞吐量以适应负载。