대기 재시도 패턴
경우에 따라 데이터 원본의 동작이 파워 쿼리의 기본 HTTP 코드 처리에서 예상한 동작과 일치하지 않습니다. 아래 예제에서는 이 상황을 해결하는 방법을 보여 줍니다.
이 시나리오에서는 내부 서버 오류를 나타내는 500 상태 코드를 반환하는 REST API를 사용합니다. 이러한 경우 몇 초 동안 기다렸다가 다시 시도할 수 있으며, 포기하기 전에 몇 번 다시 시도할 수 있습니다.
500 상태 코드 응답을 가져오면 Web.Contents
기본적으로 throw됩니다DataSource.Error
. 다음을 위한 선택적 인수로 코드 목록을 제공하여 이 동작을 재정의할 수 있습니다 Web.Contents
.
response = Web.Contents(url, [ManualStatusHandling={404, 500}])
이러한 방식으로 상태 코드를 지정하면 파워 쿼리는 웹 응답을 정상적으로 계속 처리합니다. 그러나 일반적인 응답 처리는 이러한 경우에 적절하지 않은 경우가 많습니다. 비정상적인 응답 코드가 수신되었음을 이해하고 특수 논리를 수행하여 처리해야 합니다. 웹 서비스에서 반환된 응답 코드를 확인하려면 응답과 함께 레코드에서 meta
액세스할 수 있습니다.
responseCode = Value.Metadata(response)[Response.Status]
200 또는 500인지 여부에 responseCode
따라 결과를 정상적으로 처리하거나 다음 섹션에서 구체화할 대기 재시도 논리를 따를 수 있습니다.
파워 쿼리에는 Web.Contents에 대한 이전 호출의 결과를 저장하는 로컬 캐시가 있습니다. 새 응답에 대해 동일한 URL을 폴링하거나 오류 상태 후 다시 시도할 때 쿼리가 캐시된 결과를 무시하도록 해야 합니다. 함수 호출 Web.Contents
에 IsRetry
옵션을 포함하여 이 작업을 수행할 수 있습니다. 이 샘플에서는 루프의 첫 번째 반복 Value.WaitFor
후로 true
설정합니다IsRetry
.
Value.WaitFor()
는 일반적으로 수정 없이 사용할 수 있는 표준 도우미 함수 입니다. 재시도 시도 목록을 작성하여 작동합니다.
여기에는 재시도할 작업이 포함됩니다. 반복 번호를 논리에 사용할 producer
수 있도록 함수로 표시됩니다. 예상되는 동작은 producer
재시도가 필요하다고 판단되면 반환 null
되는 동작입니다. 반환되는 값이 아닌 null
다른 항목이 producer
있으면 해당 값이 다시 .에 의해 Value.WaitFor
반환됩니다.
여기에는 재시도 간에 실행할 논리가 포함됩니다. 반복 번호를 논리에 사용할 delay
수 있도록 함수로 표시됩니다. 예상 동작은 Duration을 반환하는 delay
것입니다.
인수에 숫자를 제공하여 최대 재시도 횟수를 count
설정할 수 있습니다.
다음 예제에서는 500 응답이 발생할 경우 지연된 재시도를 구현하는 방법과 ManualStatusHandling
Value.WaitFor
이를 사용할 수 있습니다. 재시도 사이의 대기 시간은 각 시도에서 두 배로, 최대 5번의 재시도로 진행됩니다.
let
waitForResult = Value.WaitFor(
(iteration) =>
let
result = Web.Contents(url, [ManualStatusHandling = {500}, IsRetry = iteration > 0]),
status = Value.Metadata(result)[Response.Status],
actualResult = if status = 500 then null else result
in
actualResult,
(iteration) => #duration(0, 0, 0, Number.Power(2, iteration)),
5)
in
if waitForResult = null then
error "Value.WaitFor() Failed after multiple retry attempts"
else
waitForResult