오류 응답

표준 오류 응답

Tag Manager API 요청이 성공하면 API는 200 HTTP 상태 코드와 함께 응답 본문에 요청된 데이터를 반환합니다.

요청에 오류가 발생하면 API는 오류 유형에 따라 응답에서 HTTP 상태 코드와 이유를 반환합니다. 또한 응답 본문에는 오류 원인에 관한 자세한 설명이 포함됩니다. 다음은 오류 응답의 예입니다.

400 invalidParameter

{
 "error": {
  "errors": [
   {
    "domain": "usageLimits",
    "reason": "accessNotConfigured",
    "message": "Access Not Configured. Please use Google Developers Console to activate the API for your project.",
   }
  ],
  "code": 403,
  "message": "Access Not Configured. Please use Google Developers Console to activate the API for your project."
 }
}

참고: 설명은 언제든지 변경될 수 있으므로 애플리케이션이 실제 설명 텍스트에 의존해서는 안 됩니다.

지수 백오프 구현

지수 백오프는 클라이언트가 시간 간격을 늘려 실패한 요청을 주기적으로 재시도하는 프로세스입니다. 이는 네트워크 애플리케이션을 위한 표준 오류 처리 전략입니다. Tag Manager API는 실패한 요청을 재시도하도록 선택하는 클라이언트가 지수 백오프를 사용하여 이를 시도한다는 것을 염두에 두고 설계되었습니다. 지수 백오프를 사용하면 '필수'일 뿐만 아니라 대역폭 사용량의 효율성을 높이고, 성공적인 응답을 가져오는 데 필요한 요청 수를 줄이며, 동시 환경에서의 요청 처리량을 극대화할 수 있습니다.

간단한 지수 백오프 구현 흐름은 다음과 같습니다.

  1. API에 요청을 전송합니다.
  2. 재시도할 수 있는 오류 코드가 포함된 오류 응답을 수신합니다.
  3. 1초 + random_number_milliseconds초 동안 기다립니다.
  4. 재시도 요청
  5. 재시도할 수 있는 오류 코드가 포함된 오류 응답을 수신합니다.
  6. 2초 + random_number_milliseconds초 동안 기다립니다.
  7. 재시도 요청
  8. 재시도할 수 있는 오류 코드가 포함된 오류 응답을 수신합니다.
  9. 4초 + random_number_milliseconds초 동안 기다립니다.
  10. 재시도 요청
  11. 재시도할 수 있는 오류 코드가 포함된 오류 응답을 수신합니다.
  12. 8초 + random_number_milliseconds초 동안 기다립니다.
  13. 재시도 요청
  14. 재시도할 수 있는 오류 코드가 포함된 오류 응답을 수신합니다.
  15. 16초 + random_number_milliseconds초 동안 기다립니다.
  16. 재시도 요청
  17. 오류가 계속 발생하면 오류를 중지하고 기록합니다.

위 흐름에서 random_number_milliseconds는 1,000밀리초 이하의 임의의 숫자입니다. 이는 일부 동시 구현에서 특정 잠금 오류를 방지하기 위해 필요합니다. 각 대기 후 random_number_milliseconds를 재정의해야 합니다.

참고: 대기 시간은 항상 (2 ^ n) + random_number_milliseconds입니다. 여기서 n은 처음에는 0으로 정의된 단조 증가 정수입니다. 변수 n은 반복(요청)할 때마다 1씩 증가합니다.

n이 5이면 종료하도록 알고리즘이 설정되어 있습니다. 이 제한은 클라이언트의 무제한 재시도를 중지하기 위해서만 적용되며, 요청이 '복구 불가능한 오류'로 간주되기 전에 약 32초의 총 지연 시간이 발생합니다.

다음 Python 코드는 makeRequest라는 메서드에서 발생하는 오류에서 복구하기 위한 위의 흐름을 구현한 것입니다.

import random
import time
from apiclient.errors import HttpError

def makeRequestWithExponentialBackoff(tagmanager):
  """Wrapper to request Google Tag Manager data with exponential backoff.

  The makeRequest method accepts the tagmanager service object, makes API
  requests and returns the response. If any error occurs, the makeRequest
  method is retried using exponential backoff.

  Args:
    tagmanager: The tagmanager service object

  Returns:
    The API response from the makeRequest method.
  """
  for n in range(0, 5):
    try:
      return makeRequest(tagmanager)

    except HttpError, error:
      if error.resp.reason in ['userRateLimitExceeded', 'quotaExceeded']:
        time.sleep((2 ** n) + random.random())

  print "There has been an error, the request never succeeded."