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


En este instructivo, se muestra cómo crear una cola de Cloud Tasks que puede regular la velocidad de ejecución del flujo de trabajo.

Existe una cantidad máxima de ejecuciones activas de flujos de trabajo que pueden ocurrir en simultáneo. Después de que se alcanza el límite, las ejecuciones nuevas fallan con un código de estado HTTP 429 Too many requests. Si habilitas una cola de Cloud Tasks para ejecutar flujos de trabajo secundarios a la velocidad que definas, puedes evitar problemas relacionados con las cuotas de Workflows y lograr una mejor frecuencia de ejecución.

En el siguiente diagrama, un flujo de trabajo superior invoca flujos de trabajo secundarios que están regulados por una cola de Cloud Tasks que tiene aplicada una frecuencia de envío.

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

Objetivos

En este instructivo, realizarás las siguientes acciones:

  1. Crear una cola de Cloud Tasks que actúe como intermediaria entre los flujos de trabajo superiores y secundarios
  2. Crear e implementar un flujo de trabajo secundario que reciba datos del flujo de trabajo superior
  3. Crea e implementa el flujo de trabajo superior que ejecuta el flujo de trabajo secundario a través de la cola de Cloud Tasks.
  4. Ejecutar el flujo de trabajo superior sin un límite de frecuencia de envío, que invoca ejecuciones del flujo de trabajo secundario
  5. Aplicar un límite de envío a la cola de Cloud Tasks y ejecutar el flujo de trabajo superior
  6. Observa que los flujos de trabajo secundarios se ejecutan a la velocidad definida a través de la cola de Cloud Tasks.

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

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Antes de comenzar

Es posible que las restricciones de seguridad que define tu organización no te permitan completar los siguientes pasos. Para obtener información sobre la solución de problemas, consulta Desarrolla aplicaciones en un entorno de Google Cloud restringido.

Console

  1. Accede a tu cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Habilita las API de Cloud Tasks, Compute Engine y Workflows.

    Habilita las API

  5. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  6. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  7. Habilita las API de Cloud Tasks, Compute Engine y Workflows.

    Habilita las API

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

    Ir a IAM

    La cuenta de servicio predeterminada de Compute Engine se crea automáticamente después de habilitar o usar un servicio de Google Cloud que usa Compute Engine.

    Para fines de prueba, puedes conectar esta cuenta de servicio a un flujo de trabajo para representar su identidad. Ten en cuenta el formato de correo electrónico que usarás cuando crees un activador:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    Reemplaza PROJECT_NUMBER por el número de tu proyecto de Google Cloud. Puedes encontrar el número de tu proyecto en la página Te damos la bienvenida de la consola de Google Cloud.

  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 Agregar otro rol y agrega los siguientes roles:
    1. En la lista Selecciona un rol, elige Flujos de trabajo > Invocador de flujos de trabajo para que la cuenta tenga permiso para activar la ejecución de tu flujo de trabajo.
    2. En la lista Selecciona un rol, elige Cloud Tasks > Agregador de elementos en cola de Cloud Tasks para que la cuenta tenga permiso para crear tareas.
  11. Haz clic en Guardar.

gcloud

  1. Accede a tu cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. Instala Google Cloud CLI.
  3. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  4. Crea o selecciona un proyecto de Google Cloud.

    • Crea un proyecto de Google Cloud:

      gcloud projects create PROJECT_ID

      Reemplaza PROJECT_ID por un nombre para el proyecto de Google Cloud que estás creando.

    • Selecciona el proyecto de Google Cloud que creaste:

      gcloud config set project PROJECT_ID

      Reemplaza PROJECT_ID por el nombre del proyecto de Google Cloud.

  5. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  6. Habilita las APIs de Cloud Tasks, Compute Engine y Workflows:

    gcloud services enable cloudtasks.googleapis.com compute.googleapis.com workflows.googleapis.com
  7. Instala Google Cloud CLI.
  8. Para inicializar la CLI de gcloud, ejecuta el siguiente comando:

    gcloud init
  9. Crea o selecciona un proyecto de Google Cloud.

    • Crea un proyecto de Google Cloud:

      gcloud projects create PROJECT_ID

      Reemplaza PROJECT_ID por un nombre para el proyecto de Google Cloud que estás creando.

    • Selecciona el proyecto de Google Cloud que creaste:

      gcloud config set project PROJECT_ID

      Reemplaza PROJECT_ID por el nombre del proyecto de Google Cloud.

  10. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  11. Habilita las APIs de Cloud Tasks, Compute Engine y Workflows:

    gcloud services enable cloudtasks.googleapis.com compute.googleapis.com workflows.googleapis.com
  12. La cuenta de servicio predeterminada de Compute Engine se crea automáticamente después de habilitar o usar un servicio de Google Cloud que utiliza Compute Engine.

    Para fines de prueba, puedes conectar esta cuenta de servicio a un flujo de trabajo para representar su identidad. Ten en cuenta el formato de correo electrónico que usarás cuando crees un activador:

    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    

    Reemplaza PROJECT_NUMBER por el número de tu proyecto de Google Cloud. Para encontrar el número del proyecto, ejecuta el siguiente comando:

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'
  13. Otorga la función de invocador de flujos de trabajo (roles/workflows.invoker) en el proyecto a la cuenta de servicio predeterminada de Compute Engine de modo 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

    Reemplaza lo siguiente:

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

  14. Otorga el rol de agregado en cola 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

Crea una cola de Cloud Tasks

Crea una cola de Cloud Tasks que puedas usar en el flujo de trabajo superior y que te permita regular la frecuencia de ejecución de los flujos de trabajo.

Console

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

    Ir a Cloud Tasks

  2. Haz clic en Crear lista de aplicaciones en cola.

  3. Ingresa 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

Crea e implementa un flujo de trabajo secundario

Un flujo de trabajo secundario puede recibir y procesar datos de un flujo de trabajo superior. Crea e implementa un flujo de trabajo secundario que realice las siguientes acciones:

  • Recibe un elemento iteration como argumento.
  • Se suspende durante 10 segundos para simular procesamiento.
  • Devuelve una cadena cuando se ejecuta correctamente

Console

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

    Ir a Workflows

  2. Haz clic en  Crear.

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

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

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

  6. Haz clic en Siguiente.

  7. En el editor de flujo de trabajo, ingresa 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 Implementar.

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. Implementa el flujo de trabajo:

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

Crea e implementa el flujo de trabajo superior

El flujo de trabajo superior ejecuta varias ramas del flujo de trabajo secundario con un bucle for.

  1. Copia el código fuente para la definición de flujo de trabajo. Consta de las siguientes partes:

    1. Es un 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.

      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"
    2. 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.

      - enqueue_tasks_to_execute_child_workflow:
          for:
            value: iteration
            range: [1, 100]
            steps:
                - iterate:
                    assign:
                      - data:
                          iteration: ${iteration}
                      - exec:
                          # Need to wrap into argument for Workflows args.
                          argument: ${json.encode_to_string(data)}
    3. Un paso del flujo de trabajo que crea y agrega una gran cantidad de tareas a la cola de Cloud Tasks para ejecutar el flujo de trabajo secundario. Para obtener más información, consulta el conector de la API de Cloud Tasks.

      - 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"}
  2. Implementa el flujo de trabajo:

    Console

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

      Ir a Workflows

    2. Haz clic en  Crear.

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

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

    5. En la lista Cuenta de servicio, selecciona la 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 superior.

    8. Haz clic en Implementar.

    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 superior.

    3. Implementa el flujo de trabajo:

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

Ejecuta el flujo de trabajo superior sin límites de frecuencia

Ejecuta el flujo de trabajo superior 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.

Console

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

    Ir a Workflows

  2. En la página Flujos de trabajo, haz clic en el flujo de trabajo flujo de trabajo superior para ir a su página de detalles.

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

  4. Haz clic de nuevo en Ejecutar.

  5. Mientras se ejecuta el flujo de trabajo superior, regresa a la página Flujos de trabajo y haz clic en el flujo de trabajo flujo de trabajo-secundario 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 casi al mismo tiempo, de manera similar a lo siguiente:

    Detalles de las ejecuciones de flujos de trabajo secundarios que se ejecutan casi al mismo tiempo

gcloud

  1. Ejecuta el flujo de trabajo:

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

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

    Debido a que la cantidad de ejecuciones (100 ) es inferior al límite de simultaneidad de Workflows, 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: 

Creaste e implementaste un flujo de trabajo que invoca 100 iteraciones del flujo de trabajo secundario.

Ejecuta el flujo de trabajo superior con límites de frecuencia

Aplica un límite de frecuencia de un envío por segundo a la cola de Cloud Tasks y, luego, ejecuta el flujo de trabajo superior.

Console

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

    Ir a Cloud Tasks

  2. Haz clic en queue-workflow-child, en la cola de Cloud Tasks que creaste, y haz clic en Editar cola.

  3. En la sección Límites de frecuencia de los 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:

    Ir a Workflows

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

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

  8. Haz clic de nuevo en Ejecutar.

  9. Mientras se ejecuta el flujo de trabajo superior, regresa a la página Flujos de trabajo y haz clic en el flujo de trabajo flujo de trabajo-secundario 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, de manera similar a la siguiente:

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

gcloud

  1. Actualiza la cola de Cloud Tasks para aplicar un límite de frecuencia de un envío 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 activó una ejecución de flujo de trabajo, enumera las últimas cuatro 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: 

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

Limpia

Si creaste un proyecto nuevo para este instructivo, bórralo. Si usaste un proyecto existente y deseas conservarlo sin los cambios que se agregaron en este instructivo, borra los recursos creados para el instructivo.

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, haz lo siguiente:

  1. En la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

Elimina recursos de instructivos

Borra los flujos de trabajo y los recursos de Cloud Tasks que se crearon en este instructivo:

Console

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

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

      Ir a Workflows

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

    3. Haz clic en Borrar.

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

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

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

      Ir a Cloud Tasks

    2. Selecciona el nombre de la cola que deseas borrar y haz clic en Borrar cola.

    3. Confirma la acción.

gcloud

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

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

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

    gcloud tasks queues delete queue-workflow-child
    

¿Qué sigue?