再試行
適用対象: すべての API Management レベル
retry
ポリシーは子ポリシーを 1 回実行し、再試行 condition
が false
になるか再試行 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
間隔で実行されます。interval
とdelta
のみが指定されている場合、線形 間隔の再試行アルゴリズムが使用されます。 再試行間の待機時間は、次の式 (interval + (count - 1)*delta
) に従って増加します。interval
、max-interval
、delta
を指定すると、指数 間隔再試行アルゴリズムが適用されます。 再試行間の待機時間は、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
ポリシーには、他のポリシーを子要素として含めることができます。
使用
- ポリシー セクション: inbound、outbound、backend、on-error
- ポリシー スコープ: グローバル、ワークスペース、製品、API、操作
- ゲートウェイ: クラシック、v2、従量課金、セルフホステッド、ワークスペース
例
指数再試行による転送を要求する
次の例では、要求の転送が、指数再試行アルゴリズムを使用して 10 回まで再試行されます。 first-fast-retry
は false
に設定されているため、すべての再試行は指数関数的に増加する再試行待ち時間になります (この例では、約 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-request
で ignore-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>
関連ポリシー
関連するコンテンツ
ポリシーに対する処理の詳細については、次のトピックを参照してください。