2016-11-12 110 views
2

我们正在使用azure搜索,并需要实现重试策略以及存储所描述的失败文档的ID。Azure搜索重试策略

是否有任何有关如何在Azure搜索中实施RetryPolicy策略的文档/示例。

感谢

+0

WaitAndRetryAsync功能的ID是你具体指重试时指数API抛出IndexBatchException?对于所有其他情况,.NET SDK已经使用具有指数回退的默认重试策略。 –

+0

@brucejohnston是的。据我们可以告诉默认策略是500错误,但如果负载问题导致失败则不会。 – user2981411

+0

是的,你需要明确处理IndexBatchException。澄清 - “存储”失败文档的ID是什么意思?你的意思是坚持他们吗? –

回答

1

这是我用什么:

private async Task<DocumentIndexResult> IndexWithExponentialBackoffAsync(IndexBatch<IndexModel> indexBatch) 
{ 
     return await Policy 
      .Handle<IndexBatchException>() 
      .WaitAndRetryAsync(5, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), (ex, span) => 
      { 
       indexBatch = ((IndexBatchException)ex).FindFailedActionsToRetry(indexBatch, x => x.Id); 
      }) 
      .ExecuteAsync(async() => await _searchClient.IndexAsync(indexBatch)); 
} 

它使用Polly library处理指数退避。在这种情况下,我使用型号为IndexModel的ID字段名为Id。 如果你想登录或储存失败的尝试,你可以做到这一点像

((IndexBatchException)ex)ex.IndexingResults.Where(r => !r.Succeeded).Select(r => r.Key).<Do something here> 
1

目前还没有展示如何正确地对IndexBatchException重试样品。但是,您可以使用一种方法使其更易于实施:IndexBatchException.FindFailedActionsToRetry。此方法从IndexBatchException中提取失败文档的ID,将它们与给定批处理中的操作相关联,并返回仅包含需要重试的失败操作的新批处理。

关于其他重试逻辑,您可能会发现ClientRuntime library这个代码有用。您需要根据您的负载特性调整参数。要记住的重要一点是,在重试之前应该使用指数回退来帮助您的服务恢复,否则您的请求可能会受到限制。