Migrar o Memcache para o Memorystore

As aplicações Web Python escaláveis de alto desempenho usam frequentemente uma cache de dados na memória distribuída em vez de um armazenamento persistente robusto para algumas tarefas.

A solução do App Engine para isto é o Memcache, um arquivo de dados na memória distribuído que é usado como uma cache para tarefas específicas.

Quando migrar dos serviços agrupados antigos, a substituição recomendada para o Memcache do App Engine é o Memorystore, um serviço de cache baseado na nuvem totalmente gerido que suporta motores de cache de código aberto, o Redis e o Memcached. Este guia aborda a utilização do Memorystore for Redis, que pode criar caches de aplicações que oferecem acesso a dados inferior a um milissegundo.

Se a sua app Python usar o Memcache apenas para reduzir a latência dos pedidos ndb ou do Cloud NDB, pode usar o suporte integrado do Cloud NDB para o Redis, em vez do Memcache ou do Memorystore para Redis.

Antes de começar, certifique-se de que a sua app se mantém dentro das cotas do Memorystore para Redis.

Quando usar uma cache de memória para apps Python

Nas suas apps Python, os dados de sessão, as preferências do utilizador e outros dados devolvidos pelas consultas de páginas Web são bons candidatos para o armazenamento em cache. Em geral, se uma consulta executada com frequência devolver um conjunto de resultados que não precisam de aparecer na sua app imediatamente, pode colocar os resultados em cache. Os pedidos subsequentes podem verificar a cache e apenas consultar a base de dados se os resultados estiverem ausentes ou tiverem expirado.

Se armazenar um valor apenas no Memorystore sem fazer uma cópia de segurança no armazenamento persistente, certifique-se de que a sua aplicação se comporta de forma aceitável se o valor expirar e for removido da cache. Por exemplo, se a ausência repentina dos dados de sessão de um utilizador fizer com que a sessão funcione incorretamente, esses dados devem provavelmente ser armazenados na base de dados, além do Memorystore.

Antes de começar

Se ainda não o fez, configure o seu ambiente de desenvolvimento Python para usar uma versão do Python compatível com o Google Cloude instale ferramentas de teste para criar ambientes Python isolados.

Compreender as autorizações do Memorystore

Todas as interações com um serviço Google Cloud têm de ser autorizadas. Por exemplo, para interagir com uma base de dados Redis alojada pelo Memorystore, a sua app tem de fornecer as credenciais de uma conta autorizada a aceder ao Memorystore.

Por predefinição, a sua app fornece as credenciais da conta de serviço predefinida do App Engine, que está autorizada a aceder a bases de dados no mesmo projeto que a sua app.

Se alguma das seguintes condições for verdadeira, tem de usar uma técnica de autenticação alternativa que forneça explicitamente credenciais:

  • A sua app e a base de dados do Memorystore estão emGoogle Cloud projetos diferentes.

  • Alterou as funções atribuídas à conta de serviço predefinida do App Engine.

Para informações sobre técnicas de autenticação alternativas, consulte o artigo Configurar a autenticação para aplicações de produção de servidor a servidor.

Vista geral do processo de migração

Para usar o Memorystore em vez do Memcache na sua app Python:

  1. Configure o Memorystore for Redis, o que requer que crie uma instância do Redis no Memorystore e crie um acesso a VPC sem servidor que a sua app usa para comunicar com a instância do Redis. A ordem de criação destas duas entidades independentes não é rígida e podem ser configuradas em qualquer ordem. As instruções neste guia mostram como configurar primeiro o Acesso a VPC sem servidor.

  2. Instale uma biblioteca cliente para o Redis e use comandos do Redis para colocar dados em cache.

    O Memorystore for Redis é compatível com qualquer biblioteca de cliente para Redis.

    Este guia descreve a utilização da biblioteca cliente redis-py para enviar comandos Redis a partir da sua app.

  3. Teste as atualizações.

  4. Implemente a sua app no App Engine.

Configurar o Memorystore for Redis

Para configurar o Memorystore for Redis:

  1. Associe o App Engine a uma rede VPC. A sua app só pode comunicar com o Memorystore através de um conetor de VPC.

    Certifique-se de que adiciona as informações de ligação da VPC ao ficheiro app.yaml, conforme descrito em Configurar a sua app para usar o conetor.

  2. Tome nota do endereço IP e do número da porta da instância do Redis que criar. Vai usar estas informações quando criar um cliente Redis no seu código.

  3. Crie uma instância do Redis no Memorystore.

    Quando lhe for pedido que selecione uma região para a sua instância do Redis, selecione a mesma região em que a sua app do App Engine está localizada.

Instalar dependências

Para usar a biblioteca cliente redis-py:

  1. Atualize o ficheiro app.yaml. Siga as instruções para a sua versão do Python:

    Python 2

    Para apps Python 2, adicione as versões mais recentes das bibliotecas grpcio e setuptools.

    Segue-se um exemplo de um ficheiro app.yaml:

    runtime: python27
    threadsafe: yes
    api_version: 1
    
    libraries:
    - name: grpcio
      version: latest
    - name: setuptools
      version: latest
    

    Python 3

    Para apps Python 3, especifique o elemento runtime no ficheiro app.yaml com uma versão do Python 3 suportada. Por exemplo:

    runtime: python310 # or another support version
    

    O tempo de execução do Python 3 instala bibliotecas automaticamente, pelo que não tem de especificar bibliotecas incorporadas do tempo de execução do Python 2 anterior. Se a sua app Python 3 estiver a usar outros serviços incluídos legados durante a migração, pode continuar a especificar as bibliotecas incorporadas necessárias. Caso contrário, pode eliminar as linhas desnecessárias no ficheiro app.yaml.

  2. Atualize o ficheiro requirements.txt. Siga as instruções para a sua versão do Python:

    Python 2

    Adicione as bibliotecas de cliente da Google Cloud para o Memorystore for Redis à sua lista de dependências no ficheiro requirements.txt.

    redis
    

    Execute pip install -t lib -r requirements.txt para atualizar a lista de bibliotecas disponíveis para a sua app.

    Python 3

    Adicione as bibliotecas de cliente da Google Cloud para o Memorystore for Redis à sua lista de dependências no ficheiro requirements.txt.

    redis
    

    O App Engine instala automaticamente estas dependências durante a implementação da app no runtime do Python 3. Por isso, elimine a pasta lib, se existir.

  3. Para apps Python 2, se a sua app estiver a usar bibliotecas incorporadas ou copiadas especificadas no diretório lib, tem de especificar esses caminhos no ficheiro appengine_config.py, localizado na mesma pasta que o ficheiro 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)
    

Criar um cliente Redis

Para interagir com uma base de dados Redis, o seu código tem de criar um cliente Redis para gerir a ligação à sua base de dados Redis. As secções seguintes descrevem como criar um cliente Redis com a biblioteca cliente redis-py.

Especificar variáveis de ambiente

A biblioteca cliente redis-py usa duas variáveis de ambiente para criar o URL da sua base de dados Redis:

  • Uma variável para identificar o endereço IP da base de dados Redis que criou no Memorystore.
  • Uma variável para identificar o número da porta da base de dados Redis que criou no Memorystore.

Recomendamos que defina estas variáveis no ficheiro app.yaml da sua app em vez de as definir diretamente no código. Isto facilita a execução da sua app em diferentes ambientes, como um ambiente local e o App Engine.

Por exemplo, adicione as seguintes linhas ao ficheiro app.yaml:

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

Importar o redis-py e criar o cliente

Depois de definir as variáveis de ambiente REDISHOST e REDISPORT, use as seguintes linhas para importar a biblioteca redis-py e criar um cliente:

  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 usou uma versão mais antiga do redis-py para outras apps, pode ter usado a classe StrictClient em vez de Client. No entanto, agora, o redis-py recomenda o Client em vez do StrictClient.

Usar comandos Redis para armazenar e obter dados na cache

Embora a base de dados Redis do Memorystore suporte a maioria dos comandos Redis, só precisa de usar alguns comandos para armazenar e obter dados da cache. A tabela seguinte sugere comandos do Redis que pode usar para colocar dados em cache. Para ver como chamar estes comandos a partir da sua app, consulte a documentação da biblioteca de cliente.

Tenha em atenção que, para apps Python 2, embora o Memcache ofereça alternativas assíncronas para muitos dos seus comandos, a biblioteca cliente redis-py nem sempre oferece métodos assíncronos equivalentes. Se precisar que todas as interações com a cache sejam assíncronas, estão disponíveis outras bibliotecas cliente do Redis para Python.

Tarefa Comando Redis
Crie uma entrada na cache de dados e
defina um tempo de validade para a entrada
SETNX
MSETNX
Recupere dados da cache GET
MGET
Substituir valores de cache existentes SET
MSET
Aumentar ou diminuir valores numéricos da cache INCR
INCRBY
DECR
DECRBY
Elimine entradas da cache DEL
UNLINK
Suporte interações simultâneas com a cache (compare and set) Veja detalhes sobre as transações Redis. Tenha em atenção que a biblioteca do cliente `redis-py` requer que todas as transações ocorram numa pipeline.

Testar as atualizações

Quando testa a sua app localmente, considere executar uma instância local do Redis para evitar interagir com dados de produção (o Memorystore não fornece um emulador). Para instalar e executar o Redis localmente, siga as instruções na documentação do Redis. Tenha em atenção que, atualmente, não é possível executar o Redis localmente no Windows.

Para mais informações sobre os testes de apps Python, consulte o artigo Usar o servidor de desenvolvimento local.

Implementar a sua app

Assim que a app estiver a ser executada no servidor de desenvolvimento local sem erros:

  1. Teste a app no App Engine.

  2. Se a app for executada sem erros, use a divisão de tráfego para aumentar gradualmente o tráfego para a app atualizada. Monitorize atentamente a app para detetar problemas na base de dados antes de encaminhar mais tráfego para a app atualizada.

O que se segue?