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.
Pausar la cola Ejecuta el siguiente comando:
gcloud tasks queues pause QUEUE_ID
Sustituye
QUEUE_ID
por el ID de tu cola.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ámetroupdateMask
definido comohttpTarget
.API RPC: envía un
updateQueueRequest
para la cola con una carga útil vacía y el parámetroupdate_mask
definido comohttp_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.
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.
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.
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
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
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.
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
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 enmax_dispatches_per_second
. Para obtener más información, consulta el artículo sobre los mensajesRateLimits
.Cuando usas el método
queue.yaml
, puedes definir los tres elementos:max_concurrent_requests
, que es equivalente amax_concurrent_dispatches
rate
, que es equivalente amax_dispatches_per_second
bucket_size
, que es equivalente amax_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.
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, siMAX_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", como5s
. Si se asigna el valor0
, la antigüedad de la tarea será ilimitada. Ten en cuenta que, siMAX_RETRY_DURATION
se define como0
,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,", como5s
.MAX_INTERVAL
: tiempo máximo que se debe esperar entre reintentos. El valor debe ser una cadena que termine en "s,", como5s
.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 enMIN_INTERVAL
, después se duplicaMAX_DOUBLINGS
veces, aumenta de forma lineal y, por último, se reintenta en intervalos deMAX_INTERVAL
hastaMAX_ATTEMPTS
veces.Por ejemplo, si
MIN_INTERVAL
es10s
,MAX_INTERVAL
es300s
yMAX_DOUBLINGS
es3
, el intervalo de reintento se duplicará3
veces, aumentará linealmente en 2^3 * 10 s y, a continuación, se reintentará a intervalos deMAX_INTERVAL
hasta que se haya intentado realizar la tareaMAX_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 recursoQueue
.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
- Consulta información sobre cómo crear tareas de destino HTTP.
- Más información sobre cómo crear tareas de App Engine
- Consulta más información sobre la gestión de colas en la referencia de la API RPC.
- Consulta más información sobre la gestión de colas en la referencia de la API REST.