Configura colas de Cloud Tasks

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

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

Configura el enrutamiento a nivel de la fila

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

El enrutamiento a nivel de la fila se aplica a lo siguiente:

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

Limitaciones

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

  • Crea tareas en una cola que tenga un enrutamiento a nivel de la cola
  • Aplica el enrutamiento a nivel de la fila

Configura el enrutamiento a nivel de la cola para las tareas HTTP

Puedes configurar una cola para anular el enrutamiento a nivel de la tarea cuando crees o actualices la cola. Para configurar el enrutamiento a nivel de la cola, establece el parámetro uriOverride de la cola en la ruta de acceso que prefieras.

Si aplicas 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 aplicar los cambios para reanudar la cola.

  1. Pausa la cola con el siguiente comando:

      gcloud tasks queues pause QUEUE_ID
      

    Reemplaza QUEUE_ID por el ID de tu fila.

  2. Actualizar o quitar el enrutamiento a nivel de la fila

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

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

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

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

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

    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
    

    Reemplaza lo siguiente:

    • ACCESS_TOKEN: Es tu token de acceso. Para obtenerlo, ejecuta el siguiente comando en tu terminal:

      gcloud auth application-default login
      gcloud auth application-default print-access-token
    • PROJECT_ID: Es el ID de tu proyecto de Google Cloud . Para obtenerlo, ejecuta el siguiente comando en tu terminal:

      gcloud config get-value project

    • LOCATION: Es la ubicación de tu fila.

    • NEW_HOST: Es el nuevo host al que deseas que se dirija tu cola.

  3. Espera un minuto.

    La nueva configuración puede tardar hasta un minuto en aplicarse. Esperar a reanudar la cola ayuda a evitar que las tareas se envíen con la configuración anterior.

  4. Para reanudar la cola, ejecuta el siguiente comando:

    gcloud tasks queues resume QUEUE_ID

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

Para configurar el enrutamiento a nivel de la cola para las tareas de App Engine, establece el parámetro appEngineRoutingOverride de la cola en el servicio y la versión de App Engine que prefieras.

  1. Configura el enrutamiento a nivel de la cola y anula cualquier enrutamiento a nivel de la tarea:

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

    Reemplaza lo siguiente:

    • QUEUE_ID: Es el ID de la fila (su nombre corto).
    • SERVICE: Es el servicio trabajador de App Engine responsable de manejar las tareas.
    • VERSION: Es la versión de la app.

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

    gcloud tasks queues update QUEUE_ID \
        --routing-override=service:SERVICE
  2. Ejecuta el siguiente comando para verificar que tu cola se haya configurado correctamente:

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

    Reemplaza LOCATION por la ubicación de la fila.

    El resultado debería ser similar al siguiente ejemplo:

    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
  3. Para quitar el enrutamiento a nivel de la fila, ejecuta el siguiente comando:

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

    Cuando se quita el enrutamiento a nivel de la cola, se aplica el enrutamiento a nivel de la tarea a las tareas de la cola y a las tareas que se agreguen a la cola en el futuro.

Define límites de frecuencia

El límite de frecuencia determina la frecuencia máxima con la que una cola puede enviar tareas, independientemente de si el envío es un primer intento de tarea o un reintento.

  1. Para establecer la frecuencia máxima y la cantidad de tareas simultáneas que puede enviar una cola, ejecuta el siguiente comando:

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

    Reemplaza lo siguiente:

    • QUEUE_ID: Es el ID de la fila (su nombre corto).
    • DISPATCH_RATE: Es la tasa de envío. Es la frecuencia con la que se actualizan los tokens en el bucket. En condiciones en las que hay un flujo de tareas relativamente constante, esto equivale a la velocidad a la que se envían las tareas.
    • MAX_CONCURRENT_DISPATCHES: Es la cantidad máxima de tareas en la cola que se pueden ejecutar 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 el siguiente comando:

    gcloud tasks queues update QUEUE_ID \
        --max-concurrent-dispatches=MAX_CONCURRENT_DISPATCHES
  2. Ejecuta el siguiente comando para verificar que tu cola se haya configurado correctamente:

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

    Reemplaza LOCATION por la ubicación de la fila.

    El resultado debería ser similar al siguiente ejemplo:

    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

Métodos para definir las frecuencias de procesamiento de la cola

Puedes definir las tasas de procesamiento de colas con la API de Cloud Tasks o cargando un archivo queue.yaml. Ambos métodos generan colas que usan el mismo mecanismo subyacente.

En ambos casos, la cola usa el algoritmo de bucket de tokens para controlar la frecuencia de ejecución de las tareas. Cada cola con nombre 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 rellena el bucket con tokens nuevos de forma continua según la frecuencia max_dispatches_per_second que especifiques para la cola. Si tu cola contiene tareas para procesar y el bucket de la cola contiene tokens, el sistema procesa simultáneamente tantas tareas como tokens haya disponibles, hasta el valor de max_concurrent_dispatches que hayas establecido.

Una 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 HTTP 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 la cola:

    • max_dispatches_per_second
    • max_concurrent_dispatches

    El sistema calcula un tercer campo, max_burst_size, en función del valor que establezcas para max_dispatches_per_second. Para obtener más información, consulta Mensajes de RateLimits.

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

    • max_concurrent_requests, que es equivalente a max_concurrent_dispatches
    • rate, que es equivalente a max_dispatches_per_second
    • bucket_size, que es equivalente 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 configure max_burst_size produce una tasa muy eficiente para administrar los picos de solicitudes. Sin embargo, en algunos casos, en especial cuando la tasa necesaria es relativamente baja, usar el método queue.yaml para establecer manualmente bucket_size en un valor pequeño o establecer tu max_concurrent_dispatches en un valor pequeño con la API de Cloud Tasks puede brindarte más control.

Configura los parámetros de reintento

Si una tarea no se completa correctamente, Cloud Tasks la reintentará con una retirada exponencial según los parámetros que hayas configurado.

  1. Para especificar la cantidad máxima de veces que se debe reintentar una tarea con errores en la cola, establecer un límite de tiempo para los reintentos y controlar el intervalo entre los intentos, ejecuta el siguiente comando:

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

    Reemplaza lo siguiente:

    • QUEUE_ID: Es el ID de la fila (su nombre corto).
    • MAX_ATTEMPTS: Es la cantidad máxima de intentos de una tarea, incluido el primer intento. Para permitir una cantidad ilimitada de reintentos, configura esta marca en -1. Ten en cuenta que, si MAX_ATTEMPTS se establece en -1, MAX_RETRY_DURATION se sigue aplicando.
    • MAX_RETRY_DURATION: Es la cantidad máxima de tiempo que debe esperarse antes de reintentar una tarea con errores, medida desde el momento en que se intentó realizar la tarea por primera vez. El valor debe ser una cadena que termine en "s", como 5s. Si se establece en 0, la antigüedad de la tarea es ilimitada. Ten en cuenta que, si MAX_RETRY_DURATION se establece en 0, MAX_ATTEMPTS se sigue aplicando.
    • MIN_INTERVAL: Es la cantidad mínima de tiempo que se debe esperar entre los intentos de reintento. 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 los intentos de reintento. El valor debe ser una string que termine en "s", como 5s.
    • MAX_DOUBLINGS: Es la cantidad máxima de veces que se duplicará el intervalo entre los reintentos de las tareas con errores antes de que el aumento se vuelva constante. El intervalo de reintento de una tarea comienza en MIN_INTERVAL, luego se duplica MAX_DOUBLINGS veces, después aumenta linealmente y, por último, reintenta en intervalos de MAX_INTERVAL hasta MAX_ATTEMPTS veces.

      Por ejemplo, si MIN_INTERVAL es 10s, MAX_INTERVAL es 300s y MAX_DOUBLINGS es 3, el intervalo de reintento se duplicará 3 veces, aumentará linealmente en 2^3 * 10 s y, luego, se reintentará en intervalos de MAX_INTERVAL hasta que se intente la tarea MAX_ATTEMPTS veces: 10 s, 20 s, 40 s, 80 s, 160 s, 240 s, 300 s, 300 s, etcétera.

    Para obtener más detalles sobre los parámetros, consulta la configuración de RetryConfig para el recurso Queue.

  2. Ejecuta el siguiente comando para verificar que tu cola se haya configurado correctamente:

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

    Reemplaza LOCATION por la ubicación de la fila.

    El resultado debería contener los parámetros de reintento que configuraste.

¿Qué sigue?