Adicionar um cache à consulta de produtos

AWSBeginner
Pratique Agora

Introdução

A aplicação lê o catálogo no DynamoDB a cada solicitação. Adicione um nó Amazon ElastiCache com Valkey para reutilizar os dados de um produto. Comprove a mudança comparando a origem das respostas e o número real de leituras.

Conclua primeiro AWS Foundations for Beginners e as operações básicas de itens em AWS DynamoDB for Beginners. Este ambiente independente fornece aplicação, catálogo e rede. Use Terminal para comandos e AWS View para observar nós, registros e respostas. A AWS CLI já está configurada; você não precisa de uma conta pessoal nem de recursos de outro laboratório.

Relação com a certificação

Certificação Tarefa do exame Prática
Cloud Practitioner (CLF-C02) Task 3.4 Distinguir o cache em memória dos dados de referência e observar o comportamento da aplicação.

Visão conceitual deste laboratório

Observar a origem dos produtos

Um cache mantém dados reutilizáveis na memória. O banco continua sendo a fonte de verdade: perder uma cópia em cache não deve apagar o registro do catálogo. Primeiro observe a aplicação sem cache.

Entre no projeto e confirme a identidade configurada:

cd /home/labex/project
aws sts \
  get-caller-identity

O ARN termina em labex-ca01-operator e identifica este ambiente. Leia diretamente o produto 101. O DynamoDB representa strings com S e números com N:

aws dynamodb \
  get-item \
  --table-name product-catalog \
  --key '{"product_id":{"S":"101"}}' \
  --consistent-read

Travel mug custa 20.00. O produto 202, Notebook, é independente e deve permanecer intacto. A aplicação HTTP retorna JSON do produto. Solicite-o duas vezes:

curl -sS http://127.0.0.1:8080/api/products/101
curl -sS http://127.0.0.1:8080/api/products/101

Ambas as respostas incluem "served_from":"source". Em AWS View, o contador aumenta em dois e o cartão ElastiCache ainda não tem cluster. Uma leitura corresponde a uma solicitação real ao DynamoDB, não à medição de uma cobrança AWS. Send request também envia uma solicitação real e pode alterar o contador. Compare se ele aumenta, em vez de exigir um valor final fixo. Exemplo de AWS View antes do cache: as solicitações usam a origem. Seu contador pode diferir.

Criar um nó Valkey

Amazon ElastiCache gerencia mecanismos de cache em memória. Valkey armazena valores por chave; aqui, o ID do produto identifica sua cópia. Você usará um nó independente. O grupo de sub-redes indica a localização preparada e o grupo de segurança fornece a configuração de rede. O curso de VPC aborda o projeto das regras.

Leia os identificadores deste ambiente novo:

cat resources.json

Salve e exiba o ID do grupo de segurança. $(...) guarda a saída de um comando para a operação seguinte:

CACHE_GROUP_ID=$(jq -r .security_group_id resources.json)
echo "$CACHE_GROUP_ID"

Crie o pequeno cache de um nó identificado por product-cache. O mecanismo e a quantidade de nós selecionam a configuração Valkey do curso:

aws elasticache \
  create-cache-cluster \
  --cache-cluster-id product-cache \
  --engine valkey \
  --engine-version 7.2 \
  --cache-node-type cache.t3.micro \
  --num-cache-nodes 1 \
  --cache-subnet-group-name product-cache-network \
  --security-group-ids "$CACHE_GROUP_ID"

Observe CacheClusterStatus e consulte o endpoint, endereço e porta de conexão:

aws elasticache \
  describe-cache-clusters \
  --cache-cluster-id product-cache \
  --show-cache-node-info \
  --query 'CacheClusters[0].{Status:CacheClusterStatus,Nodes:CacheNodes}'

Continue quando o cluster estiver available e o nó 0001 tiver endpoint. Se ainda estiver sendo criado, aguarde brevemente e repita a consulta. Salve e exiba o endereço real:

CACHE_HOST=$(aws elasticache \
  describe-cache-clusters \
  --cache-cluster-id product-cache \
  --show-cache-node-info \
  --query 'CacheClusters[0].CacheNodes[0].Endpoint.Address' \
  --output text)
echo "$CACHE_HOST"

Teste a conexão com o cliente Valkey fornecido:

valkey-cli -h "$CACHE_HOST" -p 6379 PING

PONG comprova que o mecanismo respondeu, mas ainda não que a aplicação o utiliza. AWS View mostra o nó e o endpoint reais.

Conectar a aplicação e observar um acerto

Com cache-aside, a aplicação procura primeiro product:101 no cache. Uma chave ausente é um miss: ela lê DynamoDB e guarda o produto. Um hit, ou acerto, posterior retorna a cópia sem outra leitura da origem.

app.json contém configurações comuns. Use jq para mudar o modo e o endpoint, escreva um arquivo temporário e substitua a configuração:

jq --arg host "$CACHE_HOST" \
  '.mode = "cache-aside" | .cache_host = $host' \
  app.json > app.next.json
mv app.next.json app.json

Inspecione o resultado:

cat app.json

A configuração é lida a cada solicitação, sem reiniciar. ttl_seconds é a duração da cópia; o próximo laboratório explora expiração e atualização. Solicite uma vez o produto:

curl -sS http://127.0.0.1:8080/api/products/101

A primeira resposta indica served_from: source, pois o novo cache está vazio. Observe o contador em AWS View e repita:

curl -sS http://127.0.0.1:8080/api/products/101

A resposta indica served_from: cache, com o mesmo ID, nome e preço, e o contador não aumenta. Se você já solicitou o produto no AWS View, o primeiro comando pode ser um hit. Compare solicitações consecutivas depois de preencher o cache. Leia o valor realmente armazenado:

valkey-cli -h "$CACHE_HOST" -p 6379 GET product:101

O JSON corresponde ao registro de Travel mug. Isso demonstra menos acessos à origem nesta consulta repetida, sem estabelecer latência, capacidade ou disponibilidade de produção. Mantenha aplicação e nó ativos para verificar. O ambiente é descartável; em uma conta AWS real, remova caches desnecessários para interromper custos contínuos. Exemplo de AWS View após conectar: o cache retorna o mesmo preço sem outra leitura da origem.

Resumo

Você criou um nó Valkey, conectou a aplicação e observou misses e hits de cache-aside. A cópia corresponde ao DynamoDB e os hits evitam novas leituras. Em seguida, explore a atualização dos dados com TTL e invalidação explícita.

Para aprofundar o tema, consulte a documentação da AWS: Fluxo de dados cache-aside; Selecionar um endpoint de conexão do cache.