Usar uma fila do Cloud Tasks para armazenar em buffer as execuções de fluxo de trabalho


Neste tutorial, mostramos como criar uma fila do Cloud Tasks que pode regular a taxa de execuções do fluxo de trabalho.

Há um número máximo de execuções de fluxo de trabalho ativas que podem ocorrer simultaneamente. Depois que o limite é atingido, novas execuções falham com um código de status HTTP 429 Too many requests. Ao ativar uma fila do Cloud Tasks para executar fluxos de trabalho filhos em uma taxa definida por você, é possível evitar problemas relacionados à cota do Workflows e alcançar uma melhor taxa de execução.

O Cloud Tasks foi projetado para entregar "pelo menos uma vez". No entanto, o Workflows não garante o processamento exato de solicitações duplicadas do Cloud Tasks.

No diagrama a seguir, um fluxo de trabalho pai invoca fluxos de trabalho filhos que são regulados por uma fila do Cloud Tasks com uma taxa de despacho aplicada.

Fluxo de trabalho pai que invoca iterações de um fluxo de trabalho filho por meio do Cloud Tasks Queue

Objetivos

Neste tutorial, você aprenderá a:

  1. Crie uma fila do Cloud Tasks que atua como um intermediário entre os fluxos de trabalho pai e filho.
  2. Criar e implantar um fluxo de trabalho filho que recebe dados do fluxo pai.
  3. Crie e implante o fluxo de trabalho pai que executa o fluxo de trabalho filho por meio da fila do Cloud Tasks.
  4. Executar o fluxo de trabalho pai sem um limite de taxa de despacho, que invoca execuções do fluxo de trabalho filho.
  5. Aplique um limite de despacho à fila do Cloud Tasks e execute o fluxo de trabalho pai.
  6. Os fluxos de trabalho filhos são executados na taxa definida pela fila do Cloud Tasks.

É possível executar os comandos a seguir no console do Google Cloud ou usando a Google Cloud CLI no seu terminal ou no Cloud Shell.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

As restrições de segurança definidas pela sua organização podem impedir que você conclua as etapas a seguir. Para informações sobre solução de problemas, consulte Desenvolver aplicativos em um ambiente restrito do Google Cloud.

Console

  1. Faça login na sua Conta do Google.

    Se você ainda não tiver uma, inscreva-se agora.

  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Ative as APIs Cloud Tasks, Compute Engine, and Workflows.

    Ative as APIs

  5. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  6. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  7. Ative as APIs Cloud Tasks, Compute Engine, and Workflows.

    Ative as APIs

  8. No console do Google Cloud, acesse a página IAM para definir permissões para a conta de serviço padrão do Compute Engine.

    Acessar IAM

    Anote a conta de serviço padrão do Compute Engine. Você a associará aos fluxos de trabalho neste tutorial para fins de teste. Essa conta de serviço é criada automaticamente após a ativação ou o uso de um serviço do Google Cloud que usa o Compute Engine e com o seguinte formato de e-mail:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    Substitua PROJECT_NUMBER pelo número do projeto do Google Cloud. O número do projeto está na página de boas-vindas do console do Google Cloud.

    Para ambientes de produção, é altamente recomendável criar uma nova conta de serviço e conceder a ela um ou mais papéis do IAM que contenham as permissões mínimas necessárias e sigam o princípio do privilégio mínimo.

  9. Selecione a conta de serviço padrão do Compute Engine e, nessa linha, clique em Editar principal.
  10. Na caixa de diálogo exibida, clique em Adicionar outro papel e adicione os seguintes papéis:
    1. Na lista Selecionar papel, selecione Fluxos de trabalho > Invocador de fluxos de trabalho para que a conta tenha permissão para acionar a execução do fluxo de trabalho.
    2. Na lista Selecionar um papel, selecione Cloud Tasks > Enfileirador do Cloud Tasks para que a conta tenha permissão para criar tarefas.
  11. Clique em Salvar.

gcloud

  1. Faça login na sua Conta do Google.

    Se você ainda não tiver uma, inscreva-se agora.

  2. Instale a CLI do Google Cloud.
  3. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  4. Crie ou selecione um projeto do Google Cloud.

    • Crie um projeto do Google Cloud:

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto do Google Cloud que você está criando.

    • Selecione o projeto do Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud.

  5. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  6. Ative as APIs Cloud Tasks, Compute Engine, and Workflows:

    gcloud services enable cloudtasks.googleapis.com compute.googleapis.com workflows.googleapis.com
  7. Instale a CLI do Google Cloud.
  8. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  9. Crie ou selecione um projeto do Google Cloud.

    • Crie um projeto do Google Cloud:

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o projeto do Google Cloud que você está criando.

    • Selecione o projeto do Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud.

  10. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  11. Ative as APIs Cloud Tasks, Compute Engine, and Workflows:

    gcloud services enable cloudtasks.googleapis.com compute.googleapis.com workflows.googleapis.com
  12. Anote a conta de serviço padrão do Compute Engine. Você a associará aos fluxos de trabalho neste tutorial para fins de teste. Essa conta de serviço é criada automaticamente após a ativação ou o uso de um serviço do Google Cloud que usa o Compute Engine e com o seguinte formato de e-mail:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    Substitua PROJECT_NUMBER pelo número do projeto do Google Cloud. É possível encontrar o número do projeto executando o seguinte comando:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

    Para ambientes de produção, é altamente recomendável criar uma nova conta de serviço e conceder a ela um ou mais papéis do IAM que contenham as permissões mínimas necessárias e sigam o princípio do privilégio mínimo.

  13. Conceda o papel Invocador de fluxos de trabalho (roles/workflows.invoker) no projeto à conta de serviço padrão do Compute Engine para que ela tenha permissão para acionar a execução do fluxo de trabalho.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/workflows.invoker

    Substitua:

    • PROJECT_ID: o ID do projeto do Google Cloud
    • PROJECT_NUMBER: o número do projeto do Google Cloud

  14. Conceda o papel de Enfileirador do Cloud Tasks (roles/cloudtasks.enqueuer) no projeto à conta de serviço padrão do Compute Engine para que ela tenha permissão para criar tarefas.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/cloudtasks.enqueuer

Criar uma fila do Cloud Tasks

Criar uma fila do Cloud Tasks que possa ser usada no fluxo de trabalho pai e que permita regular a taxa de execuções do fluxo de trabalho.

Console

  1. No console do Google Cloud, acesse a página Cloud Tasks:

    Ir para o Cloud Tasks

  2. Clique em Criar fila push.

  3. Insira o Nome da fila, queue-workflow-child.

  4. Na lista Região, selecione us-central1 (Iowa).

  5. Clique em Criar.

gcloud

QUEUE=queue-workflow-child
LOCATION=us-central1
gcloud tasks queues create $QUEUE --location=$LOCATION

Criar e implantar um fluxo de trabalho filho

Um fluxo de trabalho filho pode receber e processar dados de um fluxo de trabalho pai. Crie e implante um fluxo de trabalho filho que faça o seguinte:

  • Recebe um iteration como argumento.
  • Fica suspenso por 10 segundos para simular algum processamento
  • Retorna uma string após a execução bem-sucedida

Console

  1. No console do Google Cloud, abra a página Workflows.

    Acessar fluxos de trabalho

  2. Clique em Criar.

  3. Digite o nome, workflow-child, para o novo fluxo de trabalho.

  4. Na lista Região, selecione us-central1 (Iowa).

  5. Na lista Conta de serviço, selecione a conta de serviço padrão do Compute Engine.

  6. Clique em Próxima.

  7. No editor de fluxo de trabalho, insira a seguinte definição para seu fluxo de trabalho:

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - return_message:
            return: ${"Hello world"+iteration}
  8. Selecione Implantar.

gcloud

  1. Crie um arquivo de código-fonte para seu fluxo de trabalho:

    touch workflow-child.yaml
    
  2. Abra o arquivo de código-fonte em um editor de texto e copie o fluxo de trabalho a seguir para o arquivo.

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - return_message:
            return: ${"Hello world"+iteration}
  3. Implante o fluxo de trabalho:

    gcloud workflows deploy workflow-child \
        --source=workflow-child.yaml \
        --location=us-central1 \
        --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

Criar e implantar o fluxo de trabalho pai

O fluxo de trabalho pai executa várias ramificações do fluxo de trabalho filho usando um loop for.

  1. Copie o código-fonte que define o fluxo de trabalho pai:

    main:
      steps:
        - init:
            assign:
              - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
              - project_number: ${sys.get_env("GOOGLE_CLOUD_PROJECT_NUMBER")}
              - location: ${sys.get_env("GOOGLE_CLOUD_LOCATION")}
              - workflow_child_name: "workflow-child"
              - queue_name: "queue-workflow-child"
        - enqueue_tasks_to_execute_child_workflow:
            for:
              value: iteration
              range: [1, 100]
              steps:
                  - iterate:
                      assign:
                        - data:
                            iteration: ${iteration}
                        - exec:
                            # Encode object to JSON string in expression for workflow argument
                            argument: ${json.encode_to_string(data)}
                  - create_task_to_execute_child_workflow:
                      call: googleapis.cloudtasks.v2.projects.locations.queues.tasks.create
                      args:
                          parent: ${"projects/" + project_id + "/locations/" + location + "/queues/" + queue_name}
                          body:
                            task:
                              httpRequest:
                                body: ${base64.encode(json.encode(exec))}
                                url: ${"https://workflowexecutions.googleapis.com/v1/projects/" + project_id + "/locations/" + location + "/workflows/" + workflow_child_name + "/executions"}
                                oauthToken:
                                  serviceAccountEmail: ${project_number + "-compute@developer.gserviceaccount.com"}

    O fluxo de trabalho consiste nas seguintes partes:

    • Um mapa usado para atribuir constantes referentes ao fluxo de trabalho filho e ao nome da fila do Cloud Tasks. Para mais informações, consulte Maps.

    • Uma repetição for que é executada para invocar o fluxo de trabalho filho de maneira iterativa. Para mais informações, consulte Iteração.

    • Uma etapa de fluxo de trabalho que cria e adiciona um grande número de tarefas à fila do Cloud Tasks para executar o fluxo de trabalho filho. Para mais informações, consulte o conector da API Cloud Tasks.

  2. Implante o fluxo de trabalho:

    Console

    1. No console do Google Cloud, acesse a página Fluxos de trabalho:

      Acessar fluxos de trabalho

    2. Clique em Criar.

    3. Digite o nome, workflow-parent, para o novo fluxo de trabalho.

    4. Na lista Região, selecione us-central1 (Iowa).

    5. Na lista Conta de serviço, selecione a conta de serviço padrão do Compute Engine.

    6. Clique em Próxima.

    7. No editor de fluxo de trabalho, cole a definição do fluxo de trabalho pai.

    8. Selecione Implantar.

    gcloud

    1. Crie um arquivo de código-fonte para seu fluxo de trabalho:

      touch workflow-parent.yaml
      
    2. Abra o arquivo de código-fonte em um editor de texto e cole a definição do fluxo de trabalho pai.

    3. Implante o fluxo de trabalho:

      gcloud workflows deploy workflow-parent \
          --source=workflow-parent.yaml \
          --location=us-central1 \
          --service-account=PROJECT_NUMBER-compute@developer.gserviceaccount.com
      

Executar o fluxo de trabalho pai sem limites de taxa

Executar o fluxo de trabalho pai para invocar os fluxos de trabalho filhos por meio da fila do Cloud Tasks. As execuções levam cerca de 10 segundos para serem concluídas.

Console

  1. No console do Google Cloud, acesse a página Fluxos de trabalho:

    Acessar fluxos de trabalho

  2. Na página Workflows, clique no fluxo de trabalho workflow-parent para acessar a página de detalhes.

  3. Na página Detalhes do fluxo de trabalho, clique em Executar.

  4. Clique em Executar novamente.

  5. Como o fluxo de trabalho pai está em execução, retorne à página Workflows e clique no fluxo de trabalho workflow-filho para acessar a página de detalhes.

  6. Clique na guia Executions.

    Você verá execuções do fluxo de trabalho filho em execução quase ao mesmo tempo, de forma semelhante a esta:

    Detalhes das execuções do fluxo de trabalho filho executadas
aproximadamente ao mesmo tempo.

gcloud

  1. Execute o fluxo de trabalho:

    gcloud workflows run workflow-parent \
         --location=us-central1
  2. Para verificar se uma execução de fluxo de trabalho foi acionada, liste as últimas quatro execuções:

    gcloud workflows executions list workflow-child --limit=4

    Como o número de execuções (100) está abaixo do limite de simultaneidade Workflows, os resultados serão semelhantes aos mostrados a seguir. Problemas de cota podem surgir se você enviar milhares de execuções ao mesmo tempo.

    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/1570d06e-d133-4536-a859-b7b6a1a85524
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:15.093934448Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/82724960-7d92-4961-aa2c-a0f0be46212c
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.903007626Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/598126fb-37f9-45bc-91d8-aea7d795d702
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.698260524Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/d2e9960b-f93f-4df4-a594-3e7e5c2be53f
    STATE: ACTIVE
    START_TIME: 2023-07-27T00:56:14.503818840Z
    END_TIME: 

Você criou e implantou um fluxo de trabalho que invoca 100 iterações do fluxo de trabalho filho.

Executar o fluxo de trabalho pai com limites de taxa

Aplique um limite de taxa de um despacho por segundo à fila do Cloud Tasks e, em seguida, execute o fluxo de trabalho pai.

Console

  1. No console do Google Cloud, acesse a página Cloud Tasks:

    Ir para o Cloud Tasks

  2. Clique em queue-workflow-child, na fila do Cloud Tasks que você criou, e em Editar fila.

  3. Na seção Limites de taxa para despachos de tarefas, no campo Máximo de despachos, digite 1.

  4. Clique em Salvar.

  5. Acesse a página Fluxos de trabalho:

    Acessar fluxos de trabalho

  6. Clique no fluxo de trabalho workflow-parent para acessar a página de detalhes.

  7. Na página Detalhes do fluxo de trabalho, clique em Executar.

  8. Clique em Executar novamente.

  9. Como o fluxo de trabalho pai está em execução, retorne à página Workflows e clique no fluxo de trabalho workflow-filho para acessar a página de detalhes.

  10. Clique na guia Executions.

    Você verá execuções do fluxo de trabalho filho em execução em uma solicitação por segundo, semelhante ao seguinte:

    Detalhes do fluxo de trabalho filho executado a cada solicitação por segundo.

gcloud

  1. Atualize a fila do Cloud Tasks para aplicar um limite de taxa de um envio por segundo:

    gcloud tasks queues update $QUEUE \
        --max-dispatches-per-second=1 \
        --location=us-central1
  2. Execute o fluxo de trabalho:

    gcloud workflows run workflow-parent \
       --location=us-central1
    
  3. Para verificar se uma execução de fluxo de trabalho foi acionada, liste as últimas quatro execuções:

    gcloud workflows executions list workflow-child --limit=4

    Os resultados serão semelhantes aos mostrados a seguir, com um fluxo de trabalho executado por segundo:

    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/becf4957-9fb2-40d9-835d-0ff2dd0c1249
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:24.446361457Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/6c1e7c4b-7ac6-4121-b351-1e2d56d10903
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:23.448213989Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/f2ba5027-af40-4cd3-8cd0-b8033bcc6211
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:22.431485914Z
    END_TIME:
    NAME: projects/620278351741/locations/us-central1/workflows/workflow-child/executions/ecc61ee5-fe87-49eb-8803-89dba929f6c8
    STATE: ACTIVE
    START_TIME: 2023-07-27T01:07:21.443466369Z
    END_TIME: 

Você implantou com sucesso um fluxo de trabalho que invoca 100 iterações do fluxo de trabalho filho com uma taxa de despacho de uma execução por segundo.

Limpar

Se você criou um novo projeto para este tutorial, exclua o projeto. Se você usou um projeto atual e quer mantê-lo sem as alterações incluídas neste tutorial, exclua os recursos criados para o tutorial.

Exclua o projeto

O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para o tutorial.

Para excluir o projeto:

  1. No Console do Google Cloud, acesse a página Gerenciar recursos.

    Acessar "Gerenciar recursos"

  2. Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
  3. Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.

Excluir recursos do tutorial

Exclua os fluxos de trabalho e os recursos do Cloud Tasks criados neste tutorial:

Console

  • Para excluir os fluxos de trabalho, siga estas etapas:

    1. No console do Google Cloud, acesse a página Fluxos de trabalho:

      Acessar fluxos de trabalho

    2. Na lista de fluxos de trabalho, clique em um para acessar a página Detalhes do fluxo de trabalho.

    3. Clique em Excluir.

    4. Digite o nome do fluxo de trabalho e clique em Confirmar.

  • Para excluir a fila do Cloud Tasks, siga estas etapas:

    1. No console do Google Cloud, acesse a página Cloud Tasks:

      Ir para o Cloud Tasks

    2. Selecione o nome da fila que você quer excluir e clique em Excluir fila.

    3. Confirme a ação.

gcloud

  • Para excluir os fluxos de trabalho, execute estes comandos:

    gcloud workflows delete workflow-child
    gcloud workflows delete workflow-parent

  • Para excluir a fila do Cloud Tasks, execute este comando:

    gcloud tasks queues delete queue-workflow-child
    

A seguir