이 페이지에서는 User Deletion API에서 발생할 수 있는 오류를 나열하고 500 오류를 처리하고 지수 백오프를 구현하는 방법을 설명합니다.
표준 오류 응답
User Deletion API 요청이 성공하면 API는 200
상태 코드를 반환합니다.
요청에 오류가 발생하면 API는 오류 유형에 따라 응답에 HTTP 상태 코드, 상태, 이유를 반환합니다. 또한 응답 본문에는 오류의 원인에 관한 자세한 설명이 포함되어 있습니다. 다음은 오류 응답의 예입니다.
{ "error": { "errors": [ { "domain": "global", "reason": "invalidParameter",
"message": "Invalid value '-1' for max-results. Value must be within the range:
[1, 1000]", "locationType": "parameter", "location": "max-results" } ], "code":
400, "message": "Invalid value '-1' for max-results. Value must be within the
range: [1, 1000]" } }
오류 테이블
코드 | 이유 | 설명 | 권장 작업 |
---|---|---|---|
400 | invalidParameter |
요청 매개변수에 잘못된 값이 있음을 나타냅니다. 오류 응답의 locationType 및 location 필드는 어떤 값이 잘못되었는지에 대한 정보를 제공합니다. |
문제를 해결하지 않은 상태로 다시 시도하지 마세요. 오류 응답에 지정된 매개변수에 유효한 값을 제공해야 합니다. |
400 | badRequest |
쿼리가 잘못되었음을 나타냅니다. 예를 들어 상위 ID가 누락되었거나 요청된 측정기준 또는 측정항목의 조합이 유효하지 않습니다. | 문제를 해결하지 않은 상태로 다시 시도하지 마세요. API 쿼리가 작동하려면 쿼리를 변경해야 합니다. |
401 | invalidCredentials |
인증 토큰이 잘못되었거나 만료되었음을 나타냅니다. | 문제를 해결하지 않은 상태로 다시 시도하지 마세요. 새 인증 토큰을 가져와야 합니다. |
403 | insufficientPermissions |
사용자에게 쿼리에 지정된 항목에 대한 충분한 권한이 없음을 나타냅니다. | 문제를 해결하지 않은 상태로 다시 시도하지 마세요. 지정된 항목에 대한 작업을 실행할 수 있는 충분한 권한을 가져야 합니다. |
403 | dailyLimitExceeded |
사용자가 일일 할당량 (프로젝트당 또는 보기 (프로필)당)을 초과했음을 나타냅니다. | 문제를 해결하지 않은 상태로 다시 시도하지 마세요. 일일 할당량을 모두 사용했습니다. API 한도 및 할당량을 참조하세요. |
403 | userRateLimitExceeded |
사용자별 100초당 쿼리 수 한도가 초과되었음을 나타냅니다. Google API Console에 설정된 기본값은 사용자당 100초당 100개의 쿼리입니다. Google API 콘솔에서 이 한도를 최대 1,000개까지 늘릴 수 있습니다. | 지수 백오프를 사용하여 다시 시도합니다. 요청을 전송하는 속도를 낮춰야 합니다. |
403 | rateLimitExceeded |
프로젝트 100초당 쿼리 비율 제한이 초과되었음을 나타냅니다. | 지수 백오프를 사용하여 다시 시도합니다. 요청을 전송하는 속도를 낮춰야 합니다. |
403 | quotaExceeded |
Core Reporting API의 보기 (프로필)당 동시 요청 10개에 도달했음을 나타냅니다. | 지수 백오프를 사용하여 다시 시도합니다. 이 뷰 (프로필)에 대한 진행 중인 요청이 하나 이상 완료될 때까지 기다려야 합니다. |
500 | internalServerError |
예기치 않은 내부 서버 오류가 발생했습니다. | 이 쿼리를 두 번 이상 재시도하지 마세요. |
503 | backendError |
서버에서 오류를 반환했습니다. | 이 쿼리를 두 번 이상 재시도하지 마세요. |
500 또는 503 응답 처리
500
또는 503
오류는 과부하가 발생하거나 더 복잡한 요청 중에 발생할 수 있습니다. 요청이 더 큰 경우 더 짧은 기간 동안 데이터를 요청하는 것이 좋습니다. 지수 백오프를 구현하는 것도 고려해 보세요. 이러한 오류의 빈도는 보기 (프로필) 및 해당 보기와 연결된 보고 데이터의 양에 따라 달라질 수 있습니다. 한 보기 (프로필)에서 500
또는 503
오류를 일으키는 쿼리가 다른 보기 (프로필)에서 동일한 쿼리를 실행할 때 반드시 오류를 일으키지는 않습니다.
지수 백오프 구현
지수 백오프는 클라이언트가 시간 간격을 늘려 실패한 요청을 주기적으로 다시 시도하는 프로세스입니다. 잘린 지수 백오프는 네트워크 애플리케이션을 위한 표준 오류 처리 전략입니다. User Deletion API는 실패한 요청을 재시도하는 클라이언트가 지수 백오프를 사용하여 재시도할 것으로 예상하여 설계되었습니다. 지수 백오프는 '필수'일 뿐만 아니라 대역폭 사용량의 효율성을 높이고, 성공적인 응답을 가져오는 데 필요한 요청 수를 줄이며, 동시 환경에서의 요청 처리량을 극대화합니다.
지수 백오프를 구현하는 방법은 다음과 같습니다.
- API에 요청을 전송합니다.
- 재시도 가능한 오류 코드가 포함된 오류 응답을 수신합니다.
- 1초 +
random_number_milliseconds
초 동안 기다립니다. - 요청을 다시 시도합니다.
- 재시도 가능한 오류 코드가 포함된 오류 응답을 수신합니다.
- 대기 2초 +
random_number_milliseconds
초 - 요청을 다시 시도합니다.
- 재시도 가능한 오류 코드가 있는 오류 응답을 수신합니다.
- 4초 +
random_number_milliseconds
초 동안 기다립니다. - 요청을 다시 시도합니다.
- 재시도 가능한 오류 코드가 포함된 오류 응답을 수신합니다.
- 8초 +
random_number_milliseconds
초 동안 기다립니다. - 요청을 다시 시도합니다.
- 재시도 가능한 오류 코드가 포함된 오류 응답을 수신합니다.
- 16초 +
random_number_milliseconds
초 동안 기다립니다. - 요청을 다시 시도합니다.
- 그래도 오류가 발생하면 중지하고 오류를 기록합니다.
위 흐름에서 random_number_milliseconds
는 1, 000밀리초 이하의 임의 숫자입니다. 이는 일부 동시 실행 구현에서 특정 잠금 오류를 방지하는 데 필요합니다. random_number_milliseconds
는 대기 후 매번 재정의해야 합니다.
n이 5이면 종료하도록 알고리즘이 설정되어 있습니다. 이 한도는 클라이언트의 무한 재시도를 방지하기 위한 목적으로만 적용되며, 요청이 '복구 불가능한 오류'로 간주되기 전에 약 32초의 총 지연 시간이 발생합니다.
다음 Python 코드는 makeRequest
라는 메서드에서 발생하는 오류에서 복구하기 위한 위의 흐름을 구현한 것입니다.
import random
import time
from apiclient.errors import HttpError
def makeRequestWithExponentialBackoff(analytics):
"""Wrapper to request Google Analytics data with exponential backoff.
The makeRequest method accepts the analytics service object, makes API
requests and returns the response. If any error occurs, the makeRequest
method is retried using exponential backoff.
Args:
analytics: The analytics service object
Returns:
The API response from the makeRequest method.
"""
for n in range(0, 5):
try:
return makeRequest(analytics)
except HttpError, error:
if error.resp.reason in ['userRateLimitExceeded', 'quotaExceeded',
'internalServerError', 'backendError']:
time.sleep((2 ** n) + random.random())
else:
break
print "There has been an error, the request never succeeded."