Migrazione di memcache a Memorystore

Le applicazioni web Python scalabili ad alte prestazioni spesso utilizzano una cache di dati in memoria distribuita anziché un'archiviazione persistente solida per alcune attività.

La soluzione App Engine per questo è Memcache, un datastore in memoria distribuito che viene utilizzato come cache per attività specifiche.

Quando esegui la migrazione dai servizi legacy in bundle, la sostituzione consigliata per App Engine Memcache è Memorystore, un servizio di memorizzazione nella cache basato sul cloud completamente gestito che supporta i motori di memorizzazione nella cache open source, Redis e Memcached. Questa guida illustra l'utilizzo di 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 for Redis.

Prima di iniziare, assicurati che la tua app rientri nelle quote di Memorystore for Redis.

Quando utilizzare una memoria cache per le app Python

Nelle tue app Python, i dati di sessione, le preferenze utente e altri dati restituiti dalle query per le 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 nell'app, puoi memorizzarli nella cache. Le richieste successive possono controllare la cache ed eseguire query sul database solo se i risultati sono assenti o scaduti.

Se memorizzi un valore solo in Memorystore senza eseguirne il backup nello 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 di sessione di un utente causerebbe il malfunzionamento della sessione, questi dati probabilmente devono 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 di Python compatibile con Google Cloude installa gli 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 del service account predefinito di App Engine, che è autorizzato ad accedere ai database nello stesso progetto della tua app.

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

  • La tua app e il database Memorystore si trovano in progettiGoogle Cloud diversi.

  • Hai modificato i ruoli assegnati al 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:

  1. Configura Memorystore for Redis, che richiede di creare un'istanza Redis su Memorystore e 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 è rigido e possono essere configurate in qualsiasi ordine. Le istruzioni di questa guida mostrano la configurazione iniziale di Accesso VPC serverless.

  2. Installa una libreria client per Redis e utilizza i comandi Redis per memorizzare i dati nella cache.

    Memorystore for Redis è compatibile con qualsiasi libreria client per Redis.

    Questa guida descrive l'utilizzo della libreria client redis-py per inviare comandi Redis dalla tua app.

  3. Testa 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 di connessione VPC al file app.yaml come descritto in Configurare l'utilizzo dell'app del 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 tuo 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 l'app App Engine.

Installazione delle dipendenze

Per utilizzare la libreria client redis-py:

  1. 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 delle librerie grpcio e setuptools.

    Ecco 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 file app.yaml con una versione di Python 3 supportata. Ad esempio:

    runtime: python310 # or another support version
    

    Il runtime Python 3 installa automaticamente le librerie, quindi non devi 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.

  2. Aggiorna il file requirements.txt. Segui le istruzioni per la tua versione di Python:

    Python 2

    Aggiungi le librerie client Cloud per Memorystore for Redis all'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 Cloud per Memorystore for Redis all'elenco delle dipendenze nel file requirements.txt.

    redis
    

    App Engine installa automaticamente queste dipendenze durante il deployment dell'app nell'ambiente di runtime Python 3, quindi elimina la cartella lib, se esiste.

  3. Per le app Python 2, se la tua app utilizza librerie integrate o copiate specifiche nella directory lib, devi specificare questi percorsi nel file appengine_config.py, che si trova nella stessa cartella del file app.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 database Redis. Le sezioni seguenti descrivono la creazione di un client Redis utilizzando la libreria client redis-py.

Specificare le 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 della tua app anziché definirle direttamente nel codice. In questo modo è più facile eseguire l'app in ambienti diversi, ad esempio 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-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 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

Sebbene il database Memorystore Redis supporti la maggior parte dei comandi Redis, devi utilizzare solo alcuni comandi 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 scoprire come chiamare questi comandi dalla tua app, consulta la documentazione della libreria client.

Tieni presente che per le app Python 2, mentre Memcache fornisce alternative asincrone per molti dei suoi comandi, la libreria client redis-py non fornisce sempre metodi asincroni equivalenti. Se richiedi 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 un tempo di scadenza per la voce
SETNX
MSETNX
Recuperare dati dalla cache GET
MGET
Sostituisci i valori della cache esistenti SET
MSET
Incrementare o decrementare i valori numerici della cache INCR
INCRBY
DECR
DECRBY
Eliminare le voci dalla cache DEL
UNLINK
Supportare interazioni simultanee con la cache (confronto e impostazione) 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

Quando testi la tua app localmente, 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 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, consulta Utilizzo del server di sviluppo locale.

Deployment dell'app

Una volta che l'app viene eseguita 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 gradualmente il traffico per l'app aggiornata. Monitora attentamente l'app per rilevare eventuali problemi di database prima di indirizzare più traffico all'app aggiornata.

Passaggi successivi