Bottlenecks – Escalabilidade e Desempenho
Este documento consolida as estratégias de balanceamento de carga e cache distribuído utilizadas no ecossistema store-api, responsáveis por mitigar gargalos de desempenho e garantir resiliência e alta disponibilidade no ambiente Kubernetes da AWS (EKS).
1. Load Balancer (AWS EKS)
O Gateway Service atua como ponto de entrada único para todas as requisições externas ao cluster.
Ele é configurado com um Service Kubernetes do tipo LoadBalancer, que instrui o EKS (Elastic Kubernetes Service) a criar automaticamente um Elastic Load Balancer (ELB) na AWS.
🔹 Fluxo de tráfego
flowchart LR
user(("Usuario")) -->|HTTP/HTTPS| aws["ELB / AWS LoadBalancer"]
aws --> gw["Gateway Service"]
gw --> acc["Account"]
gw --> aut["Auth"]
gw --> ord["Order"]
gw --> prod["Product"]
gw --> exch["Exchange"] 🔹 Configuração do Gateway
Para detalhes completos sobre o deployment e o service do gateway, consulte a documentação do Gateway API.
2. Cache Distribuído (Redis)
O Product Service utiliza o Redis como camada de cache distribuído, reduzindo a latência e o número de leituras diretas no banco PostgreSQL.
O cache é implementado por meio da abstração de cache do Spring Boot, com gerenciamento centralizado pelo RedisCacheManager.
2.1 Arquitetura do cache
graph LR
client[Client / Gateway] --> product[Product Service]
product --> redis[(Redis Cache)]
product --> db[(PostgreSQL)]
redis -- HIT --> product
redis -- MISS --> db
db --> redis 2.2 Funcionamento
| Tipo de Operação | Estratégia de Cache | TTL |
|---|---|---|
findAll() | Cache da lista completa (products-list) | 2 minutos |
findById(id) | Cache individual (product-by-id) | 10 minutos |
create() / delete() | Evict automático das chaves afetadas | — |
Para a implementação detalhada do código-fonte e das anotações
@Cacheable/@CacheEvict, consulte o Product API.
3. Redis no Kubernetes
O Redis roda em um Deployment dedicado, com exposição interna via Service ClusterIP para consumo pelos microserviços do cluster.
🔹 redis/k8s.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: redis
spec:
replicas: 1
selector:
matchLabels:
app: redis
template:
metadata:
labels:
app: redis
spec:
containers:
- name: redis
image: redis:latest
ports:
- containerPort: 6379
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "100m"
---
apiVersion: v1
kind: Service
metadata:
name: redis
spec:
type: ClusterIP
ports:
- port: 6379
targetPort: 6379
selector:
app: redis
O Service
redisé resolvido via DNS interno (redis.store.svc.cluster.local) e acessado pelos serviços viaspring.data.redis.host=redis.
4. Integração com o Product-Service
O Product Service define as variáveis de ambiente necessárias para conectar-se ao Redis.
O trecho abaixo mostra apenas as variáveis relevantes — o deployment completo pode ser visto na documentação do Product API.
env:
- name: SPRING_CACHE_TYPE
value: redis
- name: SPRING_DATA_REDIS_HOST
value: redis
- name: SPRING_DATA_REDIS_PORT
value: "6379"
5. Benefícios Combinados
| Estratégia | Componente | Resultado |
|---|---|---|
| Load Balancer (ELB) | Gateway Service | Alta disponibilidade e distribuição automática de tráfego |
| Redis Cache | Product Service | Redução drástica de latência em GET /product e menor carga no PostgreSQL |
| ClusterIP Services | Todos os microserviços internos | Comunicação eficiente e segura dentro do cluster |
| K8s Horizontal Scaling | Gateway e serviços stateless | Escalabilidade horizontal conforme demanda |
6. Diagrama Consolidado
flowchart LR
user((Usuário)) --> lb[AWS ELB]
lb --> gw[Gateway Service]
gw --> ps[Product Service]
ps --> redis[(Redis Cache)]
ps --> db[(PostgreSQL)]
gw --> other[Demais microserviços internos] ✅ Conclusão
A arquitetura de Bottlenecks integra: - Elastic Load Balancer (ELB) — distribuindo o tráfego no nível de entrada com resiliência automática no EKS.
- Redis Cache — otimizando leituras, reduzindo tempo de resposta e consumo de banco de dados.
- ClusterIP interno — garantindo comunicação segura entre serviços, sem exposição externa desnecessária.
Essas estratégias combinadas reduzem significativamente a latência, aumentam a disponibilidade e preparam o ambiente store-api para escalar horizontalmente sob alta demanda.