1. Panoramica
La serie di codelab Serverless Migration Station (esercitazioni pratiche e autonome) e i video correlati hanno lo scopo di aiutare gli sviluppatori serverless di Google Cloud a modernizzare le loro applicazioni guidandoli attraverso una o più migrazioni, principalmente abbandonando i servizi legacy. In questo modo, le tue app sono più portatili e hai più opzioni e flessibilità, il che ti consente di integrarti e accedere a una gamma più ampia di prodotti cloud e di eseguire più facilmente l'upgrade alle versioni più recenti del linguaggio. Sebbene inizialmente si concentri sui primi utenti di Cloud, principalmente gli sviluppatori di App Engine (ambiente standard), questa serie è abbastanza ampia da includere altre piattaforme serverless come Cloud Functions e Cloud Run o altrove, se applicabile.
Questo codelab ti insegna a utilizzare le attività push della coda di attività di App Engine nell'app di esempio del codelab del modulo 1. Il post del blog e il video del modulo 7 integrano questo tutorial, fornendo una breve panoramica dei contenuti.
In questo modulo aggiungeremo l'utilizzo delle attività push, per poi eseguire la migrazione di questo utilizzo a Cloud Tasks nel modulo 8 e successivamente a Python 3 e Cloud Datastore nel modulo 9. Gli utenti che utilizzano le code di attività per le attività di pull eseguiranno la migrazione a Cloud Pub/Sub e dovranno fare riferimento ai moduli 18-19.
Imparerai a utilizzare
- Utilizza l'API Task Queue/il servizio integrato di App Engine
- Aggiungi l'utilizzo delle attività push a un'app App Engine NDB Flask Python 2 di base
Che cosa ti serve
- Un progetto Google Cloud con un account di fatturazione Google Cloud attivo.
- Competenze di base di Python
- Conoscenza pratica dei comandi Linux più comuni
- Conoscenza di base dello sviluppo e del deployment di app App Engine
- Un'app App Engine del Modulo 1 funzionante (completa il codelab [consigliato] o copia l'app dal repository)
Sondaggio
Come utilizzerai questo tutorial?
Come valuteresti la tua esperienza con Python?
Come valuti la tua esperienza di utilizzo dei servizi Google Cloud?
2. Sfondo
App Engine Task Queue supporta le attività push e pull. Per migliorare la portabilità delle applicazioni, il team di Google Cloud consiglia di eseguire la migrazione dai servizi integrati legacy come Task Queue ad altri servizi equivalenti autonomi o di terze parti di Cloud.
- Gli utenti delle code di attività push devono eseguire la migrazione a Cloud Tasks.
- Gli utenti delle code di attività pull devono eseguire la migrazione a Cloud Pub/Sub.
La migrazione delle attività di pull è trattata nei moduli 18-19, mentre i moduli 7-9 si concentrano sulla migrazione delle attività di push. Per eseguire la migrazione dalle attività push della coda di attività di App Engine, aggiungi il relativo utilizzo all'app Flask e App Engine NDB esistente risultante dal codelab del modulo 1. In questa app, una nuova visualizzazione di pagina registra una nuova visita e mostra le visite più recenti all'utente. Poiché le visite meno recenti non vengono mai più mostrate e occupano spazio nel datastore, creeremo un'attività push per eliminare automaticamente le visite meno recenti. Nel modulo 8, eseguiremo la migrazione di questa app da Code di attività a Cloud Tasks.
Questo tutorial prevede i seguenti passaggi:
- Configurazione/preparazione
- Aggiorna configurazione
- Modificare il codice dell'applicazione
3. Configurazione/preparazione
Questa sezione spiega come:
- Configura il progetto cloud
- Ottieni l'app di esempio di base
- (R)esegui il deployment e convalida l'app di riferimento
Questi passaggi ti assicurano di iniziare con un codice funzionante.
1. Configura il progetto
Se hai completato il codelab del modulo 1, ti consigliamo di riutilizzare lo stesso progetto (e codice). In alternativa, puoi creare un nuovo progetto o riutilizzarne uno esistente. Assicurati che il progetto abbia un account di fatturazione attivo e che App Engine sia abilitato.
2. Ottieni l'app di esempio di base
Uno dei prerequisiti per questo codelab è avere un'app App Engine del modulo 1 funzionante: completa il codelab del modulo 1 (consigliato) o copia l'app del modulo 1 dal repository. Che tu utilizzi il tuo o il nostro, il codice del Modulo 1 è il punto di "INIZIO". Questo codelab ti guida in ogni passaggio e si conclude con un codice simile a quello presente nella cartella "FINISH" del repository del modulo 7.
- INIZIO: Cartella Modulo 1 (Python 2)
- FINE: Cartella del modulo 7 (Python 2)
- Intero repository (per clonare o scaricare il file ZIP)
Indipendentemente dall'app del Modulo 1 che utilizzi, la cartella dovrebbe avere l'aspetto seguente, possibilmente anche con una cartella lib:
$ ls README.md main.py templates app.yaml requirements.txt
3. (Esegui di nuovo il deployment dell'app di base
Esegui i seguenti passaggi per (ri)eseguire il deployment dell'app Modulo 1:
- Elimina la cartella
lib, se presente, ed esegui:pip install -t lib -r requirements.txtper ripopolarelib. Se hai installato sia Python 2 che Python 3, potresti dover utilizzare il comandopip2. - Assicurati di aver installato e inizializzato lo strumento a riga di comando
gcloude di averne esaminato l'utilizzo. - Imposta il tuo progetto cloud con
gcloud config set projectPROJECT_IDse non vuoi inserirePROJECT_IDcon ogni comandogcloudemesso. - Esegui il deployment dell'app di esempio con
gcloud app deploy - Verifica che l'app del modulo 1 funzioni come previsto senza problemi di visualizzazione delle visite più recenti (illustrato di seguito)

4. Aggiorna configurazione
Non sono necessarie modifiche ai file di configurazione standard di App Engine (app.yaml, requirements.txt, appengine_config.py).
5. Modificare i file dell'applicazione
Il file dell'applicazione principale è main.py e tutti gli aggiornamenti in questa sezione riguardano questo file. È disponibile anche un aggiornamento secondario del modello web, templates/index.html. Ecco le modifiche da implementare in questa sezione:
- Aggiorna importazioni
- Aggiungi attività push
- Aggiungi gestore attività
- Aggiorna modello web
1. Aggiorna importazioni
Un'importazione di google.appengine.api.taskqueue introduce la funzionalità di Task Queue. Sono necessari anche alcuni pacchetti della libreria standard di Python:
- Poiché stiamo aggiungendo un'attività per eliminare le visite più vecchie, l'app dovrà gestire i timestamp, il che significa utilizzare
timeedatetime. - Per registrare informazioni utili sull'esecuzione delle attività, abbiamo bisogno di
logging.
Aggiungendo tutte queste importazioni, di seguito è riportato l'aspetto del codice prima e dopo queste modifiche:
PRIMA:
from flask import Flask, render_template, request
from google.appengine.ext import ndb
DOPO:
from datetime import datetime
import logging
import time
from flask import Flask, render_template, request
from google.appengine.api import taskqueue
from google.appengine.ext import ndb
2. Aggiungi attività push (raccogli dati per l'attività, metti in coda la nuova attività)
La documentazione della coda push afferma: "Per elaborare un'attività, devi aggiungerla a una coda push. App Engine fornisce una coda push predefinita, denominata default, configurata e pronta per l'uso con le impostazioni predefinite. Se vuoi, puoi aggiungere tutte le attività alla coda predefinita, senza dover creare e configurare altre code." Questo codelab utilizza la coda default per brevità. Per scoprire di più su come definire le tue code push, con caratteristiche uguali o diverse, consulta la documentazione sulla creazione di code push.
L'obiettivo principale di questo codelab è aggiungere un'attività (alla coda push default) il cui compito è eliminare le visite precedenti da Datastore che non vengono più visualizzate. L'app di base registra ogni visita (richiesta GET a /) creando una nuova entità Visit, quindi recupera e visualizza le visite più recenti. Nessuna delle visite meno recenti verrà mai visualizzata o utilizzata di nuovo, pertanto l'attività push elimina tutte le visite meno recenti di quella meno recente visualizzata. Per farlo, il comportamento dell'app deve cambiare leggermente:
- Quando esegui una query sulle visite più recenti, anziché restituirle immediatamente, modifica l'app per salvare il timestamp dell'ultima
Visit, la più vecchia visualizzata. È possibile eliminare tutte le visite precedenti a questa data. - Crea un'attività push con questo timestamp come payload e indirizzala al gestore delle attività, accessibile tramite un
POSTHTTP a/trim. In particolare, utilizza le utilità Python standard per convertire il timestamp Datastore e inviarlo (come float) all'attività, ma anche per registrarlo (come stringa) e restituire la stringa come valore sentinella da visualizzare all'utente.
Tutto ciò avviene in fetch_visits() ed ecco come appare prima e dopo aver apportato questi aggiornamenti:
PRIMA:
def fetch_visits(limit):
return (v.to_dict() for v in Visit.query().order(
-Visit.timestamp).fetch(limit))
DOPO:
def fetch_visits(limit):
'get most recent visits and add task to delete older visits'
data = Visit.query().order(-Visit.timestamp).fetch(limit)
oldest = time.mktime(data[-1].timestamp.timetuple())
oldest_str = time.ctime(oldest)
logging.info('Delete entities older than %s' % oldest_str)
taskqueue.add(url='/trim', params={'oldest': oldest})
return (v.to_dict() for v in data), oldest_str
3. Aggiungi il gestore delle attività (codice chiamato quando l'attività viene eseguita)
Sebbene l'eliminazione delle visite precedenti avrebbe potuto essere facilmente eseguita in fetch_visits(), tieni presente che questa funzionalità non ha molto a che fare con l'utente finale. È una funzionalità ausiliaria e un buon candidato per l'elaborazione asincrona al di fuori delle richieste standard delle app. L'utente finale trarrà vantaggio da query più veloci perché in Datastore ci saranno meno informazioni. Crea una nuova funzione trim(), chiamata tramite una richiesta Task Queue POST a /trim, che esegue le seguenti operazioni:
- Estrae il payload del timestamp "visita più vecchia"
- Esegue una query Datastore per trovare tutte le entità precedenti a questo timestamp.
- Sceglie una query più rapida "solo chiavi" perché non sono necessari dati utente effettivi.
- Registra il numero di entità da eliminare (incluso zero).
- Chiamate
ndb.delete_multi()per eliminare eventuali entità (ignorate in caso contrario). - Restituisce una stringa vuota (insieme a un codice di ritorno HTTP 200 implicito).
Puoi visualizzare tutto questo in trim() di seguito. Aggiungilo a main.py subito dopo fetch_visits():
@app.route('/trim', methods=['POST'])
def trim():
'(push) task queue handler to delete oldest visits'
oldest = request.form.get('oldest', type=float)
keys = Visit.query(
Visit.timestamp < datetime.fromtimestamp(oldest)
).fetch(keys_only=True)
nkeys = len(keys)
if nkeys:
logging.info('Deleting %d entities: %s' % (
nkeys, ', '.join(str(k.id()) for k in keys)))
ndb.delete_multi(keys)
else:
logging.info('No entities older than: %s' % time.ctime(oldest))
return '' # need to return SOME string w/200
4. Aggiorna modello web
Aggiorna il modello web, templates/index.html, con questa condizione Jinja2 per visualizzare il timestamp meno recente se la variabile esiste:
{% if oldest is defined %}
<b>Deleting visits older than:</b> {{ oldest }}</p>
{% endif %}
Aggiungi questo snippet dopo l'elenco delle visite visualizzato, ma prima di chiudere il corpo, in modo che il modello abbia questo aspetto:
<!doctype html>
<html>
<head>
<title>VisitMe Example</title>
<body>
<h1>VisitMe example</h1>
<h3>Last 10 visits</h3>
<ul>
{% for visit in visits %}
<li>{{ visit.timestamp.ctime() }} from {{ visit.visitor }}</li>
{% endfor %}
</ul>
{% if oldest is defined %}
<b>Deleting visits older than:</b> {{ oldest }}</p>
{% endif %}
</body>
</html>
6. Riepilogo/Pulizia
Questa sezione conclude il codelab eseguendo il deployment dell'app, verificando che funzioni come previsto e in qualsiasi output riflesso. Dopo la convalida dell'app, esegui la pulizia e valuta i passaggi successivi.
Esegui il deployment e verifica l'applicazione
Esegui il deployment dell'app con gcloud app deploy. L'output dovrebbe essere identico all'app del Modulo 1, ad eccezione di una nuova riga in basso che mostra le visite che verranno eliminate:

Congratulazioni per aver completato il codelab. Il codice ora dovrebbe corrispondere a quello della cartella del repository del modulo 7. Ora è tutto pronto per eseguire la migrazione a Cloud Tasks nel modulo 8.
Esegui la pulizia
Generale
Se hai finito per il momento, ti consigliamo di disattivare l'app App Engine per evitare addebiti. Tuttavia, se vuoi fare altri test o esperimenti, la piattaforma App Engine ha una quota senza costi e, finché non superi questo livello di utilizzo, non ti verranno addebitati costi. Questo vale per il calcolo, ma potrebbero essere addebitati anche costi per i servizi App Engine pertinenti, quindi consulta la pagina dei prezzi per ulteriori informazioni. Se questa migrazione coinvolge altri servizi cloud, questi vengono fatturati separatamente. In entrambi i casi, se applicabile, consulta la sezione "Specifiche per questo codelab" di seguito.
Per una divulgazione completa, il deployment su una piattaforma di calcolo serverless di Google Cloud come App Engine comporta costi di build e archiviazione minimi. Cloud Build ha una propria quota senza costi, così come Cloud Storage. L'archiviazione di questa immagine utilizza parte della quota. Tuttavia, potresti vivere in una regione che non dispone di un livello senza costi, quindi tieni sotto controllo l'utilizzo dello spazio di archiviazione per ridurre al minimo i potenziali costi. Le "cartelle" Cloud Storage specifiche che devi esaminare includono:
console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/imagesconsole.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com- I link di archiviazione riportati sopra dipendono dalla tua
PROJECT_IDe dalla tua *LOC*, ad esempio "us" se la tua app è ospitata negli Stati Uniti.
D'altra parte, se non intendi continuare con questa applicazione o con altri codelab di migrazione correlati e vuoi eliminare tutto completamente, chiudi il progetto.
Specifico per questo codelab
I servizi elencati di seguito sono univoci per questo codelab. Per saperne di più, consulta la documentazione di ogni prodotto:
- Il servizio App Engine Task Queue non comporta costi di fatturazione aggiuntivi in base alla pagina dei prezzi per i servizi in bundle legacy come Task Queue.
- Il servizio App Engine Datastore è fornito da Cloud Datastore (Cloud Firestore in modalità Datastore), che dispone anche di un livello senza costi. Per ulteriori informazioni, consulta la pagina dei prezzi.
Passaggi successivi
In questa "migrazione", hai aggiunto l'utilizzo della coda push di Task Queue all'app di esempio del modulo 1, aggiungendo il supporto per il monitoraggio dei visitatori, ottenendo l'app di esempio del modulo 7. La migrazione successiva ti insegna come eseguire l'upgrade dalle attività push di App Engine a Cloud Tasks, se lo desideri. A partire dall'autunno 2021, gli utenti non devono più eseguire la migrazione a Cloud Tasks durante l'upgrade a Python 3. Scopri di più nella sezione successiva.
Se vuoi passare a Cloud Tasks, il prossimo passo è il codelab del modulo 8. Oltre a queste, ci sono altre migrazioni da considerare, come Cloud Datastore, Cloud Memorystore, Cloud Storage o Cloud Pub/Sub (code pull). Esistono anche migrazioni tra prodotti a Cloud Run e Cloud Functions. Tutti i contenuti di Serverless Migration Station (codelab, video, codice sorgente [se disponibile]) sono accessibili nel relativo repository open source.
7. Migrazione a Python 3
Nell'autunno 2021, il team di App Engine ha esteso il supporto di molti dei servizi integrati ai runtime di seconda generazione (originariamente disponibili solo nei runtime di prima generazione), il che significa che non è più necessario eseguire la migrazione da servizi integrati come App Engine Task Queue a equivalenti Cloud o di terze parti autonomi come Cloud Tasks durante il porting dell'app a Python 3. In altre parole, puoi continuare a utilizzare Task Queue nelle app App Engine Python 3 a condizione che adatti il codice per accedere ai servizi in bundle dai runtime di nuova generazione.
Puoi scoprire di più su come eseguire la migrazione dell'utilizzo dei servizi in bundle a Python 3 nel codelab del modulo 17 e nel relativo video. Sebbene questo argomento non rientri nell'ambito del modulo 7, di seguito sono riportate le versioni Python 3 delle app dei moduli 1 e 7 convertite in Python 3 e che utilizzano ancora App Engine NDB e la coda di attività.
8. Risorse aggiuntive
Di seguito sono elencate risorse aggiuntive per gli sviluppatori che vogliono esplorare ulteriormente questo modulo di migrazione o quelli correlati, nonché i prodotti correlati. Sono inclusi i luoghi in cui fornire feedback su questi contenuti, i link al codice e vari documenti che potresti trovare utili.
Problemi/feedback relativi ai codelab
Se riscontri problemi con questo codelab, cerca prima il tuo problema prima di presentare una segnalazione. Link per cercare e creare nuovi problemi:
Risorse per la migrazione
I link alle cartelle del repository per il modulo 2 (INIZIO) e il modulo 7 (FINE) sono disponibili nella tabella riportata di seguito.
Codelab | Python 2 | Python 3 |
Codice (non incluso in questo tutorial) | ||
Modulo 7 (questo codelab) | Codice (non incluso in questo tutorial) |
Risorse online
Di seguito sono riportate risorse online che potrebbero essere pertinenti per questo tutorial:
Coda delle attività App Engine
- Panoramica di App Engine Task Queue
- Panoramica delle code push di App Engine Task Queue
- Creazione di code push di Task Queue
queue.yamlriferimentoqueue.yamle Cloud Tasks- Guida alla migrazione delle code in modalità push a Cloud Tasks
- Esempio di documentazione sulle code in modalità push di App Engine Task Queue a Cloud Tasks
Piattaforma App Engine
- Documentazione di App Engine
- Runtime Python 2 App Engine (ambiente standard)
- Utilizzo delle librerie integrate di App Engine su Python 2 App Engine
- Runtime Python 3 App Engine (ambiente standard)
- Differenze tra i runtime di Python 2 e 3 di App Engine (ambiente standard)
- Guida alla migrazione da Python 2 a 3 di App Engine (ambiente standard)
- Informazioni su prezzi e quote di App Engine
- Lancio della piattaforma App Engine di seconda generazione (2018)
- Confronto tra piattaforme di prima e seconda generazione
- Supporto a lungo termine per i runtime legacy
- Esempi di migrazione della documentazione
- Esempi di migrazione forniti dalla community
Altre informazioni sul cloud
- Python su Google Cloud Platform
- Librerie client Python di Google Cloud
- Livello "Sempre senza costi" di Google Cloud
- Google Cloud SDK (strumento a riga di comando
gcloud) - Tutta la documentazione di Google Cloud
Video
- Serverless Migration Station
- Serverless Expeditions
- Iscriviti a Google Cloud Tech
- Iscriviti a Google Developers
Licenza
Questo lavoro è concesso in licenza ai sensi di una licenza Creative Commons Attribution 2.0 Generic.