Le applicazioni web Python scalabili ad alte prestazioni utilizzano spesso una cache di dati in memoria distribuita anziché un'archiviazione permanente solida per alcune attività.
La soluzione di App Engine per questo problema è Memcache, un datastore in memoria distribuito che viene utilizzato come cache per attività specifiche.
Quando esegui la migrazione dai servizi in bundle legacy, è la soluzione consigliata come sostituzione per Memcache App Engine è Memorystore, una servizio di memorizzazione nella cache completamente gestito basato su cloud che supporta la memorizzazione nella cache open source Redis e Memcached. Questa guida illustra l'utilizzo Memorystore for 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 per Redis.
Prima di iniziare, assicurati che la tua app rispetti le quote di Memorystore for Redis.
Quando utilizzare una cache di memoria per le app Python
Nelle app Python, i dati di sessione, le preferenze utente e altri dati restituiti per query sulle pagine web sono buoni 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 nella tua app, puoi memorizzare nella cache i risultati. Le richieste successive possono controllare la cache e eseguire query sul database solo se i risultati non sono presenti o sono scaduti.
Se archivi un valore solo in Memorystore senza eseguirne il backup in di archiviazione permanente, assicurati che l'applicazione si comporti in modo accettabile se scade e viene rimosso dalla cache. Ad esempio, se l'assenza improvvisa dei dati della sessione di un utente causa un malfunzionamento della sessione, tali dati dovrebbe essere archiviato nel database oltre che in Memorystore.
Prima di iniziare
Se non l'hai ancora fatto, configura il tuo ambiente di sviluppo Python per utilizzare una versione di Python compatibile con Google Cloud e installa gli strumenti di test per creare ambienti Python isolati.
Informazioni sulle autorizzazioni di Memorystore
Ogni interazione con un servizio Google Cloud deve essere autorizzata. Per 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, l'app fornisce le credenziali di App Engine account di servizio predefinito, che è autorizzato ad accedere ai database nello stesso progetto della tua app.
Se una delle seguenti condizioni è vera, devi usare un'alternativa tecnica di autenticazione che fornisce esplicitamente le credenziali:
La tua app e il database Memorystore si trovano in diversi progetti Google Cloud.
Hai modificato i ruoli assegnati all'account di servizio App Engine predefinito.
Per informazioni sulle tecniche di autenticazione alternative, vedi Impostazione dell'autenticazione per la produzione da server a server Applicazioni.
Panoramica del processo di migrazione
Per utilizzare Memorystore anziché Memcache nella tua app Python:
Configura Memorystore for Redis, che richiede di creare un'istanza Redis su Memorystore e un accesso VPC serverless utilizzato dall'app per comunicare con l'istanza Redis. L'ordine di creazione di queste due entità indipendenti non è rigoroso e può essere configurato in qualsiasi ordine. Le istruzioni di questa guida mostrano per prima cosa devi configurare l'accesso VPC serverless.
Installare una libreria client per Redis e utilizzare Redis per memorizzare i dati nella cache.
Memorystore for Redis è compatibile con qualsiasi libreria client per Redis.
Questa guida descrive l'utilizzo dei
redis-py
libreria client per inviare comandi Redis dalla tua app.
Configurazione di Memorystore for Redis
Per configurare Memorystore for Redis:
Connetti App Engine a una rete VPC. L'app può comunicare con Memorystore solo tramite un connettore VPC.
Assicurati di aggiungere le informazioni di connessione VPC al file
app.yaml
come descritto in Configurare l'utilizzo del connettore da parte dell'app.Prendi nota dell'indirizzo IP e del numero di porta dell'istanza Redis creata. Utilizzerai queste informazioni quando crei un client Redis nel codice.
Crea un'istanza Redis in Memorystore.
Quando ti viene chiesto di selezionare una regione per l'istanza Redis, seleziona la stessa regione in cui si trova la tua app App Engine.
Installazione delle dipendenze
Per utilizzare la libreria client redis-py
:
Aggiorna il file
app.yaml
. Segui le istruzioni per la tua versione di Python:Python 2
Per le app Python 2, aggiungi le ultime versioni di
grpcio
esetuptools
librerie.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 devi specificare le librerie integrate nel runtime Python 2 precedente. Se la tua app Python 3 utilizza altri servizi in bundle legacy quando 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 relative alla tua versione di Python:Python 2
Aggiungi le librerie client di Cloud per Memorystore for Redis a dell'elenco delle 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 a dell'elenco delle dipendenze nel file
requirements.txt
.redis
App Engine installa automaticamente queste dipendenze durante il deployment dell'app nel runtime di Python 3, quindi elimina la cartella
lib
, se esistente.Per le app Python 2, se l'app utilizza librerie integrate o copiate specificato nella directory
lib
, devi specificare quei percorsi nelappengine_config.py
, che si trova nella stessa cartella diapp.yaml
file: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 database Redis. Le seguenti sezioni descrivono la creazione di un client Redis utilizzando la libreria client redis-py.
Specifica delle variabili di ambiente
La libreria client redis-py utilizza due variabili di ambiente per assemblare l'URL del database Redis:
- Una variabile per identificare l'indirizzo IP del database Redis che hai creato in Memorystore.
- Una variabile per identificare il numero di porta del database Redis che hai creato in Memorystore.
Ti consigliamo di definire queste variabili nel file app.yaml
dell'app anziché
direttamente nel codice. In questo modo è più facile eseguire l'app in diversi ambienti, ad esempio in un ambiente locale e in App Engine.
Ad esempio, aggiungi le seguenti righe al file app.yaml
:
env_variables:
REDISHOST: '10.112.12.112'
REDISPORT: '6379'
Importazione di Redis-py e creazione del client
Dopo aver definito le variabili di ambiente REDISHOST
e REDISPORT
,
utilizza le seguenti righe 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
ha utilizzato la classe StrictClient
anziché Client
. Tuttavia, ora redis-py
consiglia Client
anziché StrictClient
.
Utilizzo dei comandi Redis per archiviare e recuperare i dati nella cache
Anche se il database Redis di Memorystore supporta la maggior parte dei comandi Redis, devi utilizzare solo alcuni comandi per memorizzare e recuperare i dati dalla cache. La tabella seguente suggerisce i comandi Redis che puoi utilizzare per memorizzare nella cache i dati. Per scoprire come chiamare questi comandi dalla tua app, consulta la documentazione della libreria client.
Tieni presente che, per le app Python 2, Memcache fornisce alternative asincrone per molti dei suoi comandi, ma la libreria client redis-py
non fornisce sempre metodi asincroni equivalenti. Se hai bisogno di tutte le interazioni con la cache
asincrone, altre librerie client Redis
Python sono
disponibili.
Attività | Comando Redis |
---|---|
Crea una voce nella cache dei dati e imposta una data e un'ora di scadenza per la voce |
SETNX MSETNX |
Recuperare i dati dalla cache | GET MGET |
Sostituisci i valori della cache esistenti | SET MSET |
Aumentare o diminuire i valori numerici della cache | INCR INCRBY DECR DECRBY |
Eliminare le voci dalla cache | DEL SCOLLEGA |
Supporta le interazioni simultanee con la cache (confronta e imposta) | Consulta i dettagli sulle transazioni Redis. Tieni presente che la libreria client "redis-py" richiede che tutte le transazioni vengano eseguite in una pipeline. |
Test degli aggiornamenti in corso...
Quando testi l'app localmente, ti consigliamo 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 localmente, segui le istruzioni riportate nella documentazione di Redis. Tieni presente che attualmente non è possibile eseguire Redis in locale su Windows.
Per ulteriori informazioni sul test delle app Python, consulta Utilizzare il server di sviluppo locale.
Deployment dell'app
Una volta che l'app è in esecuzione nel server di sviluppo locale senza errori:
Se l'app viene eseguita senza errori, utilizza il traffico da dividere in lentamente aumentare il traffico per la tua app aggiornata. Monitora attentamente l'app per individuare prima di indirizzare una quantità maggiore di traffico all'app aggiornata.
Passaggi successivi
- Per un tutorial pratico, consulta il codelab Eseguire la migrazione da Memcache di App Engine a Memorystore for Redis.
- Per ulteriori dettagli, consulta la documentazione di Memorystore for Redis.