我想了解如何最好地为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吗?
答案 0 :(得分:1)
自定义RetryOptions
仅用于处理限制(429错误代码)。有关详细信息,请参阅https://docs.microsoft.com/en-us/azure/cosmos-db/performance-tips#429。
在异常部分:API只会在所有重试都用尽异常后才会保释。
默认情况下,状态代码为429的DocumentClientException为 如果请求累积等待30秒后返回 继续在请求率之上运行。这甚至发生时也会发生 当前重试计数小于最大重试计数,不管它是什么 默认值为9或用户定义的值。