Cosmos DB 中的重试策略

Pec*_*tum 7 c# azure azure-cosmosdb

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

RetryOptions = new RetryOptions() { MaxRetryAttemptsOnThrottledRequests = 3, MaxRetryWaitTimeInSeconds = 60 }
Run Code Online (Sandbox Code Playgroud)

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

目前我正在做以下事情:

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Kir*_*lli 2

CustomRetryOptions仅用于处理节流(429错误代码)。有关更多详细信息,请参阅https://learn.microsoft.com/en-us/azure/cosmos-db/performance-tips#429 。

关于异常部分:只有在异常情况下所有重试都用完后,API 才会退出。

默认情况下,如果请求继续以高于请求速率的速度运行,则在累积等待时间为 30 秒后,将返回状态代码 429 的 DocumentClientException。即使当前重试计数小于最大重试计数(无论是默认值 9 还是用户定义的值),也会发生这种情况。