Configurar filas do Cloud Tasks

É possível configurar a fila do Cloud Tasks durante a criação ou a qualquer momento depois. A configuração é aplicada a todas as tarefas nessa fila.

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

Configurar o roteamento no nível da fila

A configuração do roteamento no nível da fila substitui o roteamento definido no nível da tarefa. Isso é útil se você quiser usar o Cloud Tasks como um buffer na frente do serviço de destino ou se precisar mudar o roteamento de todas as tarefas em uma fila.

O roteamento no nível da fila se aplica a:

  • Tarefas na fila
  • Tarefas que são adicionadas à fila depois que o roteamento no nível da fila é definido

Limitações

O roteamento no nível da fila não é compatível com as chaves de criptografia gerenciadas pelo cliente (CMEKs) do Cloud Key Management Service (Cloud KMS). Se o CMEK estiver ativado, não será possível fazer o seguinte:

  • Criar tarefas em uma fila com roteamento no nível da fila
  • Aplicar o roteamento no nível da fila

Configurar o roteamento no nível da fila para tarefas HTTP

É possível configurar uma fila para substituir o roteamento no nível da tarefa ao criar ou atualizar a fila. Para configurar o roteamento no nível da fila, defina o parâmetro uriOverride da fila para a rota preferida.

Se você estiver aplicando o roteamento no nível da fila como uma atualização de uma fila existente, pause a fila antes de aplicar as mudanças e aguarde um minuto após a aplicação das mudanças para retomar a fila.

  1. Pausar a fila executando o seguinte comando:

      gcloud tasks queues pause QUEUE_ID
      

    Substitua QUEUE_ID pelo ID da fila.

  2. Atualize ou remova o roteamento no nível da fila.

    • Para atualizar o roteamento em nível de fila, defina o parâmetro uriOverride para sua rota atualizada.

    • Para remover o roteamento no nível da fila usando a API REST ou RPC:

      • API REST:envie uma solicitação patch para a fila com um payload vazio e o parâmetro updateMask definido como httpTarget.

      • API RPC:envie uma updateQueueRequest para a fila com um payload vazio e o parâmetro update_mask definido como http_target.

    O exemplo a seguir usa a API REST para atualizar o host para onde as tarefas são encaminhadas:

    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
    

    Substitua:

    • ACCESS_TOKEN: seu token de acesso. Para isso, execute o seguinte no terminal:

      gcloud auth application-default login
      gcloud auth application-default print-access-token
    • PROJECT_ID: o ID do projeto Google Cloud . Para isso, execute o seguinte no terminal:

      gcloud config get-value project

    • LOCATION: o local da fila.

    • NEW_HOST: o novo host para onde você quer encaminhar a fila.

  3. Aguarde um minuto.

    Pode levar até um minuto para que a nova configuração entre em vigor. A espera para retomar a fila ajuda a evitar que as tarefas sejam enviadas com a configuração antiga.

  4. Retome a fila executando o seguinte comando:

    gcloud tasks queues resume QUEUE_ID

Configurar o roteamento no nível da fila para tarefas do App Engine

Para configurar o roteamento no nível da fila para tarefas do App Engine, defina o parâmetro appEngineRoutingOverride da fila para o serviço e a versão do App Engine de sua preferência.

  1. Configure o roteamento no nível da fila e substitua qualquer roteamento no nível da tarefa:

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

    Substitua:

    • QUEUE_ID: o ID da fila (nome abreviado).
    • SERVICE: o serviço de worker do App Engine responsável pelo processamento de tarefas.
    • VERSION: a versão do app.

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

    gcloud tasks queues update QUEUE_ID \
        --routing-override=service:SERVICE
  2. Verifique se a fila foi configurada com sucesso executando o seguinte comando:

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

    Substitua LOCATION pelo local da fila.

    A saída será semelhante a esta:

    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 remover o roteamento no nível da fila, execute o seguinte comando:

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

    Quando o roteamento no nível da fila é removido, o roteamento no nível da tarefa é aplicado às tarefas na fila e às tarefas adicionadas à fila no futuro.

Definir limites de taxa

O limite de taxa determina a taxa máxima em que as tarefas podem ser enviadas por uma fila, independentemente de o envio ser uma primeira tentativa ou uma nova tentativa.

  1. Defina a taxa máxima e o número de tarefas simultâneas que podem ser enviadas por uma fila executando o seguinte comando:

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

    Substitua:

    • QUEUE_ID: o ID da fila (nome abreviado).
    • DISPATCH_RATE: a taxa de envio. Essa é a taxa em que 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_CONCURRENT_DISPATCHES: o número máximo de tarefas na fila que podem ser executadas de uma só vez.

    Por exemplo, se você criou uma fila sem definir nenhum parâmetro, é possível atualizar o número máximo de tarefas simultâneas executando o seguinte comando:

    gcloud tasks queues update QUEUE_ID \
        --max-concurrent-dispatches=MAX_CONCURRENT_DISPATCHES
  2. Verifique se a fila foi configurada com sucesso executando o seguinte comando:

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

    Substitua LOCATION pelo local da fila.

    A saída será semelhante a esta:

    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 taxas de processamento da fila

É possível definir taxas de processamento de fila usando a API Cloud Tasks ou fazendo upload de um arquivo queue.yaml. Ambos os métodos resultam em filas que usam 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 os 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.

Uma 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, a fila pode apresentar uma taxa de envio real que excede a taxa max_dispatches_per_second, consumindo recursos do sistema e competindo com as 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 downstream, isso pode gerar erros, como HTTP 429 (excesso de solicitações) ou HTTP 503 (serviço indisponível).

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

    • max_dispatches_per_second
    • max_concurrent_dispatches

    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, é possível definir 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 necessária é relativamente lenta, usar o método queue.yaml para definir manualmente bucket_size com um valor pequeno ou definir max_concurrent_dispatches com um valor pequeno usando a API Cloud Tasks pode dar mais controle.

Definir parâmetros de tentativa

Se uma tarefa não for concluída, o Cloud Tasks vai tentar novamente com uma espera exponencial de acordo com os parâmetros que você configurou.

  1. Especifique o número máximo de vezes para repetir as tarefas com falha na fila, defina um limite de tempo para as tentativas de repetição e controle o intervalo entre as tentativas executando o seguinte 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

    Substitua:

    • QUEUE_ID: o ID da fila (nome abreviado).
    • MAX_ATTEMPTS: o número máximo de tentativas para uma tarefa, incluindo a primeira. Você pode permitir tentativas ilimitadas definindo essa flag como -1. Se MAX_ATTEMPTS for definido como -1, MAX_RETRY_DURATION ainda será aplicado.
    • MAX_RETRY_DURATION: o tempo máximo para tentar novamente uma tarefa com falha, medido a partir da primeira tentativa da tarefa. O valor precisa ser uma string que termine em "s", como 5s. Se definido como 0, a idade da tarefa será ilimitada. Se MAX_RETRY_DURATION for definido como 0, MAX_ATTEMPTS ainda será aplicado.
    • MIN_INTERVAL: o tempo mínimo de espera entre as tentativas de nova tentativa. O valor precisa ser uma string que termine em "s", como 5s.
    • MAX_INTERVAL: o tempo máximo de espera entre as tentativas de nova tentativa. 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 novas tentativas de tarefas com falhas será duplicado antes que o aumento se torne constante. O intervalo de repetição de uma tarefa começa em MIN_INTERVAL, duplica MAX_DOUBLINGS vezes, aumenta linearmente e, finalmente, tenta novamente em intervalos de MAX_INTERVAL até MAX_ATTEMPTS.

      Por exemplo, se MIN_INTERVAL for 10s, MAX_INTERVAL for 300s e MAX_DOUBLINGS for 3, o intervalo de repetição vai duplicar 3 vezes, aumentar linearmente em 2^3 * 10s e, em seguida, repetir em intervalos de MAX_INTERVAL até que a tarefa tenha sido tentada MAX_ATTEMPTS vezes: 10s, 20s, 40s, 80s, 160s, 240s, 300s, 300s e assim por diante.

    Para mais detalhes sobre o parâmetro, consulte as configurações de RetryConfig para o recurso Queue.

  2. Verifique se a fila foi configurada com sucesso executando o seguinte comando:

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

    Substitua LOCATION pelo local da fila.

    A saída precisa conter os parâmetros de nova tentativa definidos.

A seguir