2017-07-05 12 views
1

ServiceUnavailableを管理するためのよく知られたパターンはありますか? 私はこのコードは、単にそれに現在の通話を遅らせるが、他のスレッドからの呼び出しを防ぐことはできません。このAzureの検索503

catch (CloudException e) when (System.Net.HttpStatusCode.ServiceUnavailable.Equals(e.Response?.StatusCode)) 
{ 
    var howMuchWait = TimeSpan.FromMinutes(1); 
    if (e.Response.Headers.TryGetValue("Retry-After", out var hValue)) 
    { 
     if(RetryConditionHeaderValue.TryParse(hValue.FirstOrDefault(), out var time) && time.Delta.HasValue) 
     { 
      howMuchWait = time.Delta.Value; 
     } 
    } 
    logger.LogWarning(() => $"Service Unavailable... Let him rest a bit, I will wait for {howMuchWait}."); 
    await Task.Delay(howMuchWait); 
    return indexEntities.Select(x => (string)x[indexKeyFieldName]).ToList(); 
} 

のようなものでとても満足していません。 今私はStopwatchを使って別のものを実装しています。よく知られているパターンがあるかどうかを知りたいと思います。 注:SDKを使用しているすべて。

答えて

1

503を管理するときは、固定時間遅延ではなく、増分バックオフメカニズムを実装することをお勧めします。たとえば、1秒、2、4、8などで始まります。これの主な理由は、Azure Searchに多くの作業を送信する場合は、それが追いつくようにすることです継続的にそれにもっと多くの仕事を送ろうとしています。

ところで、これを読んでいる人には、これらの503(一般的に大量アップロード用)が多くのリソースを提供しているのを見ている間にパーティションを追加することをお勧めします。これは、サービスがパーティションを構成するために必要な作業が増えるためです。パーティションを増やす必要があると思われる場合は、作業を行う前にこれを実行し、必要に応じて後で縮小することが最善の方法です。

また、Azure Search .NET SDKを活用すると、再試行は既に統合されているということもあります。ブルース、ここにいくつかの良い情報があります:Azure Search RetryPolicy

+0

こんにちは。私は、サービスにもっと多くの仕事を送ろうとしていることを知っています。そのため、RetryPolicy(「私が忙しいことを知っているなら、(再試行しないでください)」と読みません。私はこのような何かに取り組んでいます: '' 'タスクの非同期プライベート> InsertBatch(ISearchIndexClientインデックス、リスト indexEntities) \t \t { \t \t \t(IsInDoNotDisturb()) \t \t \t { \t \t場合\t \t return indexEntities.Select(x =>(文字列)x [indexKeyFieldName])。ToList(); \t \t \t '' ' –

+0

Liam/Bruceは、私たちにそれを尊重する機会を与えるために503で' Retry-After'ヘッダーを持たせるのが本当に便利です。 –

関連する問題