Configurar colas de Cloud Tasks

Puede configurar su cola de Cloud Tasks al crearla o en cualquier momento después. La configuración se aplica a todas las tareas de esa cola.

Hay tres aspectos básicos en la configuración de colas:

Configurar el enrutamiento a nivel de cola

Si configura el enrutamiento a nivel de cola, se anula el enrutamiento definido a nivel de tarea. Esto resulta útil si quieres usar Cloud Tasks como búfer delante de tu 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 en la cola
  • Tareas que se añaden a la cola después de que se haya configurado el enrutamiento a nivel de cola

Limitaciones

El enrutamiento a nivel de cola no es compatible con las claves de encriptado gestionadas por el cliente (CMEK) de Cloud Key Management Service (Cloud KMS). Si CMEK está habilitada, no puedes hacer lo siguiente:

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

Configurar el enrutamiento a nivel de cola para tareas HTTP

Puedes configurar una cola para anular el enrutamiento a nivel de tarea al crearla o actualizarla. Para configurar el enrutamiento a nivel de cola, asigna al parámetro uriOverride de la cola la ruta que prefieras.

Si vas a aplicar el enrutamiento a nivel de cola como una actualización de una cola, pausa la cola antes de aplicar los cambios y espera un minuto después de aplicar los cambios para reanudar la cola.

  1. Pausar la cola Ejecuta el siguiente comando:

      gcloud tasks queues pause QUEUE_ID
      

    Sustituye QUEUE_ID por el ID de tu cola.

  2. Actualizar o eliminar el enrutamiento a nivel de cola.

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

    • Para quitar el enrutamiento a nivel de cola mediante la API REST o la API RPC, sigue estos pasos:

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

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

    En el siguiente ejemplo se usa la API REST para actualizar el host al que se dirigen 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
    

    Haz los cambios siguientes:

    • ACCESS_TOKEN: tu token de acceso. Para obtenerlo, ejecuta lo siguiente en tu terminal:

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

      gcloud config get-value project

    • LOCATION: la ubicación de tu cola.

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

  3. Espera un minuto.

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

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

    gcloud tasks queues resume QUEUE_ID

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

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

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

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

    Haz los cambios siguientes:

    • QUEUE_ID: el ID de la cola (su nombre abreviado).
    • SERVICE: el servicio de trabajador de App Engine responsable de gestionar las tareas.
    • VERSION: la versión de la aplicación.

    Por ejemplo, si configura un servicio de trabajador para gestionar todas las tareas de una cola, puede enrutar a ese servicio y a la versión predeterminada:

    gcloud tasks queues update QUEUE_ID \
        --routing-override=service:SERVICE
  2. Para verificar que la cola se ha configurado correctamente, ejecuta el siguiente comando:

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

    Sustituye LOCATION por la ubicación de la cola.

    La salida debería ser similar a la 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
  3. Para quitar el enrutamiento a nivel de cola, ejecuta el siguiente comando:

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

    Cuando se elimina el enrutamiento a nivel de cola, se aplica el enrutamiento a nivel de tarea a las tareas de la cola y a las tareas que se añadan a la cola en el futuro.

Definir límites de frecuencia

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

  1. Para definir la frecuencia máxima y el número de tareas simultáneas que puede distribuir una cola, ejecuta el siguiente comando:

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

    Haz los cambios siguientes:

    • QUEUE_ID: el ID de la cola (su nombre abreviado).
    • DISPATCH_RATE: la frecuencia de distribución. Es la frecuencia con la que se actualizan los tokens del contenedor. En las condiciones en las que hay un flujo de tareas relativamente constante, este valor es el equivalente a la frecuencia con la que se distribuyen las tareas.
    • MAX_CONCURRENT_DISPATCHES: número máximo de tareas de la cola que se pueden ejecutar a la vez.

    Por ejemplo, si has creado una cola sin definir ningún parámetro, puedes actualizar el número máximo de tareas simultáneas ejecutando el siguiente comando:

    gcloud tasks queues update QUEUE_ID \
        --max-concurrent-dispatches=MAX_CONCURRENT_DISPATCHES
  2. Para verificar que la cola se ha configurado correctamente, ejecuta el siguiente comando:

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

    Sustituye LOCATION por la ubicación de la cola.

    La salida debería ser similar a la 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

Métodos para definir las tasas de procesamiento de colas

Puedes definir las velocidades de procesamiento de las colas mediante la API Cloud Tasks o subiendo un archivo queue.yaml. Ambos métodos dan como resultado colas que usan el mismo mecanismo subyacente.

En ambos casos, la cola usa el algoritmo token bucket para controlar la velocidad de ejecución de las tareas. Cada cola con nombre tiene un contenedor que contiene sus tokens.

Cada vez que tu aplicación ejecuta una tarea, se elimina un token del contenedor. La cola sigue procesando tareas hasta que se agoten los tokens del segmento. El sistema rellena el contenedor con tokens nuevos de forma continua en función de la tasa max_dispatches_per_second que especifiques para la cola. Si tu cola contiene tareas que procesar y el contenedor de la cola contiene tokens, el sistema procesa simultáneamente tantas tareas como tokens haya, hasta el valor max_concurrent_dispatches que hayas definido.

Una carga desigual puede permitir que el número de tokens del contenedor aumente significativamente, lo que puede provocar picos de procesamiento cuando se produce un pico de solicitudes. En este caso, es posible que tu cola experimente una tasa de envío real que supere tu tasa max_dispatches_per_second, lo que consumirá recursos del sistema y competirá con las solicitudes de servicio de los usuarios. En los casos en los que se usan colas para gestionar las tasas de envío en función de los acuerdos de nivel de servicio relativamente lentos de los servicios posteriores, se pueden producir errores como HTTP 429 (Demasiadas solicitudes) o HTTP 503 (Servicio no disponible).

  • Cuando usas cualquier método de la API 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 en max_dispatches_per_second. Para obtener más información, consulta el artículo sobre los mensajes RateLimits.

  • Cuando usas el método queue.yaml, puedes definir 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, si usas el método de la API Cloud Tasks y dejas que el sistema defina max_burst_size, se consigue una tasa muy eficiente para gestionar las ráfagas de solicitudes. Sin embargo, en algunos casos, sobre todo cuando la frecuencia necesaria es relativamente lenta, puedes tener más control si usas el método queue.yaml para definir manualmente bucket_size con un valor pequeño o si asignas un valor pequeño a max_concurrent_dispatches mediante la API Cloud Tasks.

Establecer parámetros de reintento

Si una tarea no se completa correctamente, Cloud Tasks volverá a intentarlo con un retroceso exponencial según los parámetros que hayas definido.

  1. Especifica el número máximo de veces que se deben reintentar las tareas fallidas de la cola, define un límite de tiempo para los reintentos y controla el intervalo entre ellos ejecutando 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

    Haz los cambios siguientes:

    • QUEUE_ID: el ID de la cola (su nombre abreviado).
    • MAX_ATTEMPTS: número máximo de intentos de una tarea, incluido el primer intento. Puedes permitir un número ilimitado de reintentos configurando esta marca en -1. Ten en cuenta que, si MAX_ATTEMPTS se define como -1, MAX_RETRY_DURATION se sigue aplicando.
    • MAX_RETRY_DURATION: tiempo máximo para volver a intentar una tarea fallida, medido desde el primer intento de la tarea. El valor debe ser una cadena que termine en "s", como 5s. Si se asigna el valor 0, la antigüedad de la tarea será ilimitada. Ten en cuenta que, si MAX_RETRY_DURATION se define como 0, MAX_ATTEMPTS se sigue aplicando.
    • MIN_INTERVAL: el tiempo mínimo que debe transcurrir entre intentos. El valor debe ser una cadena que termine en "s,", como 5s.
    • MAX_INTERVAL: tiempo máximo que se debe esperar entre reintentos. El valor debe ser una cadena que termine en "s,", como 5s.
    • MAX_DOUBLINGS: el número máximo de veces que se duplicará el intervalo entre reintentos de tareas fallidos antes de que el aumento se convierta en constante. El intervalo de reintento de una tarea comienza en MIN_INTERVAL, después se duplica MAX_DOUBLINGS veces, aumenta de forma lineal y, por último, se 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, a continuación, se reintentará a intervalos de MAX_INTERVAL hasta que se haya intentado realizar la tarea MAX_ATTEMPTS veces: 10 s, 20 s, 40 s, 80 s, 160 s, 240 s, 300 s, 300 s, etc.

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

  2. Para verificar que la cola se ha configurado correctamente, ejecuta el siguiente comando:

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

    Sustituye LOCATION por la ubicación de la cola.

    El resultado debe contener los parámetros de reintento que haya definido.

Siguientes pasos