Utiliser une file d'attente Cloud Tasks pour mettre en mémoire tampon les exécutions de votre workflow


Ce tutoriel explique comment créer une file d'attente Cloud Tasks pouvant réguler le taux d'exécutions de workflow.

Un nombre maximal d'exécutions de workflow actives peut avoir lieu simultanément. Une fois la limite atteinte, les nouvelles exécutions échouent avec un code d'état HTTP 429 Too many requests. En autorisant une file d'attente Cloud Tasks à exécuter des workflows enfants au taux que vous avez défini, vous pouvez éviter les problèmes liés aux quotas de Workflows et obtenir un meilleur taux d'exécution.

Notez que Cloud Tasks est conçu pour permettre une distribution de type "au moins une fois". Toutefois, Workflows ne garantit pas le traitement "exactement une fois" des requêtes en double depuis Cloud Tasks.

Dans le schéma suivant, un workflow parent appelle des workflows enfants réglementés par une file d'attente Cloud Tasks à laquelle un taux de distribution est appliqué.

Workflow parent qui appelle des itérations d'un workflow enfant via une file d'attente Cloud Tasks

Objectifs

Au cours de ce tutoriel, vous allez :

  1. Créez une file d'attente Cloud Tasks servant d'intermédiaire entre les workflows parents et enfants.
  2. Créez et déployez un workflow enfant qui reçoit les données du workflow parent.
  3. Créez et déployez le workflow parent qui exécute le workflow enfant via la file d'attente Cloud Tasks.
  4. exécuter le workflow parent sans limite de taux de distribution, ce qui appelle des exécutions du workflow enfant ;
  5. Appliquez une limite de distribution à la file d'attente Cloud Tasks et exécutez le workflow parent.
  6. Notez que les workflows enfants sont exécutés au taux défini via la file d'attente Cloud Tasks.

Vous pouvez exécuter les commandes suivantes dans la console Google Cloud, ou à l'aide de Google Cloud CLI dans votre terminal ou dans Cloud Shell.

Coûts

Dans ce document, vous utilisez les composants facturables suivants de Google Cloud :

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Avant de commencer

Les contraintes de sécurité définies par votre organisation peuvent vous empêcher d'effectuer les étapes suivantes. Pour obtenir des informations de dépannage, consultez la page Développer des applications dans un environnement Google Cloud limité.

Console

  1. Connectez-vous à votre compte Google.

    Si vous n'en possédez pas déjà un, vous devez en créer un.

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

    Go to project selector

  3. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  4. Activer les API Cloud Tasks, Compute Engine, and Workflows.

    Activer les API

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

    Go to project selector

  6. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  7. Activer les API Cloud Tasks, Compute Engine, and Workflows.

    Activer les API

  8. Dans la console Google Cloud, accédez à la page IAM pour définir les autorisations du compte de service Compute Engine par défaut.

    Accéder à IAM

    Notez le compte de service Compute Engine par défaut, car vous l'associerez aux workflows de ce tutoriel à des fins de test. Ce compte de service est créé automatiquement après l'activation ou l'utilisation d'un service Google Cloud utilisant Compute Engine, avec le format d'adresse e-mail suivant:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    Remplacez PROJECT_NUMBER par le numéro de votre projet Google Cloud. Vous trouverez le numéro de votre projet sur la page Accueil de la console Google Cloud.

    Pour les environnements de production, nous vous recommandons vivement de créer un compte de service et de lui attribuer un ou plusieurs rôles IAM contenant les autorisations minimales requises et respectant le principe du moindre privilège.

  9. Sélectionnez le compte de service Compute Engine par défaut, puis cliquez sur Modifier le compte principal sur cette ligne.
  10. Dans la boîte de dialogue qui s'affiche, cliquez sur Ajouter un autre rôle et ajoutez les rôles suivants :
    1. Dans la liste Sélectionner un rôle, sélectionnez Workflows > Demandeur de workflows pour que le compte soit autorisé à déclencher l'exécution de votre workflow.
    2. Dans la liste Sélectionner un rôle, sélectionnez Cloud Tasks > Empileur Cloud Tasks pour que le compte soit autorisé à créer des tâches.
  11. Cliquez sur Enregistrer.

gcloud

  1. Connectez-vous à votre compte Google.

    Si vous n'en possédez pas déjà un, vous devez en créer un.

  2. Installez Google Cloud CLI.
  3. Pour initialiser gcloudCLI, exécutez la commande suivante :

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  6. Activer les API Cloud Tasks, Compute Engine, and Workflows :

    gcloud services enable cloudtasks.googleapis.com compute.googleapis.com workflows.googleapis.com
  7. Installez Google Cloud CLI.
  8. Pour initialiser gcloudCLI, exécutez la commande suivante :

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  10. Vérifiez que la facturation est activée pour votre projet Google Cloud.

  11. Activer les API Cloud Tasks, Compute Engine, and Workflows :

    gcloud services enable cloudtasks.googleapis.com compute.googleapis.com workflows.googleapis.com
  12. Notez le compte de service Compute Engine par défaut, car vous l'associerez aux workflows de ce tutoriel à des fins de test. Ce compte de service est créé automatiquement après l'activation ou l'utilisation d'un service Google Cloud utilisant Compute Engine, avec le format d'adresse e-mail suivant:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    Remplacez PROJECT_NUMBER par le numéro de votre projet Google Cloud. Pour trouver le numéro de votre projet, exécutez la commande suivante:

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

    Pour les environnements de production, nous vous recommandons vivement de créer un compte de service et de lui attribuer un ou plusieurs rôles IAM contenant les autorisations minimales requises et respectant le principe du moindre privilège.

  13. Accordez le rôle Demandeur de workflows (roles/workflows.invoker) sur le projet au compte de service Compute Engine par défaut afin qu'il soit autorisé à déclencher l'exécution de votre workflow.

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

    Remplacez les éléments suivants :

    • PROJECT_ID : ID de projet Google Cloud
    • PROJECT_NUMBER: numéro de projet Google Cloud

  14. Accordez le rôle Empileur Cloud Tasks (roles/cloudtasks.enqueuer) sur le projet au compte de service Compute Engine par défaut afin que ce compte soit autorisé à créer des tâches.

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

Créer une file d'attente Cloud Tasks

Créez une file d'attente Cloud Tasks que vous pouvez utiliser dans le workflow parent et qui vous permet de réguler le taux d'exécution du workflow.

Console

  1. Dans la console Google Cloud, accédez à la page Cloud Tasks:

    Accéder à Cloud Tasks

  2. Cliquez sur Créer une file d'attente d'envoi.

  3. Saisissez le nom de la file d'attente, queue-workflow-child.

  4. Dans la liste Région, sélectionnez us-central1 (Iowa).

  5. Cliquez sur Créer.

gcloud

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

Créer et déployer un workflow enfant

Un workflow enfant peut recevoir et traiter les données d'un workflow parent. Créez et déployez un workflow enfant qui:

  • Reçoit iteration en tant qu'argument
  • Mise en veille pendant 10 secondes pour simuler un traitement
  • Renvoie une chaîne en cas d'exécution réussie.

Console

  1. Dans la console Google Cloud, accédez à la page Workflows.

    Accéder à "Workflows"

  2. Cliquez sur  Créer.

  3. Saisissez le nom workflow-child du nouveau workflow.

  4. Dans la liste Région, sélectionnez us-central1 (Iowa).

  5. Dans la liste Compte de service, sélectionnez le compte de service Compute Engine par défaut.

  6. Cliquez sur Suivant.

  7. Dans l'éditeur de workflow, saisissez la définition suivante pour votre workflow:

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

gcloud

  1. Créez un fichier de code source pour votre workflow:

    touch workflow-child.yaml
    
  2. Ouvrez votre fichier de code source dans un éditeur de texte et copiez le workflow suivant dans le fichier.

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - return_message:
            return: ${"Hello world"+iteration}
  3. Déployez le workflow :

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

Créer et déployer le workflow parent

Le workflow parent exécute plusieurs branches du workflow enfant à l'aide d'une boucle for.

  1. Copiez le code source qui définit le workflow parent:

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

    Le workflow comprend les parties suivantes:

    • Mappage utilisé pour attribuer des constantes faisant référence au workflow enfant et au nom de la file d'attente Cloud Tasks. Pour en savoir plus, consultez Maps.

    • Une boucle for exécutée pour appeler le workflow enfant de manière itérative Pour en savoir plus, consultez la section Itération.

    • Étape de workflow qui crée et ajoute un grand nombre de tâches à la file d'attente Cloud Tasks pour exécuter le workflow enfant. Pour en savoir plus, consultez la page Connecteur d'API Cloud Tasks.

  2. Déployez le workflow :

    Console

    1. Dans la console Google Cloud, accédez à la page Workflows:

      Accéder à "Workflows"

    2. Cliquez sur  Créer.

    3. Saisissez le nom workflow-parent du nouveau workflow.

    4. Dans la liste Région, sélectionnez us-central1 (Iowa).

    5. Dans la liste Compte de service, sélectionnez le compte de service Compute Engine par défaut.

    6. Cliquez sur Suivant.

    7. Dans l'éditeur de workflow, collez la définition du workflow parent.

    8. Cliquez sur Déployer.

    gcloud

    1. Créez un fichier de code source pour votre workflow:

      touch workflow-parent.yaml
      
    2. Ouvrez votre fichier de code source dans un éditeur de texte et collez la définition du workflow parent.

    3. Déployez le workflow :

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

Exécuter le workflow parent sans limite de débit

Exécuter le workflow parent pour appeler les workflows enfants via la file d'attente Cloud Tasks Les exécutions doivent prendre environ 10 secondes.

Console

  1. Dans la console Google Cloud, accédez à la page Workflows:

    Accéder à "Workflows"

  2. Sur la page Workflows, cliquez sur le workflow workflow-parent pour accéder à sa page d'informations.

  3. Sur la page Détails du workflow, cliquez sur Exécuter.

  4. Cliquez à nouveau sur Exécuter.

  5. Pendant que le workflow parent est en cours d'exécution, revenez à la page Workflows, puis cliquez sur le workflow workflow-child pour accéder à sa page d'informations.

  6. Cliquez sur l'onglet Exécutions.

    Les exécutions du workflow enfant doivent s'exécuter à peu près au même moment, comme suit:

    Détails des exécutions de workflow enfant exécutées à peu près au même moment.

gcloud

  1. Exécutez le workflow :

    gcloud workflows run workflow-parent \
         --location=us-central1
  2. Pour vérifier qu'une exécution de workflow a été déclenchée, répertoriez les quatre dernières exécutions:

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

    Comme le nombre d'exécutions (100) est inférieur à la limite de simultanéité des workflows, les résultats devraient être semblables à ce qui suit. Des problèmes de quota peuvent survenir si vous envoyez des milliers d'exécutions en même temps.

    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: 

Vous avez créé et déployé un workflow qui appelle 100 itérations du workflow enfant.

Exécuter le workflow parent avec des limites de débit

Appliquez une limite de débit d'une distribution par seconde à la file d'attente Cloud Tasks, puis exécutez le workflow parent.

Console

  1. Dans la console Google Cloud, accédez à la page Cloud Tasks:

    Accéder à Cloud Tasks

  2. Cliquez sur queue-workflow-child, qui correspond à la file d'attente Cloud Tasks que vous avez créée, puis sur Modifier la file d'attente.

  3. Dans la section RateLimits for Task Distribuer (Limites de débit pour les envois de tâches), saisissez 1 dans le champ Nombre maximal d'envois.

  4. Cliquez sur Enregistrer.

  5. Accédez à la page Workflows:

    Accéder à "Workflows"

  6. Cliquez sur le workflow workflow-parent pour accéder à ses détails.

  7. Sur la page Détails du workflow, cliquez sur Exécuter.

  8. Cliquez à nouveau sur Exécuter.

  9. Pendant que le workflow parent est en cours d'exécution, revenez à la page Workflows, puis cliquez sur le workflow workflow-child pour accéder à sa page d'informations.

  10. Cliquez sur l'onglet Exécutions.

    Vous devriez voir les exécutions du workflow enfant, qui s'exécutent à une requête par seconde, comme suit:

    Détails du workflow enfant s'exécutant à la requête par seconde.

gcloud

  1. Mettez à jour la file d'attente Cloud Tasks pour appliquer une limite de débit d'une distribution par seconde:

    gcloud tasks queues update $QUEUE \
        --max-dispatches-per-second=1 \
        --location=us-central1
  2. Exécutez le workflow :

    gcloud workflows run workflow-parent \
       --location=us-central1
    
  3. Pour vérifier qu'une exécution de workflow a été déclenchée, répertoriez les quatre dernières exécutions:

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

    Les résultats devraient ressembler à ce qui suit, avec un workflow exécuté par seconde:

    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: 

Vous avez déployé un workflow qui appelle 100 itérations du workflow enfant avec un taux de distribution d'une exécution par seconde.

Effectuer un nettoyage

Si vous avez créé un projet pour ce tutoriel, supprimez-le. Si vous avez utilisé un projet existant et que vous souhaitez le conserver sans les modifications du présent tutoriel, supprimez les ressources créées pour ce tutoriel.

Supprimer le projet

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

Pour supprimer le projet :

  1. Dans la console Google Cloud, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Supprimer les ressources du tutoriel

Supprimez les workflows et les ressources Cloud Tasks créés dans ce tutoriel:

Console

  • Pour supprimer les flux de travail, procédez comme suit:

    1. Dans la console Google Cloud, accédez à la page Workflows:

      Accéder à "Workflows"

    2. Dans la liste des workflows, cliquez sur un workflow pour accéder à sa page Workflow details (Détails du workflow).

    3. Cliquez sur Supprimer.

    4. Saisissez le nom du workflow, puis cliquez sur Confirm (Confirmer).

  • Pour supprimer la file d'attente Cloud Tasks, procédez comme suit:

    1. Dans la console Google Cloud, accédez à la page Cloud Tasks:

      Accéder à Cloud Tasks

    2. Sélectionnez le nom de la file d'attente que vous souhaitez supprimer, puis cliquez sur Supprimer la file d'attente.

    3. Confirmez l'opération.

gcloud

  • Pour supprimer les workflows, exécutez les commandes suivantes:

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

  • Pour supprimer la file d'attente Cloud Tasks, exécutez la commande suivante:

    gcloud tasks queues delete queue-workflow-child
    

Étapes suivantes