Como configurar filas do Cloud Tasks

Nesta página, descrevemos como configurar as filas do Cloud Tasks usando o comando gcloud do SDK do Google Cloud.

Como configurar sua fila do Cloud Tasks

A configuração de uma fila do Cloud Tasks pode ser feita durante a criação dela ou posteriormente. A configuração será aplicada a todas as tarefas nessa fila.

Veja três aspectos básicos para configurar as filas:

Configurar o roteamento (somente filas do App Engine)

É necessário enviar à fila informações sobre o nome e a versão do serviço que contém o trabalhador apropriado. Isso é conhecido como destino. Há três maneiras de definir o destino:

  • Não configure o destino explicitamente. Nesse caso, use o serviço padrão.
  • Declare explicitamente o destino na própria tarefa, definindo AppEngineRouting em AppEngineHttpRequest. Esse é o método preferido se você quer usar um destino diferente do padrão.
  • Faça uma rota explícita de todas as tarefas em uma fila para um destino não padrão usando appEngineRoutingOverride. Esse método substitui qualquer roteamento que possa ser configurado na própria tarefa.

Para usar gcloud para configurar esse roteamento não padrão em nível de fila e, assim, substituir qualquer roteamento em nível de tarefa:

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

onde:

  • SERVICE é o serviço de trabalhador do App Engine responsável pelo gerenciamento de tarefas;
  • VERSION é a versão do aplicativo.

Por exemplo, se você configurar um serviço de worker chamado worker para gerenciar todas as tarefas em uma fila chamada barbequeue, poderá rotear para esse serviço e a versão padrão chamando:

gcloud tasks queues update barbequeue \
    --routing-override=service:worker

Describe a fila:

gcloud tasks queues describe barbequeue

A saída será semelhante a esta:

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

Definir limites de taxa

É possível definir a taxa máxima e o número de tarefas simultâneas que podem ser despachadas por uma fila.

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

onde:

  • DISPATCH_RATE é a taxa na qual os tokens no bucket são atualizados. Em condições em que há um fluxo de tarefas relativamente constante, isso equivale à taxa em que as tarefas são despachadas.
  • MAX_RUNNING é o número máximo de tarefas na fila que podem ser executadas de uma só vez.

Por exemplo, se você criou uma fila chamada barbequeue sem definir nenhum parâmetro, poderá atualizar o número máximo de tarefas simultâneas chamando:

gcloud tasks queues update barbequeue \
        --max-concurrent-dispatches=20

Describe a fila:

gcloud tasks queues describe barbequeue

A saída precisa ser:

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

Como definir taxas de processamento usando comandos gcloud em comparação com queue.yaml

A abordagem da API Cloud Tasks para definir taxas de processamento de fila é um pouco diferente da abordagem usada no upload de arquivos queue.yaml, embora ambos os métodos resultem em filas usando o mesmo mecanismo subjacente.

Em ambos os casos, a fila usa o algoritmo de bucket de token para controlar a taxa de execução da tarefa. Cada fila nomeada tem um bucket que contém seus tokens.

Cada vez que o aplicativo executa uma tarefa, um token é removido do bucket. A fila continua processando tarefas até o esgotamento de tokens do bucket. O sistema recarrega o bucket com novos tokens continuamente com base na taxa max_dispatches_per_second especificada para a fila. Se a fila contiver tarefas a serem processadas e o bucket da fila contiver tokens, o sistema processará simultaneamente todas as tarefas em que houver tokens, até o valor max_concurrent_dispatches definido.

A carga desigual pode permitir o aumento significativo do número de tokens no bucket, o que pode levar a explosões de processamento quando uma sequência de solicitações é recebida. Nesse caso, sua fila pode apresentar uma taxa de despacho real que excede a taxa max_dispatches_per_second, consumindo recursos do sistema e competindo com solicitações de veiculação do usuário. Nos casos em que você usa filas para gerenciar taxas de despacho com base em SLAs relativamente lentos para serviços de downstream, isso pode gerar erros, como HTTP 429 (excesso de solicitações) ou 503 (serviço indisponível).

Ao usar qualquer método de API Cloud Tasks, você tem dois campos para definir a taxa de despacho da fila:

  • max_dispatches_per_second
  • max_concurrent_dispatches

conforme mostrado no exemplo acima. Um terceiro campo, max_burst_size, é calculado pelo sistema com base no valor definido para max_dispatches_per_second.

Ao usar o método queue.yaml, você pode definir todos os três elementos:

  • max_concurrent_requests, que é equivalente a max_concurrent_dispatches
  • rate, que é equivalente a max_dispatches_per_second
  • bucket_size, que é equivalente a max_burst_size

Na maioria dos casos, usar o método de API Cloud Tasks e permitir que o sistema defina max_burst_size produz uma taxa muito eficiente para o gerenciamento de bursts de solicitação. Em alguns casos, no entanto, especialmente quando a taxa desejada é relativamente lenta, usar o método queue.yaml para definir manualmente bucket_size com um valor baixo ou definir max_concurrent_dispatches com um valor baixo por meio da API Cloud Tasks pode lhe dar mais controle.

Definir parâmetros de tentativa

Se uma tarefa não for concluída com sucesso, o Cloud Tasks fará uma nova tentativa com a tarefa com retirada exponencial de acordo com os parâmetros que você configurou. Você pode especificar o número máximo de vezes para repetir as tarefas com falha na fila, definir um limite de tempo para tentar novamente e controlar o intervalo entre as tentativas.

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]

onde:

  • MAX_ATTEMPTS é o número máximo de tentativas para uma tarefa, incluindo a primeira tentativa. Você pode permitir tentativas ilimitadas definindo essa sinalização como unlimited.
  • MIN_INTERVAL é a quantidade mínima de tempo de espera entre as repetições das tentativas. O valor precisa ser uma string que termine em "s", como 5s.
  • MAX_INTERVAL é a quantidade máxima de tempo a aguardar entre as repetições das tentativas. O valor precisa ser uma string que termine em "s", como 5s.
  • MAX_DOUBLINGS é o número máximo de vezes que o intervalo entre tentativas com falha da tarefa será duplicado antes do aumento se tornar constante.
  • MAX_RETRY_DURATION é a quantidade máxima de tempo para tentar novamente uma tarefa com falha. O valor precisa ser uma string que termine em "s", como 5s.

Verifique se a fila foi configurada com sucesso:

gcloud tasks queues describe [QUEUE_ID]

A seguir