Utilizza una coda Cloud Tasks per mettere in coda le esecuzioni del flusso di lavoro

Questo tutorial mostra come creare una coda Cloud Tasks in grado di regolare la velocità di esecuzione dei workflow.

Esiste un numero massimo di esecuzioni del flusso di lavoro attive che possono verificarsi contemporaneamente. Una volta esaurita questa quota e se il backlog di esecuzione è disattivato o se viene raggiunta la quota per le esecuzioni in backlog, le nuove esecuzioni non vanno a buon fine e viene restituito un codice di stato HTTP 429 Too many requests. Se attivi una coda Cloud Tasks per eseguire i flussi di lavoro secondari alla velocità che definisci, puoi evitare problemi relativi alle quote di Workflows e ottenere una velocità di esecuzione migliore.

Tieni presente che Cloud Tasks è progettato per fornire la consegna "at least once"; tuttavia, Workflows non garantisce l'elaborazione "exactly-once" delle richieste duplicate da Cloud Tasks.

Nel seguente diagramma, un workflow principale richiama workflow secondari regolati da una coda Cloud Tasks a cui è applicata una frequenza di invio.

Flusso di lavoro principale che richiama le iterazioni di un flusso di lavoro secondario tramite
la coda Cloud Tasks

Crea una coda di attività Cloud Tasks

Crea una coda di attività Cloud Tasks che puoi utilizzare nel workflow principale e che ti consente di regolare la frequenza di esecuzione dei workflow.

Console

  1. Nella console Google Cloud , vai alla pagina Cloud Tasks:

    Vai a Cloud Tasks

  2. Fai clic su Crea coda in modalità push.

  3. Inserisci il nome della coda, queue-workflow-child.

  4. Nell'elenco Regione, seleziona us-central1 (Iowa).

  5. Fai clic su Crea.

gcloud

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

Crea ed esegui il deployment di un flusso di lavoro secondario

Un workflow secondario può ricevere ed elaborare i dati di un workflow principale. Crea ed esegui il deployment di un flusso di lavoro secondario che:

  • Riceve un iteration come argomento
  • Si mette in pausa per 10 secondi per simulare l'elaborazione
  • Restituisce una stringa in caso di esecuzione riuscita

Console

  1. Nella Google Cloud console, vai alla pagina Workflows.

    Vai a Flussi di lavoro

  2. Fai clic su Crea.

  3. Inserisci il nome, workflow-child, per il nuovo flusso di lavoro.

  4. Nell'elenco Regione, seleziona us-central1 (Iowa).

  5. Nell'elenco Service account, seleziona il service account predefinito di Compute Engine.

  6. Fai clic su Avanti.

  7. Nell'editor del workflow, inserisci la seguente definizione per il workflow:

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - return_message:
            return: ${"Hello world"+iteration}
  8. Fai clic su Esegui il deployment.

gcloud

  1. Crea un file di codice sorgente per il workflow:

    touch workflow-child.yaml
  2. Apri il file del codice sorgente in un editor di testo e copia il seguente flusso di lavoro nel file.

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - return_message:
            return: ${"Hello world"+iteration}
  3. Esegui il deployment del workflow:

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

Crea ed esegui il deployment del workflow principale

Il flusso di lavoro principale esegue più rami del flusso di lavoro secondario utilizzando un ciclo for.

  1. Copia il codice sorgente che definisce il workflow principale:

    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"}

    Il flusso di lavoro è costituito dalle seguenti parti:

    • Una mappa utilizzata per assegnare costanti che fanno riferimento al workflow secondario e al nome della coda Cloud Tasks. Per ulteriori informazioni, consulta la sezione Maps.

    • Un ciclo for che viene eseguito per richiamare il flusso di lavoro secondario in modo iterativo. Per ulteriori informazioni, vedi Iterazione.

    • Un passaggio del flusso di lavoro che crea e aggiunge un numero elevato di attività alla coda Cloud Tasks per eseguire il flusso di lavoro secondario. Per ulteriori informazioni, vedi Connettore API Cloud Tasks.

  2. Esegui il deployment del workflow:

    Console

    1. Nella console Google Cloud , vai alla pagina Workflows:

      Vai a Flussi di lavoro

    2. Fai clic su Crea.

    3. Inserisci il nome, workflow-parent, per il nuovo flusso di lavoro.

    4. Nell'elenco Regione, seleziona us-central1 (Iowa).

    5. Nell'elenco Service account, seleziona il service account predefinito di Compute Engine.

    6. Fai clic su Avanti.

    7. Nell'editor del flusso di lavoro, incolla la definizione del flusso di lavoro principale.

    8. Fai clic su Esegui il deployment.

    gcloud

    1. Crea un file di codice sorgente per il workflow:

      touch workflow-parent.yaml
    2. Apri il file del codice sorgente in un editor di testo e incolla la definizione del flusso di lavoro principale.

    3. Esegui il deployment del workflow:

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

Esegui il workflow principale senza limiti di frequenza

Esegui il workflow principale per richiamare i workflow secondari tramite la coda Cloud Tasks. L'esecuzione dovrebbe richiedere circa 10 secondi.

Console

  1. Nella console Google Cloud , vai alla pagina Workflows:

    Vai a Flussi di lavoro

  2. Nella pagina Flussi di lavoro, fai clic sul workflow workflow-parent per accedere alla relativa pagina dei dettagli.

  3. Nella pagina Dettagli workflow, fai clic su Esegui.

  4. Fai di nuovo clic su Esegui.

  5. Mentre il workflow principale è in esecuzione, torna alla pagina Workflow e fai clic sul workflow workflow-child per accedere alla pagina dei dettagli.

  6. Fai clic sulla scheda Esecuzioni.

    Dovresti vedere le esecuzioni del flusso di lavoro secondario, eseguite all'incirca nello stesso momento, in modo simile a quanto segue:

    Dettagli delle esecuzioni del flusso di lavoro secondario in esecuzione
nello stesso periodo.

gcloud

  1. Esegui il workflow:

    gcloud workflows run workflow-parent \
         --location=us-central1
  2. Per verificare che sia stata attivata un'esecuzione del workflow, elenca le ultime quattro esecuzioni:

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

    Poiché il numero di esecuzioni (100) è inferiore al limite di concorrenza di Workflows, i risultati dovrebbero essere simili ai seguenti. Potrebbero verificarsi problemi di quota se invii migliaia di esecuzioni contemporaneamente.

    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: 

Hai creato ed eseguito il deployment di un workflow che richiama 100 iterazioni del workflow secondario.

Esegui il flusso di lavoro principale con le limitazioni di frequenza

Applica un limite di frequenza di un invio al secondo alla coda Cloud Tasks ed esegui il flusso di lavoro principale.

Console

  1. Nella console Google Cloud , vai alla pagina Cloud Tasks:

    Vai a Cloud Tasks

  2. Fai clic su queue-workflow-child, la coda Cloud Tasks che hai creato, e poi su Modifica coda.

  3. Nella sezione Limiti di frequenza per invii di attività, nel campo Invii massimi, digita 1.

  4. Fai clic su Salva.

  5. Vai alla pagina Workflows:

    Vai a Flussi di lavoro

  6. Fai clic sul flusso di lavoro workflow-parent per accedere alla pagina dei dettagli.

  7. Nella pagina Dettagli workflow, fai clic su Esegui.

  8. Fai di nuovo clic su Esegui.

  9. Mentre il workflow principale è in esecuzione, torna alla pagina Workflow e fai clic sul workflow workflow-child per accedere alla pagina dei dettagli.

  10. Fai clic sulla scheda Esecuzioni.

    Dovresti visualizzare le esecuzioni del flusso di lavoro secondario, in esecuzione a una richiesta al secondo, simile alla seguente:

    Dettagli del flusso di lavoro secondario in esecuzione alla richiesta al secondo.

gcloud

  1. Aggiorna la coda Cloud Tasks per applicare un limite di frequenza di un invio al secondo:

    gcloud tasks queues update $QUEUE \
        --max-dispatches-per-second=1 \
        --location=us-central1
  2. Esegui il workflow:

    gcloud workflows run workflow-parent \
       --location=us-central1
  3. Per verificare che sia stata attivata un'esecuzione del workflow, elenca le ultime quattro esecuzioni:

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

    I risultati dovrebbero essere simili ai seguenti, con un flusso di lavoro eseguito al secondo:

    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: 

Hai eseguito il deployment di un workflow che richiama 100 iterazioni del workflow secondario con una velocità di invio di un'esecuzione al secondo.