Da Black Friday que derruba o monolito ao auto-scaling que distribui a carga cirurgicamente — entenda como arquitetura, caching e balanceamento de carga definem a sobrevivência de sistemas em produção.
Por que sistemas que funcionam perfeitamente em desenvolvimento travam em produção?
Um sistema de e-commerce funciona impecavelmente durante os testes: 50 usuários simultâneos, tempo de resposta abaixo de 200ms, zero erros. Chega a Black Friday — 50.000 usuários simultâneos — e o sistema para. Completamente. O problema não estava no código. Estava na arquitetura de escalabilidade, que nunca foi projetada para crescer.
Escalabilidade e performance não são otimizações de último minuto. São decisões arquiteturais tomadas no início — ou pagas com juros altos em produção. Esta aula fecha o ciclo iniciado em [SIS]ANO2C2B2S8A1 (arquiteturas) e [SIS]ANO2C2B2S8A2 (design patterns): agora vamos entender como os sistemas crescem — e por que alguns sobrevivem a esse crescimento enquanto outros colapsam.
Como ensinar escalabilidade no ensino médio técnico com recursos limitados?
A aula [SIS]ANO2C2B2S8A3 fecha a unidade de arquitetura de back-end com uma síntese prática. Em 45 minutos, com Google Colab como único ambiente necessário, os estudantes implementam uma loja on-line monolítica, refatoram para microsserviços e analisam o impacto em escalabilidade e performance. O conceito de auto-scaling, que em produção exige Kubernetes e AWS, é representado por um loop Python que simula carga variável — abstração precisa sem perda conceitual.
Capacidade de um sistema crescer em capacidade para lidar com aumento de carga de trabalho — horizontalmente (adicionando instâncias) ou verticalmente (aumentando recursos de uma instância única).
Medida de quão rápido e eficiente um sistema responde a requisições — expressa em latência (tempo de resposta), throughput (requisições por segundo) e eficiência de uso de recursos.
Quais são as dimensões de escalabilidade e performance em cada arquitetura?
| DIMENSÃO | MONOLÍTICA | MICROSSERVIÇOS |
|---|---|---|
| Escalabilidade horizontal | Difícil — toda a aplicação precisa ser replicada mesmo que apenas um módulo esteja sobrecarregado | Natural — cada serviço escala independentemente com base em sua carga específica |
| Escalabilidade vertical | Limitada pelo hardware do servidor único — ponto de falha e custo crescente | Complementar — serviços específicos podem ter recursos maiores conforme necessidade |
| Latência | Baixa internamente — chamadas em memória sem overhead de rede | Adicional — comunicação entre serviços introduz latência de rede (mitigável com caching) |
| Gargalos | Um módulo lento afeta todo o sistema — sem isolamento de performance | Gargalos são isolados por serviço — podem ser otimizados independentemente |
| Resiliência a falhas | Uma falha compromete todo o sistema — downtime total | Falha em um serviço não compromete os demais — Circuit Breaker mitiga cascata |
| Custo de escala | Alto — escala ineficiente de módulos não sobrecarregados | Otimizado — apenas os serviços necessários consomem recursos adicionais |
Estratégias de otimização: o que vai além da arquitetura
Cache em pontos críticos
Armazena resultados de operações frequentes em memória — Redis, Memcached. Reduz consultas ao banco de dados e tempo de resposta. Fundamental para catálogos de produtos e perfis de usuário.
Balanceamento de carga
Distribui requisições entre múltiplas instâncias de forma eficiente — round-robin, least connections, IP hash. Evita sobrecarga em uma única instância e maximiza throughput.
Elasticidade automática
Serviços aumentam ou diminuem instâncias automaticamente com base na demanda em tempo real. Otimiza custo e garante performance consistente sob cargas variáveis.
Monitoramento e métricas
Identificar gargalos proativamente — Prometheus, Grafana, Datadog. Sem métricas, escalabilidade é reativa. Com métricas, é preditiva e proativa.
Como implementar e comparar as duas arquiteturas em Python?
Passo 1 — Loja on-line monolítica
# Monolito — todas as responsabilidades centralizadas
class OnlineStore:
def __init__(self):
self.users = []; self.products = []; self.orders = []
def register_user(self, user): self.users.append(user)
def add_product(self, product): self.products.append(product)
def place_order(self, user, product):
if product in self.products:
self.orders.append((user, product))
return "Order placed successfully"
return "Product not available"
# Teste de carga simulada — 100 pedidos consecutivos
store = OnlineStore()
store.register_user("Alice"); store.add_product("Laptop")
for i in range(100):
print(store.place_order("Alice", "Laptop"))
Passo 2 — Refatoração para microsserviços com análise de performance
# Microsserviços — cada responsabilidade isolada e escalável
class UserService:
def __init__(self): self.users = []
def register_user(self, user): self.users.append(user)
class ProductService:
def __init__(self): self.products = []
def add_product(self, product): self.products.append(product)
def check_availability(self, product):
return product in self.products
class OrderService:
def __init__(self): self.orders = []
def place_order(self, user, product, product_service):
if product_service.check_availability(product):
self.orders.append((user, product))
return "Order placed successfully"
return "Product not available"
# Teste de carga simulada — 100 pedidos
user_svc = UserService(); prod_svc = ProductService(); ord_svc = OrderService()
user_svc.register_user("Alice"); prod_svc.add_product("Laptop")
for i in range(100):
print(ord_svc.place_order("Alice", "Laptop", prod_svc))
place_order virar um gargalo com 100.000 requisições/segundo, você precisa replicar toda a loja. Nos microsserviços, apenas OrderService precisa de mais instâncias — UserService e ProductService continuam com um único processo enquanto a demanda por eles não crescer.Como esses conceitos aparecem em um cenário pedagógico real?
Loja on-line sob pressão: simulando a Black Friday com Python
- Fase 1 — monolito: implementar
OnlineStorecompleto e executar o loop de 100 pedidos. Medir: qual parte do código seria o gargalo se o loop fosse de 100.000 iterações? - Fase 2 — microsserviços: refatorar para três serviços independentes. Executar o mesmo loop. Discutir: quais serviços precisariam de mais instâncias sob carga alta?
- Fase 3 — otimização: propor melhorias — onde colocar cache? Qual serviço se beneficiaria de balanceamento de carga? Como o auto-scaling ajudaria?
De aula de escalabilidade a ativo pedagógico e intelectual
Evoluir a loja para uma API REST com Flask + Redis para cache. Simular auto-scaling com threads Python. Conectar com a aula de segurança para rate limiting.
Série “Arquitetura que sobrevive à Black Friday” — casos reais de sistemas que caíram e o que a arquitetura tinha (ou não tinha) de diferente.
Projeto integrado: alunos constroem um sistema de eventos para a escola e testam escalabilidade simulando toda a turma acessando simultaneamente.
Oficina: como ensinar escalabilidade sem infraestrutura de nuvem — Python, loops e métricas de tempo são suficientes para construir a intuição correta.
Perguntas frequentes sobre escalabilidade e performance
Acesse todos os materiais do Curso Técnico
Roteiros de aula prática, slides, projetos maker e reflexões sobre IA na escola pública.
→ professorcomia.com.brEscalabilidade como mentalidade de engenheiro, não de programador
A diferença entre um programador e um engenheiro de software não está na quantidade de código que conhece. Está em saber, antes de escrever a primeira linha, como aquele sistema vai se comportar com dez vezes mais usuários, com um serviço falhando, com um pico de acesso inesperado. Escalabilidade e performance são as perguntas que engenheiros fazem antes de codificar — e que programadores descobrem tarde demais em produção.
>_ slides da aula
[SIS]ANO2C2B2S8A3 · escalabilidade e performance · 2º ano · aula 8.3