Cosmos DB中的重试策略

时间:2017-10-17 14:23:52

标签: c# azure azure-cosmosdb

我想了解如何最好地为cosmos db(documentdb)实现重试/退避策略。 我知道在sdk中内置了一些默认的重试机制,我可以在connectionpolicy中进行更改,如下所示:

RetryOptions = new RetryOptions() { MaxRetryAttemptsOnThrottledRequests = 3, MaxRetryWaitTimeInSeconds = 60 }

但是,我不确定这将如何影响我应该如何进行异常管理。

目前我正在做以下事情:

GetAsync<T>(Uri, Id) {

    try {

        ResourceResponse<Document> response = await client.ReadDocumentAsync(URiFactory.CreateDocumentUri(uri), new RequestOptions { PartitionKey = new PartitonKey(convert.ToInt64(id)) }).ConfigureAwait(false); 

    }
    catch(DocumentClientException ex) {
        if(ex.StatusCode == (HttpStatusCode)TooManyRequests) {
            await Task.Run(async () =>
            {
                await Task.Delay(ex.RetryAfter);
                return await GetAsync<T>(Uri, Id).ConfigureAwait(false);
            }
        }
    }
}

我需要重试吗?如果我捕获异常,是否会停止默认重试尝试?此外,默认重试尝试捕获的是什么?即它只是429?如果是这样,我需要手动处理错误代码449吗?

1 个答案:

答案 0 :(得分:1)

自定义RetryOptions仅用于处理限制(429错误代码)。有关详细信息,请参阅https://docs.microsoft.com/en-us/azure/cosmos-db/performance-tips#429

在异常部分:API只会在所有重试都用尽异常后才会保释。

  

默认情况下,状态代码为429的DocumentClientException为   如果请求累积等待30秒后返回   继续在请求率之上运行。这甚至发生时也会发生   当前重试计数小于最大重试计数,不管它是什么   默认值为9或用户定义的值。