次の方法で共有


再試行

適用対象: すべての API Management レベル

retry ポリシーは子ポリシーを 1 回実行し、再試行 conditionfalse になるか再試行 count に達するまで、実行を再試行します。

retry ポリシーには、wait ポリシーを除き、その子要素として他のポリシーを含めることができます。

ポリシーの要素と子要素を、ポリシー ステートメントで指定された順序で設定します。 API Management ポリシーを設定または編集する方法について説明します。

ポリシー ステートメント

<retry
    condition="Boolean expression or literal"
    count="number of retry attempts"
    interval="retry interval in seconds"
    max-interval="maximum retry interval in seconds"
    delta="retry interval delta in seconds"
    first-fast-retry="boolean expression or literal">
        <!-- One or more child policies. No restrictions. -->
</retry>

属性

属性 説明 必要 既定値
条件 ブール型。 再試行を停止するか (false) 継続するか (true) を指定します。 ポリシー式を使用できます。 はい 該当なし
数える 再試行回数を指定する 1 から 50 の正の数。 ポリシー式を使用できます。 はい 該当なし
サイクル間隔 再試行の間の待機間隔を指定する正の数 (秒単位)。 ポリシー式を使用できます。 はい 該当なし
max-interval 再試行の間の最大待機間隔を指定する正の数 (秒単位)。 指数再試行アルゴリズムを実装するために使用されます。 ポリシー式を使用できます。 いいえ 該当なし
三角州 待機間隔の増分値を指定する正の数 (秒単位)。 線形再試行アルゴリズムと指数再試行アルゴリズムを実装するために使用されます。 ポリシー式を使用できます。 いいえ 該当なし
first-fast-retry ブール型。 true に設定した場合、最初の再試行がすぐに実行されます。 ポリシー式を使用できます。 いいえ false

再試行までの待ち時間

  • interval のみを指定した場合、再試行はinterval間隔で実行されます。

  • intervaldelta のみが指定されている場合、線形 間隔の再試行アルゴリズムが使用されます。 再試行間の待機時間は、次の式 (interval + (count - 1)*delta) に従って増加します。

  • intervalmax-intervaldelta を指定すると、指数 間隔再試行アルゴリズムが適用されます。 再試行間の待機時間は、interval + (2^(count - 1)) * random(delta * 0.8, delta * 1.2)max-interval で設定された最大間隔まで、次の式に従って指数関数的に増加します。

    たとえば、interval および delta が両方とも 10 秒に設定され、max-interval が 100 秒に設定されている場合、再試行の間のおおよその待機時間は、10 秒、20 秒、40 秒、80 秒、残りの再試行に 100 秒の待機時間が使用されます。

要素

retry ポリシーには、wait ポリシーを除き、その子要素として他のポリシーを含めることができます。

使用

使用に関する注記

  • このポリシーは、最初の再試行を実行するためのretryを評価する前に、condition ブロック内の子ポリシーを実行します。

指数再試行による転送を要求する

次の例では、要求の転送が、指数再試行アルゴリズムを使用して 10 回まで再試行されます。 first-fast-retryfalse に設定されているため、すべての再試行は指数関数的に増加する再試行待ち時間になります (この例では、約 10 秒、20 秒、40 秒、...)。最大待ち時間は max-interval です。

<retry
    condition="@(context.Response.StatusCode == 500)"
    count="10"
    interval="10"
    max-interval="100"
    delta="10"
    first-fast-retry="false">
        <forward-request buffer-request-body="true" />
</retry>

最初の要求エラー時に要求を送信する

次の例では、定義されたバックエンド以外の URL への要求の送信は、接続が切断されたりタイムアウトになったりした場合、または要求によってサーバー側エラーが発生した場合、最大 3 回再試行されます。 first-fast-retry が true に設定されているため、最初の再試行は、最初の要求エラーの直後に実行されます。 エラーが発生した場合に send-request が null になるようにするには、ignore-errorresponse-variable-name を true に設定する必要があることに注意してください。


<retry
    condition="@(context.Variables["response"] == null || ((IResponse)context.Variables["response"]).StatusCode >= 500)"
    count="3"
    interval="1"
    first-fast-retry="true">
        <send-request 
            mode="new" 
            response-variable-name="response" 
            timeout="3" 
            ignore-error="true">
		        <set-url>https://api.contoso.com/products/5</set-url>
		        <set-method>GET</set-method>
		</send-request>
</retry>

エラーが発生したときにバックエンドを切り替える

次の例では、最初の要求がプライマリ バックエンドにディスパッチされます。 429 Too Many Requests応答状態コードが返された場合、要求はすぐに再試行され、セカンダリ バックエンドに転送されます。

<backend>
    <retry
        condition="@(context.Response != null && context.Response.StatusCode == 429)"
        count="1"
        interval="1"
        first-fast-retry="true">
           <set-variable name="attempt-count" value="@(context.Variables.GetValueOrDefault<int>("attempt-count", 0)+1)" />
           <set-backend-service backend-id="@(context.Variables.GetValueOrDefault<int>("attempt-count") < 2 ? "primary-backend" : "secondary-backend" )" />
           <forward-request />
    </retry>
</backend>

ヒント

別の方法として、サーキット ブレーカー 規則を使用して バックエンド リソース を構成し、障害状態を検出し、複数のバックエンドに要求を分散する負荷分散プールを構成することもできます。

ポリシーに対する処理の詳細については、次のトピックを参照してください。