Muchas apps necesitan procesar en segundo plano fuera del contexto de una solicitud web. En este instructivo, se crea una app web que permite a los usuarios ingresar texto para traducir y, luego, muestra una lista de traducciones anteriores. La traducción se realiza en segundo plano para evitar que se bloquee la solicitud del usuario.
En el siguiente diagrama se ilustra el proceso de solicitud de traducción.
Esta es la secuencia de eventos de cómo funciona la app del instructivo:
- Visita la página web para ver una lista de traducciones anteriores almacenadas en Firestore.
- Ingresa un formulario HTML para solicitar una traducción de texto.
- La solicitud de traducción se publica en Pub/Sub.
- Se activa una función de Cloud Run suscrita a ese tema de Pub/Sub.
- La función de Cloud Run usa Cloud Translation para traducir el texto.
- La función de Cloud Run almacena el resultado en Firestore.
Este instructivo está dirigido a cualquier persona que desee aprender sobre el procesamiento en segundo plano con Google Cloud. No se requiere experiencia previa en el uso de Pub/Sub, Firestore, App Engine o las funciones de Cloud Run. Sin embargo, para comprender el código completo, resulta útil contar con cierta experiencia en Go, JavaScript y HTML.
Objetivos
- Comprender y también implementar una función de Cloud Run
- Comprender y también implementar una app de App Engine
- Probar la app
Costos
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.
Cuando termines las tareas que se describen en este documento, puedes evitar que se te siga facturando eliminando los recursos que has creado. Para obtener más información, consulta la sección Limpiar.
Antes de comenzar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Firestore, Cloud Run functions, Pub/Sub, and Cloud Translation APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator
(
roles/resourcemanager.projectCreator
), which contains theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Firestore, Cloud Run functions, Pub/Sub, and Cloud Translation APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin
), which contains theserviceusage.services.enable
permission. Learn how to grant roles. -
En la consola de Google Cloud, abre la app en Cloud Shell.
Cloud Shell brinda acceso de línea de comandos a los recursos en la nube directamente desde el navegador. Abre Cloud Shell en el navegador y haz clic en Continuar para descargar el código de muestra y pasar al directorio de la app.
-
En Cloud Shell, configura la herramienta de
gcloud
para que use tu proyecto de Google Cloud :# Configure gcloud for your project gcloud config set project YOUR_PROJECT_ID
Información sobre la función de Cloud Run
- Primero, la función importa varias dependencias, como Firestore y Translation. También tiene algunos tipos y variables globales.
- Los clientes globales de Firestore y Translation se inicializan para que puedan reutilizarse entre las invocaciones de funciones. De esta manera, no es necesario inicializar a los clientes nuevos en cada invocación de funciones, lo que ralentizaría la ejecución.
- La API de Translation traduce la cadena al idioma que seleccionaste.
-
La función de Cloud Run comienza con la inicialización de los clientes de Firestore y Pub/Sub. Luego, analiza el mensaje de Pub/Sub para captar el texto que se traducirá y el idioma objetivo deseado.
Después la app asigna un nombre único para la solicitud de traducción a fin de garantizar que no se almacenen traducciones duplicadas. Luego, realiza la traducción en una transacción de Firestore para garantizar que, durante las ejecuciones simultáneas, no ejecute la misma traducción dos veces por accidente.
Implementa la función de Cloud Run
En Cloud Shell, en el mismo directorio que el archivo
translate.go
, implementa la función de Cloud Run con un activador de Pub/Sub:gcloud functions deploy Translate --runtime go111 \ --trigger-topic=translate --set-env-vars GOOGLE_CLOUD_PROJECT=YOUR_GOOGLE_CLOUD_PROJECT
En el ejemplo anterior,
YOUR_GOOGLE_CLOUD_PROJECT
es el Google Cloud ID de tu proyecto.
Conoce la app
La app web tiene dos componentes principales:
-
Un servidor HTTP de Go para procesar solicitudes web. El servidor tiene los siguientes dos extremos:
/
: enumera todas las traducciones existentes y un formulario que pueden enviar los usuarios para solicitar traducciones nuevas./request-translation
: los formularios se envían a este extremo, que publica la solicitud en Pub/Sub para que se traduzca de manera asíncrona.
- Una plantilla HTML que el servidor de Go completa con las traducciones existentes.
El servidor HTTP
En el directorio
index
,main.go
primero configura la app y registra los controladores de HTTP:El controlador de índices (
/
) accede a todas las traducciones existentes de Firestore y completa una plantilla HTML con la lista:Para solicitar una traducción nueva, se debe enviar un formulario HTML. El controlador de solicitudes de traducción, registrado en
/request-translation
, analiza el envío del formulario, valida la solicitud y publica un mensaje en Pub/Sub:
La plantilla HTML
La plantilla HTML es la base de la página HTML que se muestra al usuario para que pueda ver las traducciones anteriores y solicitar otras nuevas. El servidor HTTP completa la plantilla con la lista de las traducciones existentes.
-
El elemento
<head>
de la plantilla HTML incluye metadatos, hojas de estilo y JavaScript para la página:La página extrae elementos de JavaScript y CSS de Material Design Lite (MDL). MDL te permite dar un estilo de Material Design a los sitios web.
En la página, se usa JQuery para establecer un controlador de envío de formularios una vez que el documento termina de cargarse. Cuando se envía el formulario de solicitud de traducción, la página realiza una validación mínima para comprobar que el valor no esté vacío y envía una solicitud asíncrona al extremo
/request-translation
.Por último, aparece una barra de notificaciones de MDL para indicar si la solicitud se realizó de forma correcta o si se experimentó un error.
- En el cuerpo HTML de la página, se usa un diseño de MDL y varios componentes de MDL para mostrar una lista de las traducciones y un formulario para solicitar traducciones adicionales:
Compila la app
-
Antes de implementar la app web, debes compilarla para comprobar que no haya ningún problema con la compilación y que funcionen todas las dependencias.
go build -o start ./index
La compilación se realiza de forma correcta si no se imprime nada y se crea un archivo
start
.
Implementa la app web
Puedes usar el entorno estándar de App Engine para compilar y, luego, implementar una app que se ejecute de forma confiable incluso con cargas pesadas y grandes cantidades de datos.
En este instructivo, se usa el entorno estándar de App Engine para implementar el frontend de HTTP.
El app.yaml
configura la app de App Engine:
- Desde el mismo directorio del archivo
app.yaml
, implementa la app en el entorno estándar de App Engine:gcloud app deploy
Prueba la app
Después de implementar la función de Cloud Run y la app de App Engine, solicita una traducción.
-
Para ver la app en el navegador, ingresa la siguiente URL:
https://PROJECT_ID.REGION_ID.r.appspot.com
Reemplaza lo siguiente:
PROJECT_ID
: El Google Cloud ID de tu proyectoREGION_ID
: Un código que App Engine asigna a la app
Hay una página con una lista vacía de traducciones y un formulario para solicitar traducciones nuevas.
- En el campo Texto para traducir, ingresa el texto que desees traducir, por ejemplo,
Hello, World
. - En la lista desplegable, selecciona el idioma al que desees que el texto se traduzca.
- Haga clic en Enviar.
- Para actualizar la página, haz clic en Actualizar refresh. Aparece una fila nueva en la lista de traducciones. Si no ves la traducción, espera unos segundos y vuelve a intentarlo. Si la traducción sigue sin aparecer, consulta la siguiente sección sobre cómo depurar la app.
Depura la app
Si no puedes conectarte a la app de App Engine o no ves las traducciones nuevas, comprueba lo siguiente:
-
Comprueba que los comandos de implementación de
gcloud
se hayan ejecutado de forma correcta y no hayan generado ningún error. Si hubo errores, corrígelos y, luego, vuelve a implementar la función de Cloud Run y la app de App Engine. -
En la consola de Google Cloud, ve a la página Visor de registros.
Ir a la página Visor de registros- En la lista desplegable Recursos seleccionados recientemente, haz clic en Aplicación de GAE y, luego, en Todos los module_id. Verás una lista de las solicitudes de cuando visitaste la app. Si no la ves, asegúrate de haber seleccionado Todos los module_id en la lista desplegable. Si ves mensajes de error impresos en la consola de Google Cloud, comprueba que el código de la app coincida con el código de la sección para comprender la app.
-
En la lista desplegable Últimos recursos seleccionados, haz clic en Función de Cloud Functions y, luego, en Nombres de las funciones. Verás una función para cada traducción solicitada. Si esto no sucede, comprueba que la función de Cloud Run y la app de App Engine usen el mismo tema de Pub/Sub:
- En el archivo
background/index/main.go
, comprueba que la constantetopicName
sea"translate"
. - Cuando implementes la función de Cloud Run, asegúrate de incluir la marca
--trigger-topic=translate
.
- En el archivo
Limpia
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra el proyecto de Google Cloud
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Borra la instancia de App Engine
- In the Google Cloud console, go to the Versions page for App Engine.
- Select the checkbox for the non-default app version that you want to delete.
- Para eliminar la versión de la aplicación, haz clic en Eliminar.
Borra la Cloud Run Function
-
Borra la función de Cloud Run que creaste en este instructivo:
gcloud functions delete Translate
¿Qué sigue?
- Prueba los instructivos de funciones de Cloud Run adicionales.
- Obtén más información sobre App Engine.
- Prueba Cloud Run, que te permite ejecutar contenedores sin estado en un entorno completamente administrado o en tu propio clúster de Google Kubernetes Engine.