【问题标题】:Does CosmosDb SDK v3 automatically retry while inserting in bulk?CosmosDb SDK v3 是否会在批量插入时自动重试?
【发布时间】:2020-11-17 20:11:31
【问题描述】:

我是 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 Too Many Requests 异常。当我切换到自动缩放时,它会在大约 20 秒内完成,无一例外。

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

【问题讨论】:

  • 您应该能够使用 Fiddler 来确定是否正在发生重试。顺便说一句,我在使用this stored procedure 进行批量操作方面取得了巨大成功。它速度快如闪电,而且发生在服务器端,所以没有 429。

标签: c# .net-core azure-cosmosdb bulkinsert azure-cosmosdb-sqlapi


【解决方案1】:

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

您可以通过更改 ConnectionPolicy 实例上的 RetryOptions 来更改默认重试次数。默认情况下,如果请求继续以高于请求速率运行,则会在累积等待 30 秒后返回状态代码为 429 的 DocumentClientException。即使当前重试计数小于最大重试计数,无论当前值是默认值 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

【讨论】:

  • 谢谢!这些链接给了我很多指导。
【解决方案2】:

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

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

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

【讨论】:

  • 谢谢你和 AnuragSharma。这对我帮助很大。我调整了重试和超时选项以及 CosmosDB 规模设置中的 RU 限制设置。它让我清楚地了解了 Cosmos 如何在这些限制下工作。当我增加到 20 次重试和 2 分钟时,400RU 工作,但只花了很长时间。将限制增加到 1500 RU 并保持默认 SDK 设置也有效。因此,这一切都归结为对性能/吞吐量和定价的微调和期望。
猜你喜欢
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多