적용 대상: 모든 API Management 계층
retry 정책은 자식 정책을 한 번 실행한 후 다시 시도 condition이 false가 되거나 다시 시도 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 | 재시도 횟수 간에 최대 대기 간격을 지정하는 양수(초)입니다. 지수 재시도 알고리즘을 구현하는 데 사용됩니다. 정책 식이 허용됩니다. | 아니요 | 해당 없음 |
| 델타 | 대기 간격 증분을 지정하는 양수(초)입니다. 선형 및 지수 재시도 알고리즘을 구현하는 데 사용됩니다. 정책 식이 허용됩니다. | 아니요 | 해당 없음 |
| 첫 번째 빠른 재시도 | 부울입니다.
true로 설정하면 첫 번째 다시 시도가 즉시 수행됩니다. 정책 식이 허용됩니다. |
아니요 | false |
다시 시도 대기 시간
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 정책을 제외한 wait 다른 정책이 자식 요소로 포함될 수 있습니다.
사용
- 정책 섹션: inbound, outbound, backend, on-error
- 정책 범위: 전역, 작업 영역, 제품, API, 작업
- 게이트웨이: 클래식, v2, 사용량, 자체 호스팅, 작업 영역
사용 현황 정보
- 정책은 첫 번째 재시도 실행을 평가하기 전에 블록에서
retry자식 정책을 실행합니다condition.
예제
지수 다시 시도를 사용하여 요청 전달
다음 예제에서는 지수 재시도 알고리즘을 사용하여 요청 전달을 최대 10회까지 다시 시도합니다.
first-fast-retry가 false로 설정되어 있으므로 다시 시도하려고 할 때마다 다시 시도 대기 시간이 최대 max-interval까지 기하급수적으로 증가합니다(이 예에서는 약 10초, 20초, 40초, ...).
<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로 요청을 보내는 것이 최대 세 번 다시 시도됩니다.
first-fast-retry가 true로 설정되었으므로 첫 번째 재시도는 초기 요청 실패 시 즉시 실행됩니다. 오류가 발생할 경우 send-request이 null이 되도록 하려면 ignore-error에서 response-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>
팁 (조언)
또는 회로 차단기 규칙을 사용하여 백 엔드 리소스 를 구성하여 오류 조건을 검색하고 여러 백 엔드에 요청을 분산하는 부하 분산 풀을 구성할 수 있습니다.
관련 정책
관련 콘텐츠
정책 작업에 대한 자세한 내용은 다음을 참조하세요.
- 자습서: API 변환 및 보호
- 정책 문 및 해당 설정에 대한 전체 목록에 대한 정책 참조
- 정책 식
- 정책 설정 또는 편집
- 정책 구성 재사용
- 정책 코드 조각 리포지토리
- 정책 플레이그라운드 리포지토리
- Azure API Management 정책 도구 키트
- Copilot 지원을 받아 정책을 만들고, 설명하며, 문제를 해결하세요.