Usar una cola de Cloud Tasks para almacenar en búfer las ejecuciones de tu flujo de trabajo


En este tutorial se explica cómo crear una cola de Cloud Tasks que pueda regular la frecuencia de las ejecuciones de flujos de trabajo.

Hay un número máximo de ejecuciones de flujo de trabajo activas que pueden producirse simultáneamente. Una vez que se agota esta cuota, y si la acumulación de ejecuciones está inhabilitada o se alcanza la cuota de ejecuciones acumuladas, las nuevas ejecuciones fallarán y se devolverá el código de estado HTTP 429 Too many requests. Si habilitas una cola de Cloud Tasks para que ejecute flujos de trabajo secundarios a la frecuencia que definas, puedes evitar problemas relacionados con las cuotas de Workflows y conseguir una mejor frecuencia de ejecución.

Ten en cuenta que Cloud Tasks se ha diseñado para ofrecer una entrega "al menos una vez". Sin embargo, Workflows no garantiza el procesamiento exacto de las solicitudes duplicadas de Cloud Tasks.

En el siguiente diagrama, un flujo de trabajo principal invoca flujos de trabajo secundarios regulados por una cola de Cloud Tasks a la que se le ha aplicado una tasa de envío.

Flujo de trabajo principal que invoca iteraciones de un flujo de trabajo secundario a través de la cola de Cloud Tasks

Objetivos

En este tutorial, aprenderás a hacer lo siguiente:

  1. Crea una cola de Cloud Tasks que actúe como intermediaria entre los flujos de trabajo principal y secundario.
  2. Crea y despliega un flujo de trabajo secundario que reciba datos del flujo de trabajo principal.
  3. Crea y despliega el flujo de trabajo principal que ejecuta el flujo de trabajo secundario a través de la cola de Cloud Tasks.
  4. Ejecuta el flujo de trabajo principal sin límite de frecuencia de envío, lo que invoca ejecuciones del flujo de trabajo secundario.
  5. Aplica un límite de envío a la cola de Cloud Tasks y ejecuta el flujo de trabajo principal.
  6. Observa que los flujos de trabajo secundarios se ejecutan al ritmo definido en la cola de Cloud Tasks.

Puedes ejecutar los siguientes comandos en la Google Cloud consola o mediante la CLI de Google Cloud en tu terminal o en Cloud Shell.

Costes

En este documento, se utilizan los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costes basada en el uso previsto, utiliza la calculadora de precios.

Los usuarios nuevos Google Cloud pueden disfrutar de una prueba gratuita.

Antes de empezar

Es posible que las restricciones de seguridad definidas por tu organización te impidan completar los siguientes pasos. Para obtener información sobre cómo solucionar problemas, consulta el artículo Desarrollar aplicaciones en un entorno limitado Google Cloud .

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 Cloud Tasks, Compute Engine, and Workflows APIs.

    Enable the APIs

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

    Go to project selector

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

  7. Enable the Cloud Tasks, Compute Engine, and Workflows APIs.

    Enable the APIs

  8. En la consola, ve a la página IAM para definir los permisos de la cuenta de servicio predeterminada de Compute Engine. Google Cloud

    Ir a IAM

    Anota la cuenta de servicio predeterminada de Compute Engine, ya que la asociarás a los flujos de trabajo de este tutorial con fines de prueba. Esta cuenta de servicio se crea automáticamente después de habilitar o usar un servicio de Google Cloud que utiliza Compute Engine y tiene el siguiente formato de correo:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    Sustituye PROJECT_NUMBER por elGoogle Cloud número de tu proyecto. Puedes encontrar el número de tu proyecto en la página Bienvenido de la consola de Google Cloud .

    En los entornos de producción, te recomendamos que crees una cuenta de servicio y le asignes uno o varios roles de IAM que contengan los permisos mínimos necesarios y que sigas el principio de privilegio mínimo.

  9. Selecciona la cuenta de servicio predeterminada de Compute Engine y, en esa fila, haz clic en Editar principal.
  10. En el cuadro de diálogo que aparece, haz clic en Añadir otro rol y añade los siguientes roles:
    1. En la lista Seleccionar un rol, selecciona Workflows > Workflows Invoker para que la cuenta tenga permiso para activar la ejecución del flujo de trabajo.
    2. En la lista Seleccionar un rol, selecciona Cloud Tasks > Cloud Tasks Enqueuer para que la cuenta tenga permiso para crear tareas.
  11. Haz clic en Guardar.

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 Cloud Tasks, Compute Engine, and Workflows APIs.

    Enable the APIs

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

    Go to project selector

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

  7. Enable the Cloud Tasks, Compute Engine, and Workflows APIs.

    Enable the APIs

  8. Anota la cuenta de servicio predeterminada de Compute Engine, ya que la asociarás a los flujos de trabajo de este tutorial con fines de prueba. Esta cuenta de servicio se crea automáticamente después de habilitar o usar un servicio de Google Cloud que utiliza Compute Engine y tiene el siguiente formato de correo:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com

    Sustituye PROJECT_NUMBER por elGoogle Cloud número de tu proyecto. Para encontrar el número de tu proyecto, ejecuta el siguiente comando:

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

    En los entornos de producción, te recomendamos que crees una cuenta de servicio y le asignes uno o varios roles de IAM que contengan los permisos mínimos necesarios y que sigas el principio de privilegio mínimo.

  9. Concede el rol de invocador de Workflows (roles/workflows.invoker) en el proyecto a la cuenta de servicio predeterminada de Compute Engine para que la cuenta tenga permiso para activar la ejecución del flujo de trabajo.

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

    Haz los cambios siguientes:

    • PROJECT_ID: el ID del proyecto Google Cloud
    • PROJECT_NUMBER: el Google Cloud número de proyecto

  10. Asigna el rol Encolador de Cloud Tasks (roles/cloudtasks.enqueuer) en el proyecto a la cuenta de servicio predeterminada de Compute Engine para que la cuenta tenga permiso para crear tareas.

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

Crear una cola de Cloud Tasks

Crea una cola de Cloud Tasks que puedas usar en el flujo de trabajo principal y que te permita regular la frecuencia de las ejecuciones del flujo de trabajo.

Consola

  1. En la Google Cloud consola, ve a la página Cloud Tasks:

    Ir a Cloud Tasks

  2. Haz clic en Crear cola push.

  3. Introduce el nombre de la cola queue-workflow-child.

  4. En la lista Región, selecciona us-central1 (Iowa).

  5. Haz clic en Crear.

gcloud

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

Crear y desplegar un flujo de trabajo secundario

Un flujo de trabajo secundario puede recibir y procesar datos de un flujo de trabajo principal. Crea y despliega un flujo de trabajo secundario que haga lo siguiente:

  • Recibe un iteration como argumento
  • Duerme durante 10 segundos para simular algún procesamiento
  • Devuelve una cadena si la ejecución se realiza correctamente.

Consola

  1. En la Google Cloud consola, ve a la página Flujos de trabajo.

    Ve a Workflows

  2. Haz clic en Crear.

  3. Introduce el nombre workflow-child para el nuevo flujo de trabajo.

  4. En la lista Región, selecciona us-central1 (Iowa).

  5. En la lista Cuenta de servicio, selecciona Cuenta de servicio predeterminada de Compute Engine.

  6. Haz clic en Siguiente.

  7. En el editor del flujo de trabajo, introduce la siguiente definición para tu flujo de trabajo:

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

gcloud

  1. Crea un archivo de código fuente para tu flujo de trabajo:

    touch workflow-child.yaml
  2. Abre el archivo de código fuente en un editor de texto y copia el siguiente flujo de trabajo en el archivo.

    main:
      params: [args]
      steps:
        - init:
            assign:
              - iteration : ${args.iteration}
        - wait:
            call: sys.sleep
            args:
                seconds: 10
        - return_message:
            return: ${"Hello world"+iteration}
  3. Despliega el flujo de trabajo:

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

Crear y desplegar el flujo de trabajo principal

El flujo de trabajo principal ejecuta varias ramas del flujo de trabajo secundario mediante un bucle for.

  1. Copia el código fuente que define el flujo de trabajo principal:

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

    El flujo de trabajo consta de las siguientes partes:

    • Mapa que se usa para asignar constantes que hacen referencia al flujo de trabajo secundario y al nombre de la cola de Cloud Tasks. Para obtener más información, consulta Maps.

    • Un bucle for que se ejecuta para invocar el flujo de trabajo secundario de forma iterativa. Para obtener más información, consulta Iteración.

    • Un paso de flujo de trabajo que crea y añade un gran número de tareas a la cola de Cloud Tasks para ejecutar el flujo de trabajo secundario. Para obtener más información, consulta el artículo sobre el conector de la API Cloud Tasks.

  2. Despliega el flujo de trabajo:

    Consola

    1. En la Google Cloud consola, ve a la página Flujos de trabajo:

      Ve a Workflows

    2. Haz clic en Crear.

    3. Introduce el nombre workflow-parent para el nuevo flujo de trabajo.

    4. En la lista Región, selecciona us-central1 (Iowa).

    5. En la lista Cuenta de servicio, selecciona Cuenta de servicio predeterminada de Compute Engine.

    6. Haz clic en Siguiente.

    7. En el editor de flujos de trabajo, pega la definición del flujo de trabajo principal.

    8. Haz clic en Desplegar.

    gcloud

    1. Crea un archivo de código fuente para tu flujo de trabajo:

      touch workflow-parent.yaml
    2. Abre el archivo de código fuente en un editor de texto y pega la definición del flujo de trabajo principal.

    3. Despliega el flujo de trabajo:

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

Ejecutar el flujo de trabajo principal sin límites de frecuencia

Ejecuta el flujo de trabajo principal para invocar los flujos de trabajo secundarios a través de la cola de Cloud Tasks. Las ejecuciones deberían tardar unos 10 segundos en completarse.

Consola

  1. En la Google Cloud consola, ve a la página Flujos de trabajo:

    Ve a Workflows

  2. En la página Workflows (Flujos de trabajo), haz clic en el flujo de trabajo workflow-parent para ir a su página de detalles.

  3. En la página Detalles del flujo de trabajo, haz clic en Ejecutar.

  4. Vuelve a hacer clic en Ejecutar.

  5. Mientras se ejecuta el flujo de trabajo principal, vuelve a la página Flujos de trabajo y haz clic en el flujo de trabajo workflow-child para ir a su página de detalles.

  6. Haz clic en la pestaña Ejecuciones.

    Deberías ver ejecuciones del flujo de trabajo secundario que se ejecutan aproximadamente al mismo tiempo, como en el siguiente ejemplo:

    Detalles de las ejecuciones del flujo de trabajo secundario que se ejecutan aproximadamente al mismo tiempo.

gcloud

  1. Ejecuta el flujo de trabajo:

    gcloud workflows run workflow-parent \
         --location=us-central1
  2. Para verificar que se ha activado una ejecución de flujo de trabajo, enumera las cuatro últimas ejecuciones:

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

    Como el número de ejecuciones (100) es inferior al límite de simultaneidad de los flujos de trabajo, los resultados deberían ser similares a los siguientes. Pueden surgir problemas de cuota si envías miles de ejecuciones al mismo tiempo.

    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: 

Has creado y desplegado un flujo de trabajo que invoca 100 iteraciones del flujo de trabajo secundario.

Ejecutar el flujo de trabajo principal con límites de velocidad

Aplica un límite de frecuencia de un envío por segundo a la cola de Cloud Tasks y, a continuación, ejecuta el flujo de trabajo principal.

Consola

  1. En la Google Cloud consola, ve a la página Cloud Tasks:

    Ir a Cloud Tasks

  2. Haz clic en queue-workflow-child, la cola de Cloud Tasks que has creado, y luego en Editar cola.

  3. En la sección Límites de frecuencia de envíos de tareas, en el campo Máximo de envíos, escribe 1.

  4. Haz clic en Guardar.

  5. Ve a la página Workflows:

    Ve a Workflows

  6. Haz clic en el flujo de trabajo principal para ir a su página de detalles.

  7. En la página Detalles del flujo de trabajo, haz clic en Ejecutar.

  8. Vuelve a hacer clic en Ejecutar.

  9. Mientras se ejecuta el flujo de trabajo principal, vuelve a la página Flujos de trabajo y haz clic en el flujo de trabajo workflow-child para ir a su página de detalles.

  10. Haz clic en la pestaña Ejecuciones.

    Deberías ver ejecuciones del flujo de trabajo secundario, que se ejecutan a una solicitud por segundo, como en el siguiente ejemplo:

    Detalles del flujo de trabajo secundario que se ejecuta por solicitud por segundo.

gcloud

  1. Actualiza la cola de Cloud Tasks para aplicar un límite de una distribución por segundo:

    gcloud tasks queues update $QUEUE \
        --max-dispatches-per-second=1 \
        --location=us-central1
  2. Ejecuta el flujo de trabajo:

    gcloud workflows run workflow-parent \
       --location=us-central1
  3. Para verificar que se ha activado una ejecución de flujo de trabajo, enumera las cuatro últimas ejecuciones:

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

    Los resultados deberían ser similares a los siguientes, con un flujo de trabajo ejecutado 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: 

Has desplegado correctamente un flujo de trabajo que invoca 100 iteraciones del flujo de trabajo secundario con una tasa de envío de una ejecución por segundo.

Limpieza

Si has creado un proyecto para este tutorial, elimínalo. Si has usado un proyecto y quieres conservarlo sin los cambios que se han añadido en este tutorial, elimina los recursos creados para el tutorial.

Eliminar el proyecto

La forma más fácil de evitar que te cobren es eliminar el proyecto que has creado para el tutorial.

Para ello, sigue las instrucciones que aparecen a continuación:

  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.

Eliminar recursos del tutorial

Elimina los recursos de Workflows y Cloud Tasks que has creado en este tutorial:

Consola

  • Para eliminar los flujos de trabajo, sigue estos pasos:

    1. En la Google Cloud consola, ve a la página Flujos de trabajo:

      Ve a Workflows

    2. En la lista de flujos de trabajo, haz clic en uno para ir a la página Detalles del flujo de trabajo.

    3. Haz clic en Eliminar.

    4. Escribe el nombre del flujo de trabajo y haz clic en Confirmar.

  • Para eliminar la cola de Cloud Tasks, sigue estos pasos:

    1. En la Google Cloud consola, ve a la página Cloud Tasks:

      Ir a Cloud Tasks

    2. Selecciona el nombre de la cola que quieras eliminar y haz clic en Eliminar cola.

    3. Confirma la acción.

gcloud

  • Para eliminar los flujos de trabajo, ejecuta estos comandos:

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

  • Para eliminar la cola de Cloud Tasks, ejecuta este comando:

    gcloud tasks queues delete queue-workflow-child

Siguientes pasos