Configure filas do Cloud Tasks

Pode configurar a fila do Cloud Tasks quando a cria ou em qualquer altura posteriormente. A configuração é aplicada a todas as tarefas nessa fila.

Existem três aspetos básicos para configurar as suas filas:

Configure o encaminhamento ao nível da fila

A configuração do encaminhamento ao nível da fila substitui o encaminhamento definido ao nível da tarefa. Isto é útil se quiser usar o Cloud Tasks como um buffer antes do serviço de destino ou se precisar de alterar o encaminhamento de todas as tarefas numa fila.

O encaminhamento ao nível da fila aplica-se a:

  • Tarefas que estão na fila
  • Tarefas adicionadas à fila depois de a encaminhamento ao nível da fila ter sido definido

Limitações

O encaminhamento ao nível da fila não é compatível com chaves de encriptação geridas pelo cliente (CMEK) do Cloud Key Management Service (Cloud KMS). Se as CMEK estiverem ativadas, não pode fazer o seguinte:

  • Crie tarefas numa fila com encaminhamento ao nível da fila
  • Aplique o encaminhamento ao nível da fila

Configure o encaminhamento ao nível da fila para tarefas HTTP

Pode configurar uma fila para substituir o encaminhamento ao nível da tarefa quando cria a fila ou quando a atualiza. Para configurar o encaminhamento ao nível da fila, defina o parâmetro uriOverride da fila para o seu caminho preferencial.

Se estiver a aplicar o encaminhamento ao nível da fila como uma atualização a uma fila existente, pause a fila antes de aplicar as alterações e aguarde um minuto após a aplicação das alterações para retomar a fila.

  1. Pausar a fila executando o seguinte comando:

      gcloud tasks queues pause QUEUE_ID
      

    Substitua QUEUE_ID pelo ID da sua fila.

  2. Atualize ou remova o encaminhamento ao nível da fila.

    • Para atualizar o encaminhamento ao nível da fila, defina o parâmetro uriOverride para o seu percurso atualizado.

    • Para remover o encaminhamento ao nível da fila através da API REST ou RPC:

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

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

    O exemplo seguinte usa a API REST para atualizar o anfitrião para o qual 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 o seguinte:

    • ACCESS_TOKEN: a sua chave de acesso. Pode obter este valor executando o seguinte no seu terminal:

      gcloud auth application-default login
      gcloud auth application-default print-access-token
    • PROJECT_ID: o ID do seu projeto Google Cloud . Pode obter esta informação executando o seguinte no terminal:

      gcloud config get-value project

    • LOCATION: a localização da sua fila.

    • NEW_HOST: o novo anfitrião para o qual quer encaminhar a fila.

  3. Aguarde um minuto.

    A nova configuração pode demorar até um minuto a entrar em vigor. Aguardar para retomar a fila ajuda a evitar o envio de tarefas com a configuração antiga.

  4. Execute o seguinte comando para retomar a fila:

    gcloud tasks queues resume QUEUE_ID

Configure o encaminhamento ao nível da fila para tarefas do App Engine

Para configurar o encaminhamento ao 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 preferidos.

  1. Configurar o encaminhamento ao nível da fila e substituir qualquer encaminhamento ao nível da tarefa:

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

    Substitua o seguinte:

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

    Por exemplo, se configurar um serviço de trabalhadores para processar todas as tarefas numa fila, pode encaminhar para esse serviço e para a versão predefinida:

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

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

    Substitua LOCATION pela localização da fila.

    O resultado deve ser semelhante ao seguinte:

    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 encaminhamento ao nível da fila, execute o seguinte comando:

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

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

Defina limites de taxas

O limite de velocidade determina a velocidade máxima à qual as tarefas podem ser enviadas por uma fila, independentemente de o envio ser uma primeira tentativa de tarefa 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 o seguinte:

    • QUEUE_ID: o ID da fila (o nome abreviado).
    • DISPATCH_RATE: a taxa de expedição. Esta é a taxa à qual os tokens no depósito são atualizados. Em condições em que existe um fluxo relativamente constante de tarefas, esta é a taxa equivalente à qual as tarefas são enviadas.
    • MAX_CONCURRENT_DISPATCHES: o número máximo de tarefas na fila que podem ser executadas em simultâneo.

    Por exemplo, se criou uma fila sem definir parâmetros, pode 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. Valide se a fila foi configurada com êxito executando o seguinte comando:

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

    Substitua LOCATION pela localização da fila.

    O resultado deve ser semelhante ao seguinte:

    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 de filas

Pode definir as taxas de processamento de filas através da API Cloud Tasks ou carregando um ficheiro 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 token bucket para controlar a taxa de execução de tarefas. Cada fila nomeada tem um contentor que contém os respetivos tokens.

Sempre que a sua aplicação executa uma tarefa, é removido um token do depósito. A fila continua a processar tarefas até que o respetivo conjunto fique sem tokens. O sistema repõe continuamente o contentor com novos tokens com base na taxa max_dispatches_per_second que especificar para a fila. Se a fila contiver tarefas a processar e o contentor da fila contiver tokens, o sistema processa simultaneamente tantas tarefas quantos tokens existirem, até ao valor max_concurrent_dispatches que definiu.

Uma carga desigual pode permitir que o número de tokens no contentor aumente significativamente, o que pode levar a picos de processamento quando ocorre um pico de pedidos. Neste caso, a sua fila pode registar uma taxa de envio real que excede a sua taxa de max_dispatches_per_second, consumindo recursos do sistema e competindo com pedidos de publicação para utilizadores. Nos casos em que usa filas para gerir as taxas de envio com base em SLAs relativamente lentos para serviços a jusante, isto pode originar erros como HTTP 429 (Demasiados pedidos) ou HTTP 503 (Serviço indisponível).

  • Quando usa qualquer método da API Cloud Tasks, tem dois campos para definir a taxa de envio da fila:

    • max_dispatches_per_second
    • max_concurrent_dispatches

    Um terceiro campo, max_burst_size, é calculado pelo sistema com base no valor que define para max_dispatches_per_second. Para mais informações, consulte o artigo Mensagens RateLimits.

  • Quando usa o método queue.yaml, 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 da API Cloud Tasks e permitir que o sistema defina max_burst_size produz uma taxa muito eficiente para gerir picos de pedidos. No entanto, em alguns casos, particularmente quando a taxa necessária é relativamente lenta, pode ter mais controlo se usar o método queue.yaml para definir manualmente bucket_size para um valor pequeno ou definir max_concurrent_dispatches para um valor pequeno através da API Cloud Tasks.

Defina os parâmetros de repetição

Se uma tarefa não for concluída com êxito, o Cloud Tasks volta a tentar a tarefa com um recuo exponencial de acordo com os parâmetros que definiu.

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

    • QUEUE_ID: o ID da fila (o nome abreviado).
    • MAX_ATTEMPTS: o número máximo de tentativas para uma tarefa, incluindo a primeira tentativa. Pode permitir novas tentativas ilimitadas definindo esta flag como -1. Tenha em atenção que, se MAX_ATTEMPTS estiver definido como -1, MAX_RETRY_DURATION continua a ser aplicado.
    • MAX_RETRY_DURATION: o período máximo para tentar novamente uma tarefa com falha, medido a partir do momento em que a tarefa foi tentada pela primeira vez. O valor tem de ser uma string que termine em "s", como 5s. Se estiver definido como 0, a idade da tarefa é ilimitada. Tenha em atenção que, se MAX_RETRY_DURATION estiver definido como 0, MAX_ATTEMPTS continua a ser aplicado.
    • MIN_INTERVAL: o tempo mínimo de espera entre tentativas. O valor tem de ser uma string que termine em "s", como 5s.
    • MAX_INTERVAL: o tempo máximo de espera entre tentativas de repetição. O valor tem de ser uma string que termine em "s", como 5s.
    • MAX_DOUBLINGS: o número máximo de vezes que o intervalo entre as novas tentativas de tarefas com falhas é duplicado antes de o aumento se tornar constante. O intervalo de repetição de uma tarefa começa em MIN_INTERVAL, depois duplica MAX_DOUBLINGS vezes, aumenta linearmente e, finalmente, repete-se em intervalos de MAX_INTERVAL até MAX_ATTEMPTS vezes.

      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 2^3 * 10 s e, em seguida, repetir nos intervalos de MAX_INTERVAL até que a tarefa tenha sido tentada MAX_ATTEMPTS vezes: 10 s, 20 s, 40 s, 80 s, 160 s, 240 s, 300 s, 300 s e assim sucessivamente.

    Para mais detalhes sobre os parâmetros, consulte as definições de RetryConfig do recurso Queue.

  2. Valide se a fila foi configurada com êxito executando o seguinte comando:

    gcloud tasks queues describe QUEUE_ID --location=LOCATION

    Substitua LOCATION pela localização da fila.

    O resultado deve conter os parâmetros de repetição que definiu.

O que se segue?