4

我们正在使用 azure 搜索,需要实施重试策略,并按照描述存储失败文档的 ID。

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

谢谢

4

2 回答 2

2

这是我使用的:

 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 库来处理指数退避。在这种情况下,我使用一个IndexModel具有名为 id 字段的模型Id。如果您想记录或存储失败尝试的 ID,您可以在WaitAndRetryAsync函数中执行此操作,例如

((IndexBatchException)ex)ex.IndexingResults.Where(r => !r.Succeeded).Select(r => r.Key).<Do something here>
于 2017-06-11T09:20:50.683 回答
1

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

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

于 2016-11-15T19:48:34.043 回答