Le applicazioni web Python scalabili ad alte prestazioni spesso utilizzano una cache di dati distribuita in memoria anziché un'efficace archiviazione permanente per alcune attività.
La soluzione App Engine è Memcache, un datastore distribuito in memoria che viene utilizzato come cache per attività specifiche.
Per la migrazione da servizi in bundle legacy, la sostituzione consigliata per App Engine Memcache è Memorystore, un servizio di memorizzazione nella cache basato su cloud completamente gestito che supporta i motori di memorizzazione nella cache open source, Redis e Memcached. Questa guida illustra l'utilizzo di Memorystore per Redis, che può creare cache di applicazioni che consentono di accedere ai dati in meno di un millisecondo.
Se la tua app Python utilizza Memcache solo per ridurre la latenza per le richieste ndb
o Cloud NDB, puoi utilizzare il supporto integrato di Cloud NDB per Redis, anziché Memcache o Memorystore for Redis.
Prima di iniziare, assicurati che la tua app rimanga nelle quote di Memorystore for Redis.
Quando utilizzare una cache di memoria per le app Python
Nelle app Python, i dati delle sessioni, le preferenze utente e altri dati restituiti dalle query per le pagine web sono ottimi candidati per la memorizzazione nella cache. In generale, se una query eseguita di frequente restituisce un insieme di risultati che non devono essere visualizzati immediatamente nell'app, puoi memorizzare i risultati nella cache. Le richieste successive possono controllare la cache ed eseguire query sul database solo se i risultati sono assenti o sono scaduti.
Se archivi un valore solo in Memorystore senza eseguirne il backup in uno spazio di archiviazione permanente, assicurati che l'applicazione si comporti in modo accettabile se il valore scade e viene rimosso dalla cache. Ad esempio, se l'improvvisa assenza dei dati della sessione di un utente causa un malfunzionamento della sessione, è probabile che tali dati dovrebbero essere archiviati nel database oltre che in Memorystore.
Prima di iniziare
Se non l'hai ancora fatto, configura il tuo ambiente di sviluppo Python in modo da utilizzare una versione Python compatibile con Google Cloud e installa strumenti di test per creare ambienti Python isolati.
Informazioni sulle autorizzazioni Memorystore
Ogni interazione con un servizio Google Cloud deve essere autorizzata. Ad esempio, per interagire con un database Redis ospitato da Memorystore, la tua app deve fornire le credenziali di un account autorizzato ad accedere a Memorystore.
Per impostazione predefinita, la tua app fornisce le credenziali dell'account di servizio predefinito di App Engine, che è autorizzato ad accedere ai database nello stesso progetto della tua app.
Se una delle seguenti condizioni si verifica, devi utilizzare una tecnica di autenticazione alternativa che fornisca esplicitamente le credenziali:
L'app e il database Memorystore si trovano in progetti Google Cloud diversi.
Hai modificato i ruoli assegnati all'account di servizio App Engine predefinito.
Per informazioni sulle tecniche di autenticazione alternative, consulta Configurazione dell'autenticazione per applicazioni di produzione da server a server.
Panoramica del processo di migrazione
Per utilizzare Memorystore anziché Memcache nella tua app Python:
Configura Memorystore for Redis, che richiede la creazione di un'istanza Redis su Memorystore e di un accesso VPC serverless che la tua app utilizza per comunicare con l'istanza Redis. L'ordine di creazione di queste due entità indipendenti non è rigoroso e può essere impostato in qualsiasi ordine. Le istruzioni in questa guida mostrano come configurare prima l'accesso VPC serverless.
Installa una libreria client per Redis e utilizza i comandi di Redis per memorizzare i dati nella cache.
Memorystore per Redis è compatibile con qualsiasi libreria client per Redis.
Questa guida descrive l'utilizzo della libreria client di
redis-py
per inviare comandi Redis dalla tua app.
Configurazione di Memorystore per Redis
Per configurare Memorystore for Redis:
Connetti App Engine a una rete VPC. La tua app può comunicare con Memorystore solo tramite un connettore VPC.
Assicurati di aggiungere le informazioni sulla connessione VPC al file
app.yaml
come descritto in Configurare l'app utilizzando il connettore.Prendi nota dell'indirizzo IP e del numero di porta dell'istanza Redis che hai creato. Utilizzerai queste informazioni quando crei un client Redis nel codice.
Crea un'istanza Redis in Memorystore.
Quando ti viene richiesto di selezionare una regione per l'istanza Redis, seleziona la stessa regione in cui si trova l'app App Engine.
Installazione delle dipendenze
Per utilizzare la libreria client redis-py
:
Aggiorna il file
app.yaml
. Segui le istruzioni relative alla tua versione di Python:Python 2
Per le app Python 2, aggiungi le versioni più recenti delle librerie
grpcio
esetuptools
.Di seguito è riportato un esempio di file
app.yaml
:runtime: python27 threadsafe: yes api_version: 1 libraries: - name: grpcio version: latest - name: setuptools version: latest
Python 3
Per le app Python 3, specifica l'elemento
runtime
nel fileapp.yaml
con una versione Python 3 supportata. Ad esempio:runtime: python310 # or another support version
Il runtime Python 3 installa le librerie automaticamente, quindi non è necessario specificare le librerie integrate del runtime Python 2 precedente. Se la tua app Python 3 utilizza altri servizi in bundle legacy durante la migrazione, puoi continuare a specificare le librerie integrate necessarie. In caso contrario, puoi eliminare le righe non necessarie nel file
app.yaml
.Aggiorna il file
requirements.txt
. Segui le istruzioni per la tua versione di Python:Python 2
Aggiungi le librerie client di Cloud per Memorystore for Redis al tuo elenco di dipendenze nel file
requirements.txt
.redis
Esegui
pip install -t lib -r requirements.txt
per aggiornare l'elenco delle librerie disponibili per la tua app.Python 3
Aggiungi le librerie client di Cloud per Memorystore for Redis al tuo elenco di dipendenze nel file
requirements.txt
.redis
App Engine installa automaticamente queste dipendenze durante il deployment dell'app nel runtime Python 3, quindi elimina la cartella
lib
, se esistente.Per le app Python 2, se la tua app utilizza librerie integrate o copiate specificate nella directory
lib
, devi specificare questi percorsi nel fileappengine_config.py
, che si trova nella stessa cartella del fileapp.yaml
:import pkg_resources from google.appengine.ext import vendor # Set PATH to your libraries folder. PATH = 'lib' # Add libraries installed in the PATH folder. vendor.add(PATH) # Add libraries to pkg_resources working set to find the distribution. pkg_resources.working_set.add_entry(PATH)
Creazione di un client Redis
Per interagire con un database Redis, il codice deve creare un client Redis per gestire la connessione al tuo database Redis. Le seguenti sezioni descrivono la creazione di un client Redis utilizzando la libreria client Redis.
Specifica delle variabili di ambiente
La libreria client Redis utilizza due variabili di ambiente per assemblare l'URL per il database Redis:
- Una variabile per identificare l'indirizzo IP del database Redis creato in Memorystore
- Una variabile per identificare il numero di porta del database Redis creato in Memorystore.
Ti consigliamo di definire queste variabili nel file app.yaml
dell'app, anziché
indicarle direttamente nel codice. In questo modo è più facile eseguire l'app in
ambienti diversi, come un ambiente locale e App Engine.
Ad esempio, aggiungi le seguenti righe al file app.yaml
:
env_variables:
REDISHOST: '10.112.12.112'
REDISPORT: '6379'
Importazione di Redis e creazione del client
Dopo aver definito le variabili di ambiente REDISHOST
e REDISPORT
, utilizza le righe seguenti per importare la libreria redis-py
e creare un client:
import redis
redis_host = os.environ.get('REDISHOST', 'localhost')
redis_port = int(os.environ.get('REDISPORT', 6379))
redis_client = redis.Redis(host=redis_host, port=redis_port)
Se hai utilizzato una versione precedente di redis-py
per altre app, potresti aver utilizzato la classe StrictClient
anziché Client
. Tuttavia, redis-py
ora
consiglia Client
anziché StrictClient
.
Utilizzo dei comandi Redis per archiviare e recuperare i dati nella cache
Sebbene il database Memorystore Redis supporti la maggior parte dei comandi Redis, devi utilizzarne solo alcuni per archiviare e recuperare i dati dalla cache. La tabella seguente suggerisce i comandi Redis che puoi utilizzare per memorizzare i dati nella cache. Per sapere come chiamare questi comandi dall'app, consulta la documentazione della libreria client.
Tieni presente che per le app Python 2, sebbene memcache fornisca alternative asincrone per molti dei suoi comandi, la libreria client redis-py
non offre sempre metodi asincroni equivalenti. Se vuoi che tutte le interazioni con la cache siano asincrone, sono disponibili altre librerie client Redis per Python.
Attività | Comando Redis |
---|---|
Crea una voce nella cache dei dati e imposta una scadenza per la voce |
SETNX MSETNX |
Recuperare i dati dalla cache | GET MGET |
Sostituisci i valori della cache esistenti | IMPOSTA MSET |
Incrementare o diminuire i valori numerici della cache | INCR INCRBY DECR DECRBY |
Elimina le voci dalla cache | DEL SCOLLEGA |
Supporta interazioni simultanee con la cache (confronta e imposta) | Visualizza i dettagli sulle transazioni Redis. Tieni presente che la libreria client "redis-py" richiede che tutte le transazioni avvengano in una pipeline. |
Test degli aggiornamenti in corso...
Quando testi la tua app in locale, valuta la possibilità di eseguire un'istanza locale di Redis per evitare di interagire con i dati di produzione (Memorystore non fornisce un emulatore). Per installare ed eseguire Redis in locale, segui le indicazioni nella documentazione di Redis. Tieni presente che al momento non è possibile eseguire Redis in locale su Windows.
Per ulteriori informazioni sui test delle app Python, consulta Utilizzo del server di sviluppo locale.
Deployment dell'app
Dopo che l'app è in esecuzione nel server di sviluppo locale senza errori:
Se l'app viene eseguita senza errori, utilizza la suddivisione del traffico per aumentare lentamente il traffico dell'app aggiornata. Monitora attentamente l'app per individuare eventuali problemi del database prima di indirizzare più traffico all'app aggiornata.
Passaggi successivi
- Per un tutorial pratico, vedi Eseguire la migrazione da App Engine Memcache a Memorystore for Redis codelab.
- Per ulteriori dettagli, consulta la documentazione di Memorystore per Redis.