2016-11-12 192 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這個代碼有用。您需要根據您的負載特性調整參數。要記住的重要一點是,在重試之前應該使用指數回退來幫助您的服務恢復,否則您的請求可能會受到限制。