2017-10-17 172 views
2

我想了解如何最好地实现cosmos db(documentdb)的重试/退避策略。 我明白,有内置于SDK中一些默认的重试机制,我可以在connectionpolicy这样修改:宇宙重试策略DB

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

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

在异常部分:API将只在所有重试耗尽且异常情况下保留。

缺省情况下,状态码429的DocumentClientException是如果请求 继续请求速率上述操作30秒的累计等待时间之后 返回。即使 当前的重试计数小于最大重试计数(即 的缺省值为9或用户定义的值),也会发生这种情况。