Al finalizar el tutorial el estudiante estará en capacidad de:
En particular se utilizarán los siguientes recursos:
La utilización de servicios de colas permite ejecutar trabajos que sean independientes y que no requieran una respuesta inmediata al cliente. Estos esquemas permiten la ejecución de tareas asíncronas que serán ejecutadas de manera secuencial por uno o varios consumidores que se encargan de procesarla.
En particular el servicio de Cloud Task permite la asociación de dos tipos de trabajadores a los que se les envía las tareas. El primero es un App Engine, para este caso es necesario contar con una aplicación en App Engine para que procese el mensaje cuando este sea notificado. La segunda es una petición HTTP, tanto para servicios internos como servicios externos, se puede configurar una petición a la que se mandará la solicitud cuando se agregué una tarea a la cola. En cualquiera de los casos, el trabajador deberá notificar el éxito de la ejecución de la tarea una vez que esta se complete de manera exitosa. Esto se hace a través de un código HTTP 2xx enviado por el trabajador. A continuación se ilustra este proceso:
Imagen de (Cloud Tasks overview | Cloud Tasks Documentation | Google Cloud, s. f.)
Una de las principales ventajas de la utilización del servicio es que se encarga de las partes más complejas del proceso como son: la latencia para el usuario, los errores del servidor, el consumo de recursos y la política de reintentos.
Si desea ver más información puede remitirse al siguiente enlace: Descripción general de Cloud Tasks
El código de la aplicación lo encuentra en el siguiente repositorio de GitHub gcp-cloud-task
En el repositorio va a encontrar dos funciones.
La primera se encuentra en la carpeta "function-consumir-http" y cuenta con la siguiente definición del servicio.
/ | |
Descripción | Retorna la entrada recibida por parámetro y deja un registro en la operación |
Método | POST |
Retorno | application/json, con la información recibirá en el body. |
Body de la petición | application/json, no necesita una entrada concreta o específica. |
La segunda se encuentra en la carpeta "function-producir-http" y cuenta con la siguiente definición del servicio.
Endpoint | / |
Descripción | Retorna la información de una tarea creada. |
Método | POST |
Retorno | application/json. Objeto con la información básica de la tarea creada |
Body de la petición | application/json, no necesita una entrada concreta o específica. |
Para el ejercicio se necesitaran dos funciones. La primera función se ejecutará con una petición HTTP de tipo POST con el contenido de un mensaje, que enviará una tarea a una cola de mensajes para procesar posteriormente. Una vez cargado el mensaje, el servicio de Cloud Task se encargará de notificar a una segunda función para que reciba el mensaje y muestre su contenido en el log de la aplicación. A continuación se muestra el diagrama de secuencia del proceso.
Cloud Tasks nos permite implementar el patrón de productor/consumidor y tener control sobre los inicios de ejecución de las tareas y las políticas de reintento en caso de fallas. En particular podemos agendar una tarea para ser ejecutada hasta 30 días en el futuro.
En la carpeta function-consumir-http encontrará un archivo main.py que contiene una función consumir. Como puede observar, esta función no hace uso de librerías para consumir los mensajes de la cola, lo que indica que el llamado al consumidor se delegará a la plataforma y el desarrollador solo debe enfocarse en la construcción de la lógica de la aplicación.
En la carpeta function-producir-http encontrará un archivo main.py el cual contiene la función producir. Esta función hace uso de la librería google-cloud-tasks para crear la conexión con la cola de tareas (línea 22), construye una tarea con la información que deseamos enviar (línea 25) y realiza la publicación de la tarea en la cola de tareas (línea 36).
Debe verificar que el proyecto objetivo se encuentra seleccionado tanto el de la consola de google cloud como en la consola local de su computador.
En google cloud asegúrese de tener seleccionado el proyecto al entrar a console.cloud.google.com
En la terminal ejecute el siguiente comando para verificar que el ID de proyecto corresponde con el se la consola de google cloud:
user@192 ~ % gcloud config get-value project
Para poder realizar el consumo del servicio de Cloud Task es necesario habilitar al proyecto para que pueda consumir el servicio. Para ello realizaremos la creación de una cuenta de servicio para generar la key que utilizaremos para conectarnos. Para ello ejecutamos el siguiente comando para crear la cuenta de servicio que será utilizada por la función:
user@192 ~ % gcloud iam service-accounts create misw-das-productor --description="Cuenta de servicio para el tutorial de cloud task" --display-name="Productor tutorial cloud task"
A continuación se explica la configuración utilizada en la cuenta del servicio
Parámetro | Utilidad |
| Este valor hace referencia al nombre que le asignaremos a la cuenta y con el que la referenciamos para posteriores usos |
| Nos permite agregar información descriptiva sobre la cuenta que nos ayude a aclarar el uso de la misma tanto para nosotros como para terceros |
| Nombre con el que se visualizará la cuenta cuando se liste desde la consola de GCP |
Si la ejecución del comando es exitosa, deberá observar el siguiente mensaje en la consola de comandos:
Created service account [misw-das-productor].
Una vez tengamos la cuenta creada, deberemos asignar los permisos que le otorgamos a esta. Para este tutorial le asignaremos los permisos necesarios para la creación de las tareas en el servicio.
user@192 ~ % gcloud projects add-iam-policy-binding <id_proyecto> --member="serviceAccount:misw-das-productor@<id_proyecto>.iam.gserviceaccount.com" --role="roles/cloudtasks.enqueuer"
A continuación se aclara la información del comando ejecutado:
Parámetro | Utilidad |
| Nos indica el nombre de la cuenta a la que se le asignan los permisos. Puede ser un usuario, un grupo, una cuenta de servicio o un dominio. En nuestro caso, se lo asignaremos a la cuenta creada en el paso anterior. |
| Esto nos permite establecer qué permisos o funciones le asignaremos a la cuenta. En nuestro caso le asignaremos el permiso de encolar para los servicios de Cloud Task. |
Debemos crear la cola de tareas que se utilizará para comunicar las dos funciones. Ejecute el siguiente comando en la terminal:
user@192 ~ % gcloud tasks queues create cola-cloud-task-tutorial --location=us-central1
Una vez realizado esto, se nos mostrará la página de administración de la cola que acabamos de crear. En este panel puede realizar el seguimiento a la ejecución de las tareas.
Si selecciona la cola, podrá observar el panel de administración donde encontrará los registros de las operaciones, la visualización de las tareas y la configuración que con la que se creó. Si gusta puede explotar estas funcionalidades.
Para la ejecución de las pruebas necesitaremos crear dos funciones Cloud Function. La primera es la función que se encargará de encolar las tareas en la cola y la segunda actuará como trabajador.
La primera función que debemos crear es la que actuará de trabajador y será ejecutada. Está función se encargará de recibir la información de la cola y se ejecutará por cada tarea encolada. Cuando esta función se ejecuté dejará en el log de operaciones un evento indicando el llamado y la información recibida en la cola.
Publique la función que está en la carpeta function-consumir-http
con el siguiente comando:
user@192 ~ % gcloud functions deploy funcion-tutorial-consumidor --entry-point consumir --runtime python39 --trigger-http --allow-unauthenticated --memory 128MB --region us-central1 --timeout 60 --min-instances 0 --max-instances 1
La segunda función que debemos crear será la encargada de realizar la inserción de las tareas en la Cloud Task. Para esta función será necesario tener presente que se utilizará la cuenta de servicio creada previamente para poder establecer la conexión con el servicio de Cloud Task y que la configuración necesaria para la definición de la tarea se realizará a través de las variables de entorno.
A continuación se describen las variables de entorno necesarias para el correcto funcionamiento de la función:
Para realizar la publicación, ejecute el siguiente comando:
user@192 ~ % gcloud functions deploy funcion-tutorial-productor --entry-point producir --runtime python39 --trigger-http --allow-unauthenticated --memory 128MB --region us-central1 --timeout 60 --min-instances 0 --max-instances 1 --service-account "misw-das-productor@<id_proyecto>.iam.gserviceaccount.com" --set-env-vars LOCATION_ID=us-central1,PROJECT_ID=<id_proyecto>,QUEUE_ID=cola-cloud-task-tutorial,URL_FUNCTION=https://us-central1-<id_proyecto>.cloudfunctions.net/funcion-tutorial-consumidor
La mayoría de los parámetros de configuración se mostraron en el tutorial "Despliegue de funciones como servicio". Sin embargo, ahora tenemos un parámetro adicional que nos permite configurar la cuenta de acceso para establecer la comunicación con los servicios. Este es el que se debe modificar para establecer la conexión. A continuación se explica el nuevo parámetro.
Parámetro | Utilidad |
| Esto permite establecer la cuenta de servicio de IAM para establecer los permisos que tendrá la función. Para especificar el valor, se debe poner el correo completo de la cuenta de servicio. |
Para poder realizar la prueba de las funciones, deberá importar la colección de Postman que se encuentra en la carpeta collections
que se encuentra dentro del repositorio. Una vez la tenga importada, deberá configurar las variables para que pueda realizar las pruebas.
Para ello iremos a las opciones de la colección que acabamos de importar, seleccionaremos la opción "editar"
Luego en la pestaña "Variables", encontrará dos variables que debe configurar para la realización de la prueba.
Variable | Descripción |
id_project | Se establece el valor del identificador del proyecto en el que se encuentra trabajando y en donde realizó la publicación de las funciones. Recuerde que lo puede obtener en el panel principal del proyecto o ejecutando el comando de validación del proyecto (ver sección Validación del proyecto). |
region | Se debe establecer el valor de la región en donde se encuentra publicada la función. Eso lo puede obtener de función en la pestaña de "Detalles" o directamente del valor configurado en el parámetro |
La primera prueba que se realizará es la verificación del encolamiento de las tareas. Para esto lo primero es detener la cola para que sea posible ver cómo se encolan las tareas. Para ello nos debemos dirigirnos al menú de navegación en la sección "INTEGRACIÓN DE APPS" y en la opción "Cloud Task"
A continuación se nos mostrará todas las colas que tenemos actualmente creadas. Buscaremos la cola que hemos configurado para el ejercicio y la seleccionamos.
Una vez estemos en el panel de administración, seleccionaremos la opción "PAUSAR COLA" que se encuentra en la parte superior.
Una vez seleccionada la opción el estado de la cola va a cambiar a pausado. En este estado la cola es accesible. Es posible insertar tareas nuevas, pero estas no se ejecutarán hasta que la cola se vuelva a poner en funcionamiento.
Ahora debemos realizar la creación de las tareas. Para esto nos dirigiremos a la colección de postman previamente importada y procederemos a realizar varios llamados. Para cada petición ejecutada se mostrará un mensaje en donde indican que la tarea se creó correctamente. Se recomienda crear varias tareas y ponerles un consecutivo para que en la siguiente prueba pueda ver el orden de ejecución y analizar el comportamiento de la orquestación.
Una vez creadas las tareas nos dirigimos al panel de la cola creada y presionamos la opción "ACTUALIZAR" para que podamos ver las tareas, en nuestro caso se crearon cinco tareas.
Para la segunda parte de la prueba nos dirigiremos al panel de administración de la cola y en la parte superior seleccionamos la opción "REANUDAR COLA" y posteriormente seleccionaremos la opción "ACTUALIZAR" en repetidas ocasiones hasta que la cola se vacié.
Posteriormente a esto, nos dirigimos a la opción "Cloud Function" en el menú de navegación y en la lista de funciones disponibles seleccionamos la función que se encarga de ejecutar las tareas de la cola. (Ver Función consumidor). Luego la seleccionamos para entrar al panel de administración.
Una vez nos encontremos en el panel de administración, nos dirigimos a la sección "REGISTROS". Entre los registros debemos poder ver el listado de los llamados a la función y registros informativos generados. En este caso deberemos ver el registro de todas las tareas generadas y deberían encontrarse en el orden generado.
Para la última prueba deberìa dejar la cola encendida y generar las tareas. El comportamiento esperado es que vea la ejecución de la tareas en el log de la función trabajador para ver los llamados de las tareas.
¡Éxitos en el desarrollo del tutorial y nos vemos en una próxima oportunidad!
[1] Cloud Tasks overview | Cloud Tasks Documentation | Google Cloud. (s. f.). Google Cloud. https://cloud.google.com/tasks/docs/dual-overview
[2] Quickstart for Cloud Tasks queues | Cloud Tasks Documentation | Google Cloud. (s. f.). Google Cloud. https://cloud.google.com/tasks/docs/quickstart
[3] HTTP Functions | Cloud Functions Documentation | Google Cloud. (s. f.). Google Cloud. https://cloud.google.com/functions/docs/writing/http