Migrazione di memcache a Memorystore

Memcache è un datastore in memoria distribuito integrato nel runtime di Python 2. Molte app di App Engine utilizzano Memcache come cache per attività specifiche, anziché affidarsi esclusivamente all'archiviazione permanente.

Memorystore for Redis fornisce un servizio completamente gestito basato sul datastore Redis in memoria per creare cache di applicazioni che consentono l'accesso ai dati in meno di un millisecondo.

Se la tua app Python 2 utilizza Memcache per ridurre la latenza solo per le richieste ndb o Cloud NDB, puoi utilizzare il supporto integrato di Cloud NDB per Redis, anziché Memcache o Memorystore per Redis.

Informazioni sulle autorizzazioni di 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, l'app fornisce le credenziali dell'account di servizio predefinito di App Engine, che è autorizzato ad accedere ai database nello stesso progetto dell'app.

Se una delle seguenti condizioni è vera, devi utilizzare una tecnica di autenticazione alternativa che fornisca esplicitamente le credenziali:

  • La tua app e il database Memorystore sono 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 la pagina Configurare l'autenticazione per le applicazioni di produzione da server a server.

Panoramica del processo di migrazione

Per eseguire la migrazione dell'app Python per utilizzare Memorystore anziché Memcache:

  1. Configura Memorystore for Redis, per cui devi creare un'istanza Redis su Memorystore e creare un accesso VPC serverless che la tua app utilizza per comunicare con l'istanza Redis. La creazione di queste due entità indipendenti non è rigorosa e può essere impostata in qualsiasi ordine. Innanzitutto, le istruzioni in questa guida mostrano come configurare l'accesso VPC serverless.

  2. Installa una libreria client per Redis e utilizza i comandi 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 redis-py 3.0 per inviare comandi Redis dalla tua app.

  3. Verifica gli aggiornamenti.

  4. Esegui il deployment dell'app in App Engine.

Configurazione di Memorystore for Redis

Per configurare Memorystore for Redis:

  1. 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.

  2. Prendi nota dell'indirizzo IP e del numero di porta dell'istanza Redis che crei. Utilizzerai queste informazioni quando crei un client Redis nel codice.

  3. 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 rendere disponibile la libreria client redis-py per la tua applicazione quando viene eseguita in App Engine:

  1. Aggiungi la seguente riga al file requirements.txt della tua app:

     redis
    
  2. Se esegui ancora la tua app nel runtime di Python 2:

    1. Utilizza pip (versione 6 o successiva) con il flag -t <directory> per installare le librerie in una cartella locale denominata lib. Ad esempio:

      pip install -t lib <library_name> -r requirements.txt

    2. Assicurati che il file appengine_config.py dell'app specifichi la directory lib.

    App Engine caricherà tutte le librerie nella directory specificata nel file appengine_config.py. Per maggiori dettagli, consulta la pagina Utilizzo delle librerie Python 2.

Il runtime di App Engine Python 3 caricherà automaticamente tutte le librerie nel file requirements.txt della tua app quando esegui il deployment dell'app.

Per lo sviluppo locale, consigliamo di installare le dipendenze in un ambiente virtuale come virtualenv per Python 2 o venv per Python 3.

Creazione di un client Redis

Per interagire con un database Redis, il tuo codice deve creare un client Redis per gestire la connessione al database Redis. Le seguenti sezioni descrivono la creazione di un client Redis mediante 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 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 invece di definirle direttamente nel codice. In questo modo è più semplice eseguire l'app in ambienti diversi, ad esempio in un ambiente locale e in App Engine.

Ad esempio, aggiungi le seguenti righe al tuo file app.yaml:

 env_variables:
      REDISHOST: '10.112.12.112'
      REDISPORT: '6379'

Importando redis-py e creando il 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 usato la classe StrictClient invece di Client. Tuttavia, redis-py ora consiglia Client invece di StrictClient.

Utilizzo dei comandi Redis per archiviare e recuperare dati nella cache

Sebbene il database Memorystore Redis supporti la maggior parte dei comandi Redis, è sufficiente utilizzare pochi comandi per archiviare e recuperare i dati dalla cache. La seguente tabella suggerisce i comandi Redis che puoi utilizzare per memorizzare i dati nella cache. Per vedere come chiamare questi comandi dalla tua app, consulta la documentazione della libreria client.

Tieni presente che anche se Memcache fornisce alternative asincrone per molti dei suoi comandi, la libreria client redis-py non fornisce sempre metodi asincroni equivalenti. Se richiedi l'asincrona di tutte le interazioni con la cache, 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
Recupera i dati dalla cache SCARICA
MGET
Sostituisci i valori della cache esistenti IMPOSTA
MIMPOSTA
Aumenta o riduci i valori numerici della cache INCR
INCRBY
DECR
DECRBY
Eliminare le voci dalla cache CANC
SCOLLEGA
Supporta le interazioni simultanee con la cache (confronta e imposta) Scopri i dettagli delle transazioni Redis. Tieni presente che la libreria client redis-py richiede che tutte le transazioni vengano eseguite in una pipeline.

Test degli aggiornamenti

Quando testi la tua app localmente, valuta la possibilità di eseguire un'istanza local di Redis per evitare interazioni 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 al momento non è possibile eseguire Redis localmente su Windows.

Per ulteriori informazioni sul test delle app Python 2, consulta Utilizzo del server di sviluppo locale.

Deployment dell'app

Quando l'app è in esecuzione nel server di sviluppo locale senza errori:

  1. Testa l'app su App Engine.

  2. Se l'app viene eseguita senza errori, utilizza la suddivisione del traffico per aumentare lentamente il traffico verso l'app aggiornata. Monitora attentamente l'app per verificare se ci sono problemi del database prima di indirizzare più traffico all'app aggiornata.