Executar um fluxo de trabalho que executa outros fluxos de trabalho em paralelo


Este tutorial mostra como criar e executar um fluxo de trabalho principal que executa vários fluxos de trabalho secundários em paralelo.

No diagrama seguinte, são invocadas quatro execuções paralelas do fluxo de trabalho filho. Isto permite que o fluxo de trabalho principal processe dados em ramificações paralelas e reduz o tempo de execução geral. O fluxo de trabalho principal aguarda a conclusão de todas as execuções do fluxo de trabalho secundário antes de devolver um resumo das execuções bem-sucedidas e com falhas, simplificando a deteção de erros.

Fluxo de trabalho principal que invoca iterações paralelas de um fluxo de trabalho secundário

Objetivos

Neste tutorial, vai:

  1. Crie e implemente um fluxo de trabalho secundário que receba dados de um fluxo de trabalho principal.
  2. Crie e implemente um fluxo de trabalho principal que execute vários fluxos de trabalho secundários usando um ciclo for paralelo.
  3. Execute o fluxo de trabalho principal que invoca execuções paralelas do fluxo de trabalho secundário.
  4. Os resultados de todas as execuções de fluxo de trabalho secundário bem-sucedidas e com falhas são armazenados e devolvidos num mapa.

Pode executar os seguintes comandos na Google Cloud consola ou através da CLI Google Cloud no terminal ou no Cloud Shell.

Custos

Neste documento, usa os seguintes componentes faturáveis do Google Cloud:

Para gerar uma estimativa de custos com base na sua utilização projetada, use a calculadora de preços.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

Antes de começar

As restrições de segurança definidas pela sua organização podem impedir a conclusão dos seguintes passos. Para informações de resolução de problemas, consulte o artigo Desenvolva aplicações num ambiente Google Cloud restrito.

Consola

  1. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Workflow Executions and Workflows APIs.

    Enable the APIs

  5. Create a service account:

    1. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    2. Select your project.
    3. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

      In the Service account description field, enter a description. For example, Service account for quickstart.

    4. Click Create and continue.
    5. Grant the Workflows > Workflows Invoker role to the service account.

      To grant the role, find the Select a role list, then select Workflows > Workflows Invoker.

    6. Click Continue.
    7. Click Done to finish creating the service account.

  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. Verify that billing is enabled for your Google Cloud project.

  8. Enable the Workflow Executions and Workflows APIs.

    Enable the APIs

  9. Create a service account:

    1. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    2. Select your project.
    3. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

      In the Service account description field, enter a description. For example, Service account for quickstart.

    4. Click Create and continue.
    5. Grant the Workflows > Workflows Invoker role to the service account.

      To grant the role, find the Select a role list, then select Workflows > Workflows Invoker.

    6. Click Continue.
    7. Click Done to finish creating the service account.

gcloud

  1. Sign in to your Google Account.

    If you don't already have one, sign up for a new account.

  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Workflow Executions and Workflows APIs.

    Enable the APIs

  5. Create a service account:

    1. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    2. Select your project.
    3. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

      In the Service account description field, enter a description. For example, Service account for quickstart.

    4. Click Create and continue.
    5. Grant the roles/workflows.invoker role to the service account.

      To grant the role, find the Select a role list, then select roles/workflows.invoker.

    6. Click Continue.
    7. Click Done to finish creating the service account.

  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. Verify that billing is enabled for your Google Cloud project.

  8. Enable the Workflow Executions and Workflows APIs.

    Enable the APIs

  9. Create a service account:

    1. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    2. Select your project.
    3. In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.

      In the Service account description field, enter a description. For example, Service account for quickstart.

    4. Click Create and continue.
    5. Grant the roles/workflows.invoker role to the service account.

      To grant the role, find the Select a role list, then select roles/workflows.invoker.

    6. Click Continue.
    7. Click Done to finish creating the service account.

Crie e implemente um fluxo de trabalho secundário

Um fluxo de trabalho secundário pode receber e processar dados de um fluxo de trabalho principal. O fluxo de trabalho secundário demonstra isto fazendo o seguinte:

  • Recebe um número inteiro como argumento
  • Dorme durante 10 segundos para simular algum processamento
  • Devolve um indicador (com base no facto de o número inteiro ser par ou ímpar) para simular o êxito ou a falha da execução do fluxo de trabalho

Consola

  1. Na Google Cloud consola, aceda à página Fluxos de trabalho.

    Aceda a Fluxos de trabalho

  2. Clique em Criar.

  3. Introduza o nome, workflow-child, do novo fluxo de trabalho.

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

  5. Selecione a conta de serviço que criou anteriormente.

  6. Clicar em Seguinte.

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

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - check_iteration_even_or_odd:
            switch:
              - condition: ${iteration % 2 == 0}
                next: raise_error
        - return_message:
            return: ${"Hello world"+iteration}
        - raise_error:
            raise: ${"Error with iteration "+iteration}
  8. Clique em Implementar.

gcloud

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

    touch workflow-child.yaml
  2. Abra o ficheiro de código-fonte num editor de texto e copie o seguinte fluxo de trabalho para o ficheiro.

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - check_iteration_even_or_odd:
            switch:
              - condition: ${iteration % 2 == 0}
                next: raise_error
        - return_message:
            return: ${"Hello world"+iteration}
        - raise_error:
            raise: ${"Error with iteration "+iteration}
  3. Implemente o fluxo de trabalho:

    gcloud workflows deploy workflow-child \
        --source=workflow-child.yaml \
        --location=us-central1 \
        --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

    Substitua SERVICE_ACCOUNT_NAME pelo nome da conta de serviço que criou anteriormente.

Crie e implemente o fluxo de trabalho principal

O fluxo de trabalho principal executa vários ramos do fluxo de trabalho secundário através de um ciclo forparalelo.

  1. Copie o código-fonte da definição do fluxo de trabalho. É composto pelas seguintes partes:

    1. É usado um mapa para armazenar os resultados das execuções do fluxo de trabalho secundário. Para mais informações, consulte o artigo Mapas.

      main:
        steps:
          - init:
              assign:
                - execution_results: {} # results from each execution
                - execution_results.success: {} # successful executions saved under 'success' key
                - execution_results.failure: {} # failed executions saved under 'failure' key
    2. Um ciclo for é executado em paralelo para invocar o fluxo de trabalho secundário. Para mais informações, consulte os artigos Passos paralelos e Iteração.

      - execute_child_workflows:
          parallel:
            shared: [execution_results]
            for:
              value: iteration
              in: [1, 2, 3, 4]
              steps:
                  - iterate:
    3. O fluxo de trabalho secundário é invocado através de um conector. Cada iteração do fluxo de trabalho filho recebe o argumento iteration. O fluxo de trabalho principal aguarda e armazena o resultado de cada execução do fluxo de trabalho secundário. Para mais informações, consulte o conector da API Workflows Executions e os argumentos de tempo de execução.

      try:
        steps:
          - execute_child_workflow:
              call: googleapis.workflowexecutions.v1.projects.locations.workflows.executions.run
              args:
                workflow_id: workflow-child
                #location: ...
                #project_id: ...
                argument:
                  iteration: ${iteration}
              result: execution_result
          - save_successful_execution:
              assign:
                - execution_results.success[string(iteration)]: ${execution_result}
      except:
          as: e
          steps:
            - save_failed_execution:
                assign:
                  - execution_results.failure[string(iteration)]: ${e}
    4. Os resultados da execução são devolvidos. Para mais informações, consulte o artigo Conclua a execução de um fluxo de trabalho.

      - return_execution_results:
          return: ${execution_results}
  2. Implemente o fluxo de trabalho:

    Consola

    1. Na Google Cloud consola, aceda à página Fluxos de trabalho:

      Aceda a Fluxos de trabalho

    2. Clique em Criar.

    3. Introduza o nome, workflow-parent, do novo fluxo de trabalho.

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

    5. Selecione a conta de serviço que criou anteriormente.

    6. Clicar em Seguinte.

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

    8. Clique em Implementar.

    gcloud

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

      touch workflow-parent.yaml
    2. Abra o ficheiro de código fonte num editor de texto e cole a definição do fluxo de trabalho principal.

    3. Implemente o fluxo de trabalho:

      gcloud workflows deploy workflow-parent \
          --source=workflow-parent.yaml \
          --location=us-central1 \
          --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com

      Substitua SERVICE_ACCOUNT_NAME pelo nome da conta de serviço que criou anteriormente.

Execute o fluxo de trabalho principal

Execute o fluxo de trabalho principal para que as invocações do fluxo de trabalho secundário sejam executadas em paralelo. As execuções devem demorar cerca de 10 segundos a concluir.

Consola

  1. Na Google Cloud consola, aceda à página Fluxos de trabalho:

    Aceda a Fluxos de trabalho

  2. Na página Fluxos de trabalho, clique no fluxo de trabalho workflow-parent para aceder à respetiva página de detalhes.

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

  4. Clique novamente em Executar.

  5. Veja os resultados do fluxo de trabalho no painel Saída.

    Os resultados devem ser semelhantes aos seguintes, indicando erros com as iterações 2 e 4, e êxito com as iterações 1 e 3.

    "failure": {
      "2": {
        "message": "Execution failed or cancelled.",
        "operation": {
          "argument": "{\"iteration\":2}",
          "duration": "10.157992541s",
          "endTime": "2023-07-11T13:13:13.028424329Z",
          "error": {
            "context": "RuntimeError: \"Error with iteration 2\"\nin step \"raise_error\", routine \"main\", line: 18",
            "payload": "\"Error with iteration 2\"",
    ...
      "4": {
        "message": "Execution failed or cancelled.",
        "operation": {
          "argument": "{\"iteration\":4}",
          "duration": "10.157929734s",
          "endTime": "2023-07-11T13:13:13.061289142Z",
          "error": {
            "context": "RuntimeError: \"Error with iteration 4\"\nin step \"raise_error\", routine \"main\", line: 18",
            "payload": "\"Error with iteration 4\"",
    ...
    "success": {
      "1": "Hello world1",
      "3": "Hello world3"

gcloud

Execute o fluxo de trabalho:

gcloud workflows run workflow-parent \
    --location=us-central1

Os resultados devem ser semelhantes aos seguintes, indicando erros com as iterações 2 e 4, e êxito com as iterações 1 e 3.

Waiting for execution [06c753e4-6947-4c62-ac0b-2a9d53fb1b8f] to complete...done.
argument: 'null'
duration: 14.065415004s
endTime: '2023-07-11T12:50:43.929023883Z'
name: projects/386837416586/locations/us-central1/workflows/workflow-parent/executions/06c753e4-6947-4c62-ac0b-2a9d53fb1b8f
result: '{"failure":{"2":{"message":"Execution failed or cancelled.","operation":{"argument":"{\"iteration\":2}","duration":"10.143718070s","endTime":"2023-07-11T12:50:40.673209821Z","error":{"context":"RuntimeError:
...
"Error with iteration 2\"\nin step \"raise_error\", routine \"main\", line: 18","payload":"\"Error
...
"Error with iteration 4\"\nin step \"raise_error\", routine \"main\", line: 18","payload":"\"Error
...
"success":{"1":"Hello world1","3":"Hello world3"}}'
startTime: '2023-07-11T12:50:29.863608879Z'
state: SUCCEEDED

Criou e implementou com êxito um fluxo de trabalho que invoca um fluxo de trabalho secundário, executa quatro iterações do fluxo de trabalho secundário em ramificações paralelas e devolve um indicador de êxito ou falha para cada execução do fluxo de trabalho secundário.

Limpar

Se criou um novo projeto para este tutorial, elimine o projeto. Se usou um projeto existente e quer mantê-lo sem as alterações adicionadas neste tutorial, elimine os recursos criados para o tutorial.

Elimine o projeto

A forma mais fácil de eliminar a faturação é eliminar o projeto que criou para o tutorial.

Para eliminar o projeto:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Elimine recursos de tutoriais

Elimine os fluxos de trabalho criados neste tutorial:

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

O que se segue?