c# - DocumentDB transient 故障处理最佳实践

标签 c# azure azure-cosmosdb

我一直在为受限制的 DocumentDB 客户端调用编写非常详细的重试逻辑。

下面的示例是一个常见的示例,重试次数为 10 次。

我的问题有两个: 这是最佳实践吗?是否有更简洁的方法来处理这个问题?我看到有一个 Microsoft.Azure.Documents.Client.TransientFaultHandling nuget 包应该可以用更少的代码实现相同的结果,但我在 StackOverflow 或 Google 上找不到任何示例,并且没有似乎是 Microsoft 提供的任何明确文档。

int maxRetryAttempts = 10;

while (maxRetryAttempts > 0)
{
    try
    {
        // Attempt to call DocumentDB Method
        // ---[DocumentDB Method Here]---
    }
    catch (DocumentClientException de)
    {
        if (de.StatusCode.HasValue)
        {
            var statusCode = (int)de.StatusCode;

            if (statusCode == 429 || statusCode == 503)
            {
                //Sleep for retry amount
                Thread.Sleep(de.RetryAfter);

                //Decrement max retry attempts 
                maxRetryAttempts--;
            }

        }
    }
    catch (AggregateException ae)
    {                    
        foreach (Exception ex in ae.InnerExceptions)
        {
            if (ex is DocumentClientException)
            {
                var documentClientException = ex as DocumentClientException;
                var statusCode = (int)documentClientException.StatusCode;
                if (statusCode == 429 || statusCode == 503)
                {
                    //Sleep for retry amount
                    Thread.Sleep(documentClientException.RetryAfter);

                    //Decrement max retry attempts 
                    maxRetryAttempts--;
                }
                else
                {
                    throw;
                }
            }
        }
    }
}

if (maxRetryAttempts < 0)
{
    //Max retry attempts reached
}

最佳答案

您可以在 DocumentDB 数据迁移工具的 Github 存储库中找到使用 TransientFaultHandling Nuget 包的示例代码:

https://github.com/Azure/azure-documentdb-datamigrationtool/blob/master/DocumentDb/Microsoft.DataTransfer.DocumentDb.FunctionalTests/DocumentDbHelper.cs

看起来像这样:

private static IReliableReadWriteDocumentClient CreateClient(IDocumentDbConnectionSettings connectionSettings)
{
    return new DocumentClient(new Uri(connectionSettings.AccountEndpoint), connectionSettings.AccountKey)
        .AsReliable(new FixedInterval(10, TimeSpan.FromSeconds(1)));
}

关于c# - DocumentDB transient 故障处理最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31065690/

相关文章:

c# - 如何跨具有空格字符的字段名过滤datagridview?

c# - 根据某些属性确定列表中的两个或多个对象是否相等

c# - 如何放弃对所有 linq 表所做的更改?

c# - C# 属性的正确语法

serialization - 使用 Azure 表存储的替代方法?

visual-studio - 如果在 vs2012 中的 Azure 角色文件夹上看到黄色三角形,如何获取错误消息?

Azure Pipelines 每个拉取请求触发 2 个作业

json - DocumentDB,对 JSON 文档使用小字段名称以最小化长度

azure - DocumentDb 客户端接收无效的 api 版本 documentdb 确保传递有效的 x-ms-version header 值

c# - Cosmos DB 中是否支持使用 OData 进行分页?