Molte app devono eseguire l'elaborazione in background al di fuori del contesto di una richiesta web. Questo tutorial crea un'app web che consente agli utenti di inserire testo per la traduzione e mostra un elenco di traduzioni precedenti. La traduzione viene eseguita in background per evitare di bloccare la richiesta dell'utente.
Il seguente diagramma illustra il processo di richiesta di traduzione.
Ecco la sequenza degli eventi per come funziona l'app del tutorial:
- Visita la pagina web per visualizzare un elenco di traduzioni precedenti, archiviate in Firestore.
- Richiedi una traduzione del testo inserendo un modulo HTML.
- La richiesta di traduzione viene pubblicata in Pub/Sub.
- Viene attivata una funzione Cloud con sottoscrizione a tale argomento Pub/Sub.
- La funzione Cloud Functions utilizza Cloud Translation per tradurre il testo.
- La funzione Cloud Functions archivia il risultato in Firestore.
Questo tutorial è rivolto a chiunque sia interessato a conoscere l'elaborazione in background con Google Cloud. Non è richiesta alcuna esperienza precedente con Pub/Sub, Firestore, App Engine o Cloud Functions. Tuttavia, per comprendere tutto il codice, è utile avere un po' di esperienza con Python, JavaScript e HTML.
Obiettivi
- Capire ed eseguire il deployment di una funzione Cloud Functions.
- Capire ed eseguire il deployment di un'app App Engine.
- Prova l'app.
Costi
In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi basata sull'utilizzo previsto,
utilizza il Calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.
Prima di iniziare
- 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.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Firestore, Cloud Functions, Pub/Sub, and Cloud Translation APIs.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Firestore, Cloud Functions, Pub/Sub, and Cloud Translation APIs.
-
In Google Cloud Console, apri l'app in Cloud Shell.
Cloud Shell fornisce l'accesso tramite riga di comando alle tue risorse cloud direttamente dal browser. Apri Cloud Shell nel browser e fai clic su Procedi per scaricare il codice di esempio e modificarlo nella directory dell'applicazione.
-
In Cloud Shell, configura lo strumento
gcloud
in modo che utilizzi il progetto Google Cloud:# Configure gcloud for your project gcloud config set project YOUR_PROJECT_ID
Informazioni sulla funzione Cloud Functions
- La funzione inizia importando diverse dipendenze come Firestore e Translation.
- I client globali di Firestore e Translation sono inizializzati, quindi possono essere riutilizzati tra le chiamate di funzione. In questo modo, non devi inizializzare nuovi client per ogni chiamata a una funzione, rallentando l'esecuzione.
- L'API Translation traduce la stringa nella lingua selezionata.
-
La funzione Cloud Functions analizza il messaggio Pub/Sub in modo che il testo venga tradotto e la lingua di destinazione desiderata.
Quindi, la funzione Cloud Functions traduce il testo e lo archivia in Firestore, utilizzando una transazione per assicurarsi che non esistano traduzioni duplicate.
Deployment della funzione Cloud Functions
In Cloud Shell, nella directory
function
, esegui il deployment della funzione Cloud Functions con un trigger Pub/Sub:gcloud functions deploy Translate --runtime=python37 \ --entry-point=translate_message --trigger-topic=translate \ --set-env-vars GOOGLE_CLOUD_PROJECT=YOUR_GOOGLE_CLOUD_PROJECT
dove
YOUR_GOOGLE_CLOUD_PROJECT
è il tuo ID progetto Google Cloud.
Comprendere l'app
Esistono due componenti principali per l'app web:
-
Un server HTTP Python per gestire le richieste web. Il server ha i seguenti due endpoint:
-
/
: elenca tutte le traduzioni esistenti e mostra un modulo che gli utenti possono inviare per richiedere nuove traduzioni. -
/request-translation
: gli invii dei moduli vengono inviati a questo endpoint, il che pubblica la richiesta in Pub/Sub da tradurre in modo asincrono.
-
- Un modello HTML compilato con le traduzioni esistenti dal server Python.
Il server HTTP
Nella directory
app
,main.py
inizia importando le dipendenze, creando un'app Flask, inizializzando i client Firestore e Translation, definendo un elenco delle lingue supportate:Il gestore di indici (
/
) recupera tutte le traduzioni esistenti daFistore e inserisce un modello HTML con l'elenco:Per le nuove traduzioni viene inviato un modulo HTML. Il gestore di traduzione delle richieste, registrato all'indirizzo
/request-translation
, analizza l'invio del modulo, convalida la richiesta e pubblica un messaggio in Pub/Sub:
Il modello HTML
Il modello HTML è la base della pagina HTML mostrata all'utente in modo che possa visualizzare le traduzioni precedenti e richiederne di nuove. Il modello è compilato dal server HTTP con l'elenco delle traduzioni esistenti.
-
L'elemento
<head>
del modello HTML include metadati, fogli di stile e JavaScript per la pagina:La pagina estrae gli asset CSS e JavaScript da Material Design Lite (MDL). MDL ti consente di aggiungere un'aspetto del material design ai tuoi siti web.
La pagina utilizza JQuery per attendere che il documento termini il caricamento e impostare un gestore di invio dei moduli. Ogni volta che viene inviato il modulo di traduzione, la pagina esegue una convalida minima del modulo per verificare che il valore non sia vuoto, quindi invia una richiesta asincrona all'endpoint
/request-translation
.Infine, viene visualizzato uno snackbar MDL che indica se la richiesta è andata a buon fine o se si è verificato un errore.
- Il corpo HTML della pagina utilizza un layout MDL e diversi componenti MDL per mostrare un elenco delle traduzioni e un modulo per richiedere traduzioni aggiuntive:
Deployment dell'applicazione web
Puoi utilizzare l'ambiente standard di App Engine per creare ed eseguire il deployment di un'app che può essere eseguita in modo affidabile con un carico elevato e con grandi quantità di dati.
Questo tutorial utilizza l'ambiente standard di App Engine per il deployment del frontend HTTP.
app.yaml
configura l'app App Engine:
-
Dalla stessa directory del file
app.yaml
, esegui il deployment dell'app nell'ambiente standard di App Engine:gcloud app deploy
Test dell'app
Dopo aver eseguito il deployment dell'app Funzione Cloud e App Engine, prova a richiedere una traduzione.
-
Per visualizzare l'app nel browser,inserisci il seguente URL:
https://PROJECT_ID.REGION_ID.r.appspot.com
Sostituisci quanto segue:
PROJECT_ID
: l'ID del tuo progetto Google CloudREGION_ID
: un codice assegnato da App Engine alla tua app
C'è una pagina con un elenco di traduzioni vuoto e un modulo per richiedere nuove traduzioni.
-
Nel campo Testo da tradurre, inserisci del testo da tradurre, ad esempio
Hello, World
. - Seleziona dall'elenco a discesa una lingua in cui vuoi tradurre il testo.
- Fai clic su Invia.
- Per aggiornare la pagina, fai clic su Aggiorna refresh. Nell'elenco di traduzioni è presente una nuova riga. Se non vedi alcuna traduzione, attendi qualche secondo e riprova. Se non riesci ancora a visualizzare una traduzione, consulta la sezione successiva relativa al debug dell'app.
Esecuzione del debug dell'app
Se non riesci a connetterti all'app App Engine o non vedi nuove traduzioni, verifica quanto segue:
-
Verifica che i comandi di deployment di
gcloud
siano stati completati correttamente e che non abbiano restituito errori. Se si sono verificati errori, correggili e prova a eseguire il deployment della funzione Cloud Functions e di nuovo l'app App Engine. -
In Google Cloud Console, vai alla pagina Visualizzatore log.
Vai alla pagina Visualizzatore log- Nell'elenco a discesa Risorse selezionate di recente, fai clic su Applicazione GAE, quindi su All module_id. Viene visualizzato un elenco di richieste da quando hai visitato la tua app. Se non viene visualizzato un elenco di richieste, verifica di aver selezionato Tutti module_id dall'elenco a discesa. Se vengono visualizzati messaggi di errore stampati in Cloud Console, verifica che il codice dell'app corrisponda al codice nella sezione relativa alla comprensione dell'app.
-
Nell'elenco a discesa Risorse selezionate di recente, fai clic su
Funzione Cloud Functions, quindi su Nome di tutte le funzioni. Viene visualizzata una funzione per ogni traduzione richiesta. In caso contrario, verifica che la funzione Cloud Functions e l'app App Engine utilizzino lo stesso argomento Pub/Sub:
- Nel file
background/main.py
, controlla che l'elementotopic_name
sia"translate"
. - Quando esegui il deployment della funzione Cloud Functions, assicurati di includere il flag
--trigger-topic=translate
.
- Nel file
Esegui la pulizia
Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Elimina il progetto 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.
Elimina l'istanza 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.
- Per eliminare la versione dell'app, fai clic su Elimina.
Elimina la funzione Cloud Functions
-
Elimina la funzione Cloud Functions creata in questo tutorial:
gcloud functions delete Translate
Passaggi successivi
- Prova altri tutorial su Cloud Functions.
- Scopri di più su App Engine.
- Prova Cloud Run, che ti consente di eseguire container stateless in un ambiente completamente gestito o nel tuo cluster Google Kubernetes Engine.