Cloud Tasks 큐 구성

이 페이지에서는 Google Cloud CLI의 gcloud 명령어를 사용하여 Cloud Tasks 큐를 구성하는 방법을 설명합니다.

개요

큐를 만들 때 또는 이후에 언제든지 Cloud Tasks 큐를 구성할 수 있으며 이 구성은 큐에 있는 모든 태스크에 적용됩니다.

큐 구성 시 다음 세 가지 기본 요소를 고려합니다.

큐 수준 라우팅

큐 수준에서 라우팅을 구성하면 태스크 수준에서 설정된 라우팅이 재정의됩니다. Cloud Tasks를 대상 서비스 앞에 버퍼로 사용하거나 큐의 모든 태스크에서 라우팅을 변경해야 하는 경우에 유용합니다.

큐 수준 라우팅 적용 대상:

  • 현재 큐에 있는 태스크
  • 큐 수준 라우팅이 설정된 후 큐에 추가되는 태스크

제한사항

큐 수준 라우팅은 Cloud Key Management Service(Cloud KMS) 고객 관리 암호화 키(CMEK)와 호환되지 않습니다. CMEK가 사용 설정된 경우 다음을 수행할 수 없습니다.

  • 큐 수준 라우팅이 있는 큐에 태스크 만들기
  • 큐 수준 라우팅 적용

HTTP 태스크의 큐 수준 라우팅 구성

큐 수준 라우팅 적용

큐를 만들거나 큐를 업데이트할 때 태스크 수준 라우팅을 재정의하도록 큐를 구성할 수 있습니다. 큐 수준 라우팅을 구성하려면 큐의 uriOverride 매개변수를 원하는 경로로 설정합니다. 기존 큐에 업데이트로 큐 수준 라우팅을 적용하는 경우 변경사항을 적용하기 전에 큐를 일시중지하고 변경사항을 적용하고 1분 정도 기다린 후 큐를 다시 시작합니다. 새 구성이 적용되는 데 최대 1분이 걸릴 수 있으므로 큐를 재개하기 전에 기다려서 태스크가 이전 구성으로 전달되지 않도록 합니다.

큐 수준 라우팅 업데이트 또는 삭제

  1. 큐를 일시중지합니다.

    콘솔

    Google Cloud 콘솔을 사용하여 큐를 일시중지하려면 다음 안내를 따르세요.

    1. 콘솔에서 Cloud Tasks 대기열 페이지를 엽니다.

      Cloud Tasks 큐 페이지로 이동

    2. 일시중지할 큐의 이름을 선택하고 큐 일시중지를 클릭합니다.

    3. 작업을 확인합니다.

    gcloud

    gcloud tasks queues pause QUEUE_ID
    

    QUEUE_ID를 큐의 ID로 바꿉니다.

  2. 큐 수준 라우팅을 업데이트하거나 삭제합니다.

    • 큐 수준 라우팅을 업데이트하려면 uriOverride 매개변수를 업데이트된 경로로 설정합니다.

    • REST 또는 RPC API를 사용하여 큐 수준 라우팅을 삭제하려면 다음 안내를 따르세요.

      • REST API: 페이로드가 비어 있고 updateMask 매개변수가 httpTarget으로 설정된 큐에 patch 요청을 전송합니다.

      • RPC API: 페이로드가 비어 있고 update_mask 매개변수가 http_target으로 설정된 큐에 updateQueueRequest 요청을 전송합니다.

    다음 예시에서는 REST API를 사용하여 다음으로 라우팅된 호스트 태스크를 업데이트합니다.

    curl -X PATCH -d @- -i \
    -H "Authorization: Bearer ACCESS_TOKEN" \
    -H "Content-Type: application/json" \
    "https://cloudtasks.googleapis.com/v2/projects/PROJECT_ID/locations/LOCATION/queues/QUEUE_ID?updateMask=httpTarget.uriOverride" << EOF
    {
    "httpTarget": {"uriOverride":{"host":"NEW_HOST"}}
    }
    EOF
    

    다음을 바꿉니다.

    • PROJECT_ID: Google Cloud 프로젝트의 ID입니다. 터미널에서 다음을 실행하여 가져올 수 있습니다.
      gcloud config get-value project
    • LOCATION: 큐의 위치
    • QUEUE_ID: 큐의 ID
    • ACCESS_TOKEN: 액세스 토큰입니다. 터미널에서 다음을 실행하여 가져올 수 있습니다.

      1. gcloud auth application-default login
      2. gcloud auth application-default print-access-token
    • NEW_HOST: 큐가 라우팅할 새 호스트입니다.

  3. 1분 정도 기다립니다.

    새 구성이 적용되는 데 최대 1분이 걸릴 수 있으므로 큐를 재개하기 전에 기다려서 태스크가 이전 구성으로 전달되지 않도록 합니다.

  4. 큐를 다시 시작합니다.

    콘솔

    Google Cloud 콘솔을 사용하여 큐를 다시 시작하는 방법은 다음과 같습니다.

    1. 콘솔에서 Cloud Tasks 대기열 페이지를 엽니다.

      Cloud Tasks 큐 페이지로 이동

    2. 일시중지할 큐의 이름을 선택하고 큐 다시 시작을 클릭합니다.

    3. 작업을 확인합니다.

    gcloud

    gcloud tasks queues resume QUEUE_ID
    

    QUEUE_ID를 큐의 ID로 바꿉니다.

App Engine 태스크의 큐 수준 라우팅 구성

App Engine 태스크의 큐 수준 라우팅을 구성하려면 큐의 appEngineRoutingOverride 매개변수를 원하는 App Engine 서비스 및 버전으로 설정합니다.

이 기본이 아닌 큐 수준 라우팅을 설정하고 모든 태스크 수준 라우팅보다 우선 적용되게 하려면 gcloud를 사용하세요.

  gcloud tasks queues update QUEUE_ID\
      --routing-override=service:SERVICE,version:VERSION

다음을 바꿉니다.

  • SERVICE: 태스크 처리를 담당하는 App Engine 작업자 서비스입니다.
  • VERSION: 앱 버전입니다.

예를 들어 라는 큐의 모든 태스크를 처리하도록 SERVICE라는 작업자 서비스를 설정한 경우 해당 서비스와 기본 버전으로 라우팅할 수 있습니다.

  gcloud tasks queues update QUEUE_ID \
      --routing-override=service:SERVICE

큐를 설명합니다.

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

다음을 바꿉니다.

  • QUEUE_ID: 큐 ID(닉네임)
  • LOCATION: 큐의 위치

출력은 다음과 같이 표시됩니다.

appEngineRoutingOverride:
  host: SERVICE.PROJECT_ID.appspot.com
  service: SERVICE
name: projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID
rateLimits:
  maxBurstSize: 100
  maxConcurrentDispatches: 1000
  maxDispatchesPerSecond: 500.0
retryConfig:
  maxAttempts: 100
  maxBackoff: 3600s
  maxDoublings: 16
  minBackoff: 0.100s
state: RUNNING

App Engine 대상의 큐 수준 라우팅 삭제

큐 수준 라우팅이 삭제되면 태스크 수준 라우팅은 현재 큐에 있는 태스크와 향후 큐에 추가되는 태스크에 모두 적용됩니다. 큐 수준 라우팅을 삭제하려면 다음 명령어를 실행합니다.

  gcloud tasks queues update QUEUE_ID \
      --clear-routing-override

비율 한도 정의

큐에서 전달할 수 있는 최대 비율과 동시 태스크 수를 설정할 수 있습니다.

  gcloud tasks queues update QUEUE_ID \
      --max-dispatches-per-second=DISPATCH_RATE \
      --max-concurrent-dispatches=MAX_RUNNING

다음을 바꿉니다.

  • DISPATCH_RATE: 디스패치 속도입니다(버킷의 토큰이 새로 고침되는 비율). 비교적 안정적인 태스크 흐름이 있는 경우 태스크가 전달되는 속도와 같습니다.
  • MAX_RUNNING: 큐에서 한 번에 실행할 수 있는 최대 태스크 수입니다.

예를 들어 매개변수를 설정하지 않고 큐를 만든 경우 다음을 호출하여 최대 동시 태스크 수를 업데이트할 수 있습니다.

  gcloud tasks queues update QUEUE_ID \
          --max-concurrent-dispatches=MAX_CONCURRENT_DISPATCHES

Describe:

  gcloud tasks queues describe QUEUE_ID --location=LOCATION

다음을 바꿉니다.

  • QUEUE_ID: 큐 ID(닉네임)
  • LOCATION: 큐의 위치

출력은 다음과 같이 표시됩니다.

name: projects/PROJECT_ID/locations/LOCATION_ID/queues/QUEUE_ID
rateLimits:
  maxBurstSize: 100
  maxConcurrentDispatches: MAX_CONCURRENT_DISPATCHES
  maxDispatchesPerSecond: 500.0
retryConfig:
  maxAttempts: 100
  maxBackoff: 3600s
  maxDoublings: 16
  minBackoff: 0.100s
state: RUNNING

gcloud 명령어 사용과 queue.yaml 사용을 비교하여 처리 속도 정의

큐 처리 속도를 정의하는 Cloud Tasks API 접근 방식은 queue.yaml 파일 업로드를 사용하는 접근 방식과 약간 다르지만 두 가지 방법 모두 동일한 기본 메커니즘을 사용합니다.

두 경우 모두 큐는 토큰 버킷 알고리즘을 사용하여 태스크 실행 속도를 제어합니다. 이름이 지정된 각 큐에는 토큰이 저장된 버킷이 포함됩니다.

애플리케이션이 태스크를 실행할 때마다 토큰이 버킷에서 삭제됩니다. 큐는 버킷의 토큰이 소진될 때까지 태스크를 계속 처리합니다. 시스템은 큐에 지정한 max_dispatches_per_second 속도에 따라 버킷에 새 토큰을 계속 채웁니다. 큐에 처리할 태스크가 있고 큐의 버킷에 토큰이 있으면 시스템은 설정된 max_concurrent_dispatches 값까지 토큰과 같은 수의 태스크를 동시에 처리합니다.

고르지 않은 로드로 인해 버킷의 토큰 수가 크게 증가할 수 있으며, 이로 인해 대량의 요청이 들어오면 처리량이 늘어날 수 있습니다. 이 경우 큐에 실제 전달 속도가 max_dispatches_per_second 속도를 초과하여 시스템 리소스를 사용하고 사용자 제공 요청과 경합할 수 있습니다. 다운스트림 서비스의 상대적으로 느린 SLA를 기반으로 큐를 사용하여 큐를 관리하는 경우 HTTP 429(너무 많은 요청) 또는 503(서비스를 사용할 수 없음)과 같은 오류가 발생할 수 있습니다.

Cloud Tasks API 메서드를 사용하는 경우 큐 전달 속도를 정의하는 두 가지 필드가 있습니다.

  • max_dispatches_per_second
  • max_concurrent_dispatches

세 번째 필드 max_burst_sizemax_dispatches_per_second에 설정된 값에 따라 시스템이 계산합니다.

queue.yaml 메서드를 사용할 때 세 요소 모두 설정할 수 있습니다.

  • max_concurrent_requests: max_concurrent_dispatches와 같음
  • rate: max_dispatches_per_second와 같음
  • bucket_size: max_burst_size와 같음

대부분의 경우 Cloud Tasks API 메서드를 사용하고 시스템이 max_burst_size를 설정하게 하면 요청 버스트를 매우 효율적으로 관리할 수 있습니다. 그러나 경우에 따라 원하는 속도가 비교적 느리거나 queue.yaml 메서드를 사용하여 수동으로 bucket_size를 작은 값으로 설정하거나 Cloud Tasks API를 통해 max_concurrent_dispatches를 작은 값으로 설정하는 등의 경우 특히 더 세부적으로 제어할 수 있습니다.

재시도 매개변수 설정

작업이 성공적으로 완료되지 않은 경우 Cloud Tasks가 설정한 매개변수에 따라 지수 백오프로 작업을 재시도합니다. 큐에서 실패한 작업을 재시도할 최대 횟수를 지정하고 재시도에 대한 시간 제한을 설정하며 시도 사이의 간격을 제어할 수 있습니다.

  gcloud tasks queues update QUEUE_ID \
      --max-attempts=MAX_ATTEMPTS \
      --min-backoff=MIN_INTERVAL \
      --max-backoff=MAX_INTERVAL \
      --max-doublings=MAX_DOUBLINGS \
      --max-retry-duration=MAX_RETRY_DURATION

다음을 바꿉니다.

  • MAX_ATTEMPTS: 첫 시도를 포함한 태스크 최대 시도 횟수입니다. 이 플래그를 unlimited로 설정하여 무제한 재시도를 허용할 수 있습니다.
  • MIN_INTERVAL: 재시도 사이에 대기해야 하는 최소 시간입니다. 값은 5s와 같이 's'로 끝나는 문자열이어야 합니다.
  • MAX_INTERVAL: 재시도 사이에 대기해야 하는 최대 시간입니다. 값은 5s와 같이 's'로 끝나는 문자열이어야 합니다.
  • MAX_DOUBLINGS: 실패한 태스크 다시 시도 사이의 간격이 두 배가 되는 최대 횟수입니다. 이 횟수 이후에는 증분 값이 상수가 됩니다.
  • MAX_RETRY_DURATION: 실패한 태스크를 재시도할 수 있는 최대 시간으로, 태스크가 처음 시도되었을 때부터 측정됩니다. 값은 5s와 같이 's'로 끝나는 문자열이어야 합니다.

큐가 성공적으로 구성되었는지 확인합니다.

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

다음을 바꿉니다.

  • QUEUE_ID: 큐 ID(닉네임)
  • LOCATION: 큐의 위치

다음 단계