Escalabilidade e Performance | [SIS]ANO2C2B2S8A3
[ SIS ] ANO2C2B2S8A3·Unidade 2 · Componente 2 · Aula 8.3·Ensino Médio Técnico — Desenvolvimento de Sistemas

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.

PythonBack-end EscalabilidadePerformance SEDUC-SP

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.

Custo concreto de ignorar escalabilidade: o Amazon Retail registrou que cada 100ms de latência adicional equivale a 1% de perda em vendas. Em 2021, uma queda de 45 minutos da AWS custou aproximadamente US$ 66 milhões em perdas diretas. Escalabilidade não é uma feature — é uma decisão de sobrevivência do negócio.

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.

≡ definição · escalabilidade

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).

≡ definição · performance

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ÃOMONOLÍTICAMICROSSERVIÇOS
Escalabilidade horizontalDifícil — toda a aplicação precisa ser replicada mesmo que apenas um módulo esteja sobrecarregadoNatural — cada serviço escala independentemente com base em sua carga específica
Escalabilidade verticalLimitada pelo hardware do servidor único — ponto de falha e custo crescenteComplementar — serviços específicos podem ter recursos maiores conforme necessidade
LatênciaBaixa internamente — chamadas em memória sem overhead de redeAdicional — comunicação entre serviços introduz latência de rede (mitigável com caching)
GargalosUm módulo lento afeta todo o sistema — sem isolamento de performanceGargalos são isolados por serviço — podem ser otimizados independentemente
Resiliência a falhasUma falha compromete todo o sistema — downtime totalFalha em um serviço não compromete os demais — Circuit Breaker mitiga cascata
Custo de escalaAlto — escala ineficiente de módulos não sobrecarregadosOtimizado — apenas os serviços necessários consomem recursos adicionais

Estratégias de otimização: o que vai além da arquitetura

técnica · caching

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.

técnica · load balancing

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.

técnica · auto-scaling

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.

técnica · observabilidade

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

online_store_monolito.py
# 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

online_store_microsservicos.py
# 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))
Análise comparativa: o output é idêntico nas duas versões. A diferença está na capacidade de escala: no monolito, se 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?

! caso real · roteiro de aula prática — grupos de 4 pessoas · 45 minutos

Loja on-line sob pressão: simulando a Black Friday com Python

  • Fase 1 — monolito: implementar OnlineStore completo 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?
→ expansão estratégica · 4 frentes

De aula de escalabilidade a ativo pedagógico e intelectual

{ }Curso Técnico

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.

Blog / Autoridade

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.

[ ]Cultura Maker

Projeto integrado: alunos constroem um sistema de eventos para a escola e testam escalabilidade simulando toda a turma acessando simultaneamente.

>_Formação Docente

Oficina: como ensinar escalabilidade sem infraestrutura de nuvem — Python, loops e métricas de tempo são suficientes para construir a intuição correta.

Síntese da aula: escalabilidade não é um problema de infraestrutura — é uma consequência de decisões arquiteturais. Sistemas monolíticos não são inerentemente ruins para performance, mas impõem limites estruturais ao crescimento. Microsserviços oferecem escala granular ao custo de complexidade operacional. Caching, balanceamento de carga e auto-scaling são as ferramentas que tornam essa promessa real em produção.

Perguntas frequentes sobre escalabilidade e performance

O que é escalabilidade em sistemas de software?
Escalabilidade é a capacidade de um sistema crescer em capacidade para lidar com aumento de carga de trabalho. Pode ser horizontal (adicionando mais instâncias) ou vertical (aumentando recursos de uma única instância).
Qual a diferença entre escalabilidade horizontal e vertical?
Escalabilidade horizontal distribui a carga adicionando novas instâncias. Escalabilidade vertical aumenta os recursos de uma única instância. A horizontal é mais resiliente e sem limite físico; a vertical tem teto de hardware e cria ponto único de falha.
Como microsserviços melhoram a escalabilidade?
Em microsserviços, cada serviço escala independentemente com base em sua carga específica. Durante a Black Friday, apenas serviços de pedidos e pagamentos precisam de mais instâncias — sem replicar toda a aplicação.
O que é caching e por que melhora a performance?
Caching armazena resultados de operações frequentes em memória, evitando reprocessamento ou consultas repetidas ao banco de dados. Reduz tempo de resposta e alivia carga sobre os serviços em pontos críticos do sistema.
Quais são os principais gargalos de performance em uma arquitetura monolítica?
Em arquiteturas monolíticas, os principais gargalos são interdependência entre módulos (um módulo lento afeta todo o sistema), ausência de escala independente, acúmulo de estado compartilhado e ausência de isolamento de falhas.

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.br

Escalabilidade 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.

// código da aula: [SIS]ANO2C2B2S8A3 · unidade 2 · componente 2 · aula 8.3
// escalabilidade e performance · seduc-sp · curso técnico desenvolvimento de sistemas
// publicado em: professorcomia.com.br · diariodeumpoed.com.br · poed · 2024

>_ slides da aula

[SIS]ANO2C2B2S8A3 · escalabilidade e performance · 2º ano · aula 8.3

slide 01
abertura

>_ Arquitetura de Aplicações Back-end — Aula 8.3

FREQUÊNCIA — registre sua presença no AVA antes de iniciar
  • Código: [SIS]ANO2C2B2S8A3 — Unidade 2 · Componente 2
  • Fechando o ciclo: arquitetura (8.1) → design patterns (8.2) → escalabilidade e performance (8.3)
  • Tema da semana: aplicar técnicas de escalabilidade e otimização de performance em arquiteturas reais
? pergunta provocadora — antes de qualquer slide Você já tentou acessar um site durante uma promoção e ele ficou fora do ar? O que você acha que aconteceu no servidor? Quem é o culpado — o desenvolvedor, o gerente ou a arquitetura?
slide 02
objetivos

[ ] O que vamos construir hoje

conceitual

Diferenciar escalabilidade horizontal e vertical — e identificar como cada arquitetura (monolito/microsserviços) as suporta de forma distinta.

procedimental

Implementar em Python uma loja on-line monolítica, refatorar para microsserviços e comparar escalabilidade e performance das duas versões.

atitudinal

Desenvolver pensamento crítico para propor otimizações de performance — caching, balanceamento de carga, auto-scaling — em cenários reais.

≡ recursos · computador · Google Colab · caderno · roteiro da aula prática
slide 03
problema_gerador

! A Black Friday que derruba o e-commerce

monolito sob pressão

Sistema de e-commerce monolítico funcionando perfeitamente com 500 usuários. Na Black Friday, 50.000 acessam simultaneamente. O servidor principal trava — não existe forma de escalar apenas o módulo de pedidos sem replicar tudo.

microsserviços sob pressão

Mesmo e-commerce em microsserviços. Na Black Friday, o serviço de pedidos recebe 10× mais carga — apenas ele é escalado automaticamente. Usuários e produtos continuam com uma instância. Custo e performance otimizados.

? 5 minutos — no caderno, antes de codificar Se você fosse o arquiteto desse e-commerce e tivesse que garantir que ele sobreviva à Black Friday com o menor custo possível: o que você mudaria primeiro — a arquitetura, o servidor ou o código?
slide 04
conceito

Escalabilidade: horizontal vs. vertical

  • Escalabilidade horizontal: adicionar mais instâncias do serviço — scale out. Sem limite físico teórico. Base do cloud computing moderno
  • Escalabilidade vertical: aumentar recursos de uma única instância — scale up. Limitada pelo hardware máximo disponível. Cria ponto único de falha
  • Monolito: só escala verticalmente ou replicando tudo — caro e ineficiente sob cargas parcialmente distribuídas
  • Microsserviços: escala horizontal granular — apenas o serviço sobrecarregado recebe mais instâncias
01

Um servidor de R$ 5.000/mês aguenta 10.000 usuários. Dois servidores de R$ 2.500 aguentam 20.000. Qual a diferença entre esses dois casos? Por que a segunda opção escala melhor?

02

Se escalabilidade horizontal é “melhor”, por que muitas empresas ainda usam escala vertical? O que justifica pagar por um servidor mais potente em vez de dois menores?

slide 05
conceito

Performance: latência, throughput e gargalos

  • Latência: tempo entre a requisição e a resposta — medido em ms. No monolito, chamadas são em memória (rápidas). Em microsserviços, passam pela rede (overhead adicional)
  • Throughput: número de requisições processadas por segundo — aumenta com escala horizontal
  • Gargalo no monolito: módulo lento (ex: pagamento) bloqueia todo o sistema — sem isolamento
  • Gargalo em microsserviços: isolado por serviço — pode ser otimizado ou escalado independentemente sem afetar os demais
01

No sistema monolítico: se o módulo de pagamento demorar 3 segundos por transação, quanto tempo um usuário espera para apenas visualizar o catálogo de produtos? Por que isso é um problema estrutural?

02

Em microsserviços, a comunicação via rede adiciona latência. Existe um ponto onde o overhead da comunicação torna os microsserviços mais lentos que o monolito? Como saber quando esse ponto foi atingido?

slide 06
conceito

{ } Técnicas de otimização além da arquitetura

  • Caching: armazenar resultados frequentes em memória (Redis) — reduz consultas ao BD e tempo de resposta em pontos críticos
  • Balanceamento de carga: distribuir requisições entre instâncias — round-robin, least connections. Evita sobrecarga e maximiza throughput
  • Auto-scaling: elasticidade automática — serviços aumentam instâncias com a demanda e as reduzem quando a carga cai
  • Observabilidade: métricas proativas (Prometheus, Grafana) — identificar gargalos antes que virem incidentes
01

No e-commerce, o catálogo de produtos raramente muda mas é consultado milhares de vezes por segundo. Onde exatamente você colocaria cache? O que poderia dar errado se o cache mostrar um produto esgotado que voltou ao estoque?

02

Auto-scaling soa como a solução perfeita. Qual o principal risco de configurar escala automática sem limites máximos? Já ouviu falar em “bill choque” na nuvem?

slide 07
caderno

Glossário — Escalabilidade e Performance

  • Escalabilidade horizontal adicionar instâncias do serviço (scale out) — base do cloud computing
  • Escalabilidade vertical aumentar recursos de uma instância (scale up) — limitada e cria ponto único de falha
  • Latência tempo entre requisição e resposta — ms. Menor no monolito (memória), maior em microsserviços (rede)
  • Throughput número de requisições processadas por segundo — aumenta com escala horizontal
  • Caching armazenar resultados frequentes em memória para evitar reprocessamento
  • Auto-scaling elasticidade automática — instâncias sobem e descem com base na demanda real
  • Gargalo ponto do sistema que limita a performance geral — identificado via métricas e observabilidade
? escreva no caderno antes de avançar
  • Qual desses conceitos você já percebeu na prática — em um app que usou e ficou lento ou fora do ar? O que você acredita que causou o problema?
  • Caching resolve gargalos de performance. Mas quando ele pode piorar a experiência do usuário?
slide 08
contexto_atividade · aula prática

{ } Aula Prática — Loja on-line sob carga variável

  • Cenário: construir uma loja on-line em Python — primeiro monolítica, depois refatorada para microsserviços — e analisar comportamento sob carga simulada
  • Objetivo: observar como a arquitetura escolhida afeta escalabilidade e performance ao processar múltiplos pedidos consecutivos
  • Formato: grupos de 4 pessoas · 45 minutos · roteiro da aula prática
  • Ferramenta: Google Colab — sem instalação, acesso pelo navegador
01

Antes de codificar: no loop de 100 pedidos, qual parte do monolito seria o gargalo com 100.000 iterações? Escreva sua previsão — você vai conferir ao final da atividade.

02

Nos microsserviços: ao processar 100.000 pedidos, qual dos três serviços (User, Product, Order) precisaria de mais instâncias? Os outros dois precisariam escalar também? Por quê?

slide 09
planejamento

Planejamento — estrutura antes do código

Antes de digitar, esboce no papel. Quais classes? Quais métodos? Onde está o gargalo potencial de cada versão?

SERVIÇO / CLASSERESPONSABILIDADEMÉTODO CRÍTICOGARGALO POTENCIAL
OnlineStoreTudo centralizado (monolito)place_order()Todo o objeto sob carga alta
UserServiceCadastro de usuáriosregister_user()Baixo — poucas chamadas
ProductServiceCatálogo e disponibilidadecheck_availability()Médio — consulta frequente
OrderServiceProcessamento de pedidosplace_order()Alto — chamado a cada transação
? antes de codificar Baseado na tabela: qual serviço se beneficiaria mais de caching? Qual deveria ser o primeiro a receber auto-scaling em um pico de acessos?
slide 10
algoritmo

>_ Fluxo lógico — 3 passos da atividade

  • Passo 1 — Monolito: implementar OnlineStore com register_user, add_product e place_order — executar loop de 100 pedidos e observar comportamento
  • Passo 2 — Microsserviços: extrair para UserService, ProductService e OrderService — executar mesmo loop com injeção de dependência
  • Passo 3 — Análise: comparar as duas arquiteturas, identificar gargalos e propor otimizações (caching, load balancing, auto-scaling)
simulação de carga — linhas críticas
# Simular carga — mesmo loop para as duas versões
for i in range(100):
    print(store.place_order("Alice", "Laptop"))
# Pergunta-chave: qual versão escala melhor com 100.000?
slide 11
implementacao

Implementação — Google Colab, passo a passo

  • Acesse: colab.research.google.com → Novo notebook → renomeie para escalabilidade.ipynb
  • Célula 1: cole e execute o código do Passo 1 (OnlineStore) com o loop de 100 pedidos
  • Célula 2: cole e execute o código do Passo 2 (três serviços) com o mesmo loop — output deve ser idêntico
  • Célula 3: proposta de otimização — adicione um dicionário como cache simples para check_availability() e meça a diferença com 10.000 iterações
01

A Célula 3 não está no roteiro original — é um desafio extra. O que você esperaria que mudasse na performance com o cache? Como medir essa diferença apenas com Python puro, sem bibliotecas externas?

slide 12
testes

! Testes — 3 cenários de análise comparativa

carga normal

100 pedidos consecutivos — monolito e microsserviços

→ output idêntico: “Order placed successfully” × 100

produto indisponível

Pedido de produto não cadastrado — ambas versões

→ “Product not available” — comportamento idêntico

análise arquitetural

Com 100.000 iterações: qual serviço escala? Onde está o gargalo? O que cache resolveria?

→ resposta escrita no caderno + roteiro

? análise final do grupo — antes de entregar Como a refatoração para microsserviços afetou a escalabilidade? Quais foram as principais diferenças de performance? Que outros aspectos poderiam ser otimizados para melhorar ainda mais? Responda no roteiro com linguagem técnica precisa.
slide 13
entrega_ava

Entrega — O que enviar no AVA

o que enviar
  • Roteiro preenchido com nome e turma
  • Link ou print do notebook Colab com os 3 passos
  • Respostas escritas às 3 perguntas de reflexão
  • Print do output dos testes de carga (100 iterações)
critérios de avaliação
  • Código funcional — output correto nas duas versões
  • Análise escrita — diferença de performance fundamentada
  • Proposta de otimização — caching, balanceamento ou auto-scaling
  • Participação ativa e contribuição ao debate do grupo
⌨ entrega · roteiro + notebook Colab + análise de performance · AVA · prazo: conforme calendário da turma
slide 14
síntese

Então ficamos assim…

Escalabilidade em microsserviços

Refatoração para microsserviços permite escalar serviços individualmente com base na carga específica — otimizando custo e capacidade sem replicar toda a aplicação.

Diferenças de performance

Monolito tem menor latência interna mas gargalos sem isolamento. Microsserviços introduzem latência de rede mas permitem otimizações cirúrgicas por serviço.

{ }Otimizações além da arquitetura

Caching, balanceamento de carga, auto-scaling e observabilidade são as ferramentas que tornam as promessas de escalabilidade reais em sistemas de produção.

← aula anterior

Design patterns (8.2) — Singleton, Factory Method, Circuit Breaker e Service Registry organizando o código dentro de cada arquitetura.

→ próxima aula

Desenvolvimento de APIs (aula 9) — transformar serviços em endpoints REST acessíveis via HTTP usando Flask ou FastAPI.