Configura colas de Cloud Tasks

En esta página, se describe cómo configurar las colas de Cloud Tasks con el comando gcloud de Google Cloud CLI.

Descripción general

Puedes configurar tu cola de Cloud Tasks cuando crees la cola o en cualquier momento posterior, y la configuración se aplicará a todas las tareas en esa cola.

La configuración de las colas tiene tres aspectos básicos:

Enrutamiento a nivel de cola

La configuración del enrutamiento a nivel de cola anula el enrutamiento establecido a nivel de la tarea. Esto es útil si deseas usar Cloud Tasks como búfer frente al servicio de destino o si necesitas cambiar el enrutamiento de todas las tareas de una cola.

El enrutamiento a nivel de cola se aplica a lo siguiente:

  • Tareas que están actualmente en la cola
  • Tareas que se agregan a la cola después de establecer el enrutamiento a nivel de la cola

Limitaciones

El enrutamiento a nivel de cola no es compatible con las claves de encriptación administradas por el cliente (CMEK) de Cloud Key Management Service (Cloud KMS). Si las CMEK están habilitadas, no podrás hacer lo siguiente:

  • Crear tareas en una cola que tenga enrutamiento a nivel de cola
  • Aplicar enrutamiento a nivel de cola

Configura el enrutamiento a nivel de cola para tareas HTTP

Aplicar enrutamiento a nivel de cola

Puedes configurar una cola para anular el enrutamiento a nivel de tarea cuando se crea o se actualiza la cola. Para configurar el enrutamiento a nivel de la cola, establece el parámetro uriOverride de la cola según la ruta que prefieras. Si estás aplicando el enrutamiento a nivel de la cola como una actualización de una cola existente, pausa la cola antes de aplicar los cambios y espera un minuto después de aplicarlos para reanudar la cola. La nueva configuración puede tardar hasta un minuto en aplicarse, por lo que esperar a que se reanude la cola ayuda a evitar que se envíen las tareas con la configuración anterior.

Actualizar o quitar el enrutamiento a nivel de la cola

  1. Pausa la fila.

    Consola

    Para pausar la cola con la consola de Google Cloud, sigue estos pasos:

    1. Abre la página de listas de tareas en cola de Cloud Tasks en Console.

      Ir a la página de listas de tareas en cola de Cloud Tasks

    2. Selecciona el nombre de la cola que deseas pausar y haz clic en Pausar la cola.

    3. Confirma la acción.

    gcloud

    gcloud tasks queues pause QUEUE_ID
    

    Reemplaza QUEUE_ID por el ID de la cola.

  2. Actualiza o quita el enrutamiento a nivel de cola.

    • Para actualizar el enrutamiento a nivel de cola, establece el parámetro uriOverride en la ruta actualizada.

    • Para quitar el enrutamiento a nivel de cola con la API de REST o RPC, haz lo siguiente:

      • API de REST: Envía una solicitud patch para la cola con una carga útil vacía y el parámetro updateMask configurado como httpTarget.

      • API de RPC: Envía un updateQueueRequest para la cola con una carga útil vacía y el parámetro update_mask configurado como http_target.

    En el siguiente ejemplo, se usa la API de REST para actualizar las tareas del host a las que se enrutan:

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

    Reemplaza lo siguiente:

    • PROJECT_ID: El ID del proyecto de Google Cloud. Para ello, ejecuta el siguiente comando en la terminal:
      gcloud config get-value project
    • LOCATION: La ubicación de la fila.
    • QUEUE_ID: El ID de la cola
    • ACCESS_TOKEN: Es tu token de acceso. Para ello, ejecuta el siguiente comando en la terminal:

      1. gcloud auth application-default login
      2. gcloud auth application-default print-access-token
    • NEW_HOST: Es el host nuevo al que deseas que se enrute la cola.

  3. Espera un minuto.

    La nueva configuración puede tardar hasta un minuto en aplicarse, por lo que esperar a reanudar la cola ayuda a evitar el envío de tareas con la configuración anterior.

  4. Reanuda la cola.

    Consola

    Para reanudar la cola con la consola de Google Cloud, sigue estos pasos:

    1. Abre la página de listas de tareas en cola de Cloud Tasks en Console.

      Ir a la página de listas de tareas en cola de Cloud Tasks

    2. Selecciona el nombre de la cola que deseas pausar y haz clic en Reanudar cola.

    3. Confirma la acción.

    gcloud

    gcloud tasks queues resume QUEUE_ID
    

    Reemplaza QUEUE_ID por el ID de la cola.

Configura el enrutamiento a nivel de cola para las tareas de App Engine

Si quieres configurar el enrutamiento a nivel de cola para tareas de App Engine, establece el parámetro appEngineRoutingOverride de la cola según tu servicio y versión preferidos de App Engine.

Para configurar este enrutamiento no predeterminado a nivel de cola y anular cualquier enrutamiento a nivel de tarea, puedes usar gcloud:

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

Reemplaza lo siguiente:

  • SERVICE: Es el servicio trabajador de App Engine responsable de manejar las tareas.
  • VERSION: Indica la versión de la app.

Por ejemplo, si configuras un servicio de trabajador SERVICE para que controle todas las tareas en una cola, puedes enrutar a ese servicio y a la versión predeterminada:

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

Describe la cola:

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

Reemplaza lo siguiente:

  • QUEUE_ID: El ID de la cola (su nombre corto)
  • LOCATION: Es la ubicación de la cola.

El resultado debería ser algo como lo siguiente:

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

Quita el enrutamiento a nivel de cola para los destinos de App Engine

Cuando se quita el enrutamiento a nivel de la cola, este se aplica a las tareas que se encuentran actualmente en la cola y a las que se agregan a la cola en el futuro. Para quitar el enrutamiento a nivel de cola, ejecuta el siguiente comando:

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

Define límites de frecuencia

Puedes configurar valores máximos para la frecuencia y la cantidad de tareas simultáneas que puede enviar una cola.

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

Reemplaza lo siguiente:

  • DISPATCH_RATE: Es la frecuencia de envío (esta es la frecuencia con la que se actualizan los tokens en el bucket). En condiciones en las que hay un flujo de tareas relativamente estable, este es el equivalente de la velocidad a la que se envían las tareas.
  • MAX_RUNNING: Es la cantidad máxima de tareas de la cola que pueden ejecutarse a la vez.

Por ejemplo, si creaste una cola sin configurar ningún parámetro, puedes actualizar la cantidad máxima de tareas simultáneas con la siguiente llamada:

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

Describe la cola:

  gcloud tasks queues describe QUEUE_ID --location=LOCATION

Reemplaza lo siguiente:

  • QUEUE_ID: El ID de la cola (su nombre corto)
  • LOCATION: Es la ubicación de la cola.

El resultado debería ser el siguiente:

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

Definición de las velocidades de procesamiento con los comandos de gcloud en comparación con el uso de queue.yaml

El enfoque de la API de Cloud Tasks para definir las tasas de procesamiento de colas difiere levemente del enfoque tomado con la carga de archivos queue.yaml, a pesar de que ambos métodos generan colas con el mismo mecanismo subyacente.

En ambos casos, la cola usa el algoritmo del bucket de tokens para controlar la frecuencia de ejecución de la tarea. Cada cola nombrada tiene un bucket que contiene sus tokens.

Cada vez que la aplicación ejecuta una tarea, se quita un token del bucket. La cola continúa procesando tareas hasta que el bucket se queda sin tokens. El sistema vuelve a llenar el bucket con tokens nuevos continuamente según la frecuencia de max_dispatches_per_second que especifiques para la cola. Si la cola contiene tareas para procesar y el bucket de la cola contiene tokens, el sistema procesa de forma simultánea tantas tareas como tokens haya, hasta el valor max_concurrent_dispatches que hayas establecido.

La carga desigual puede permitir que la cantidad de tokens en el bucket crezca de manera significativa, lo que puede generar picos de actividad de procesamiento cuando llega un pico de solicitudes. En este caso, tu cola puede experimentar una tasa de envío real que supere tu tasa de max_dispatches_per_second, lo que consume recursos del sistema y compite con las solicitudes de servicio del usuario. En los casos en que usas colas para administrar las tasas de envío basadas en ANS relativamente lentas para servicios descendentes, esto puede generar errores como HTTP 429 (Demasiadas solicitudes) o 503 (Servicio no disponible).

Cuando usas cualquier método de la API de Cloud Tasks, tienes dos campos para definir la frecuencia de envío de las colas:

  • max_dispatches_per_second
  • max_concurrent_dispatches

El sistema calcula un tercer campo, max_burst_size, según el valor que estableces para max_dispatches_per_second.

Cuando usas el método queue.yaml, puedes establecer los tres elementos:

  • max_concurrent_requests, que equivale a max_concurrent_dispatches.
  • rate, que equivale a max_dispatches_per_second.
  • bucket_size, que equivale a max_burst_size.

En la mayoría de los casos, usar el método de la API de Cloud Tasks y dejar que el sistema configurado max_burst_size produce una tasa muy eficiente para administrar los picos de solicitudes. Sin embargo, en algunos casos, en especial cuando la frecuencia deseada es relativamente lenta, puedes usar el método queue.yaml para establecer bucket_size de forma manual en un valor pequeño o configurar tu max_concurrent_dispatches en un valor pequeño a través de la API de Cloud Tasks.

Configura los parámetros de reintento

Si una tarea no se completa correctamente, Cloud Tasks la reintenta con una retirada exponencial que depende de los parámetros que hayas configurado. Puedes especificar el máximo de veces que se debe reintentar una tarea con errores en la cola, y también puedes configurar un límite de tiempo para los reintentos y un intervalo de espera entre uno y otro.

  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

Reemplaza lo siguiente:

  • MAX_ATTEMPTS: Es la cantidad máxima de intentos para una tarea, incluido el primer intento. Para permitir una cantidad ilimitada de reintentos, configura la marca en unlimitedunlimited.
  • MIN_INTERVAL: Es la cantidad mínima de tiempo que se debe esperar entre varios reintentos. El valor debe ser una string que termine en "s", como 5s.
  • MAX_INTERVAL: Es la cantidad máxima de tiempo que se debe esperar entre varios intentos. El valor debe ser una string que termine en "s", como 5s.
  • MAX_DOUBLINGS: La cantidad máxima de veces que se duplicará el intervalo entre reintentos de las tareas con errores antes de que el aumento se vuelva constante.
  • MAX_RETRY_DURATION: Es la cantidad máxima de tiempo para reintentar una tarea con errores, medida desde el momento en que se intentó realizar la tarea por primera vez. El valor debe ser una string que termine en "s", como 5s.

Verifica que tu cola se haya configurado correctamente:

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

Reemplaza lo siguiente:

  • QUEUE_ID: El ID de la cola (su nombre corto)
  • LOCATION: Es la ubicación de la cola.

¿Qué sigue?