再試行

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

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

Note

ポリシーの要素と子要素を、ポリシー ステートメントで指定された順序で設定します。 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>

属性

属性 説明 必要 Default
condition ブール型。 再試行を停止するか (false) 継続するか (true) を指定します。 ポリシー式を使用できます。 はい 該当なし
count 再試行回数を指定する 1 から 50 の正の数。 ポリシー式を使用できます。 はい 該当なし
interval 再試行の間の待機間隔を指定する正の数 (秒単位)。 ポリシー式を使用できます。 はい 該当なし
max-interval 再試行の間の最大待機間隔を指定する正の数 (秒単位)。 指数再試行アルゴリズムを実装するために使用されます。 ポリシー式を使用できます。 いいえ 該当なし
delta 待機間隔の増分値を指定する正の数 (秒単位)。 線形再試行アルゴリズムと指数再試行アルゴリズムを実装するために使用されます。 ポリシー式を使用できます。 いいえ 該当なし
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 ポリシーには、他のポリシーを子要素として含めることができます。

使用

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

次の例では、要求の転送が、指数再試行アルゴリズムを使用して 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 に設定されているため、最初の再試行は、最初の要求エラーの直後に実行されます。 エラーが発生した場合に response-variable-name が null になるようにするには、send-requestignore-error を 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>

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