Quais partes importantes existem?
Como pensar
a arquitetura de software
Aprenda a reconhecer as partes de um sistema, escolher como elas se comunicam e justificar cada escolha pelos requisitos e custos envolvidos.
Arquitetura é a
estrutura do sistema.
Ela organiza as partes importantes, suas relações e as decisões que atendem a quem usa e opera o sistema, considerando prazo, equipe, custo e segurança. Um diagrama mostra uma visão dessa estrutura; não é a arquitetura inteira.
Como as partes se comunicam?
Quem é responsável por cada regra e dado?
O que o sistema precisa garantir?
Em uma aplicação de projetos, o navegador chama a API, a API verifica o acesso e consulta os dados. Essas partes, suas responsabilidades e suas relações formam uma visão da arquitetura.
Cliente-servidor:
quem faz o quê?
O cliente apresenta a interface. O servidor recebe as requisições, aplica as regras e acessa os dados. Assim, web e app podem usar a mesma API.
Cliente
Envia filtros e parâmetros.
INTERFACEAPI
Valida método, rota e formato.
CONTRATODomínio
Aplica regras e permissões.
SERVIDORPersistência
Consulta ou grava os dados.
ARMAZENAMENTOO cliente envia. A API valida. O banco persiste.
✳Cliente-servidor explica a comunicação entre partes. Camadas e módulos explicam como o código do servidor é organizado.
A aplicação ficou lenta.
O que medir primeiro?
Escalar é uma decisão baseada em evidências. Meça o caminho da requisição para descobrir qual parte limita o sistema.
Meça a operação
Registre tempo de resposta, erros e uso de CPU, memória e banco.
Encontre o limite
Descubra qual componente está consumindo o tempo ou esgotando recursos.
Trate o gargalo
Altere essa parte e meça de novo. Mais servidores de API não resolvem consultas lentas no banco.
Isso distribui a carga da API. Primeiro confirme que a API é o gargalo e que o banco suporta a carga adicional.
Do pedido aos dados:
qual serviço faz o quê?
Siga uma requisição pelas camadas. Depois compare duas formas de receber tráfego e veja qual recurso ampliar quando cada parte vira um gargalo.
O Auto Scaling ajusta quantas máquinas rodam. As zonas são partes isoladas de uma região da AWS; distribuir instâncias entre elas reduz o impacto de uma falha local.
Gerencia uma API
Define rotas, autorização e limites de chamadas; pode encaminhar para Lambda ou para uma API existente.
Útil quando esses recursos de gestão fazem parte do requisito.Distribui requisições web
Encaminha HTTP para aplicações saudáveis em EC2 ou ECS (contêineres), com regras por caminho ou domínio.
Útil na frente de uma aplicação que a equipe opera.ALB e API Gateway resolvem problemas relacionados, mas têm funções diferentes. São opções de entrada; não precisam ser usados juntos. API Gateway também pode chamar uma aplicação HTTP.
Auto Scaling
Ajusta quantas instâncias rodam conforme métricas e limites. O balanceador distribui as chamadas entre elas.
Cache ou réplica
Cache evita consultas repetidas; réplica atende leituras. Réplicas podem apresentar dados atrasados.
SQS + worker
A fila guarda o trabalho para processamento posterior. O worker pode receber a mesma mensagem mais de uma vez.
EventBridge
Encaminha eventos a destinos conforme regras. Use-o para distribuir eventos; SQS é uma fila de tarefas.
Escalar a API não escala automaticamente o banco. Primeiro meça onde o tempo e os erros se acumulam; depois amplie a camada que virou gargalo.
Documentação AWS: API Gateway · Application Load Balancer · EC2 Auto Scaling · CloudFront · RDS read replicas · EventBridge · SQS.
Três decisões distintas.
Como elas se combinam?
Uma decisão define como partes se comunicam; outra organiza o código; a terceira define o que é publicado junto. Por isso, uma aplicação pode usar cliente-servidor, camadas e monólito modular ao mesmo tempo.
Cliente-servidor
Web, app e painel chamam a mesma API; as regras não precisam ser copiadas para cada interface.
Problema que resolveWeb e app precisam usar as mesmas regras de acesso aos projetos.
Custo que assumeSe a rede ou a API falhar, os clientes perdem acesso às operações.
| Modelo | Fronteira | Ajuda quando | Custo que aparece |
|---|---|---|---|
| Cliente-servidor | Comunicação pela rede | Web e app usam as mesmas regras | Rede ou servidor indisponível |
| Camadas | Responsabilidades no código | Regra de negócio isolada da tela e do banco | Dependências rígidas entre camadas |
| Monólito modular | Módulos dentro de um deploy | Limites internos com operação simples | Todos os módulos são publicados juntos |
| Microsserviços | Serviços e dados separados | Deploy e escala por capacidade | Rede, consistência e operação distribuídas |
Um ponto de partida comum: cliente-servidor na comunicação, camadas no código e um monólito modular em um único deploy. Microsserviços entram quando autonomia de deploy ou escala independente compensa o custo operacional.
Nota para apresentar
Pergunte qual mudança precisa ser independente: interface, código ou deploy. Compare o limite escolhido com o custo que aparece na tabela.
Uma coisa aconteceu.
Quem precisa saber?
Um evento registra um fato concluído. O produtor o publica; cada consumidor interessado reage por conta própria, sem o produtor conhecer todos os consumidores.
Um fato no passado: o projeto foi criado.
Um pedido: alguém deve criar um projeto.
Recebe e distribui mensagens. Pub-sub é o modelo em que vários consumidores podem receber o mesmo evento.
Várias partes precisam reagir ao mesmo fato ou podem trabalhar sem resposta imediata.
O resultado pode demorar; por um período, partes diferentes podem mostrar estados distintos (consistência eventual). Mensagens podem falhar ou repetir; consumidores precisam tolerar repetições.
Se a tela precisa saber agora se o projeto foi criado, use uma resposta síncrona da API. Se notificações e auditoria podem reagir depois, publique um evento. Os dois estilos podem coexistir.
Eventos não significam guardar todo o histórico do sistema: arquitetura orientada a eventos não é automaticamente event sourcing. Azure Architecture Center · Event-driven architecture.
O sistema faz o quê?
E quão bem?
Um requisito funcional diz o que o sistema faz. Um atributo de qualidade diz como ele deve se comportar enquanto faz esse trabalho.
Listar projetos
A pessoa consulta os projetos a que tem acesso.
Responder rápido no pico
Com 500 requisições por segundo, menos de 1% de erros e 95% das respostas em até 300 ms.
Defina a carga, o que será medido e o limite de sucesso.
p95 abaixo de 300 ms significa que 95 de cada 100 respostas chegam em menos de 300 ms. Carga e limites são exemplos; defina metas adequadas ao uso real.
Que comportamento o sistema precisa garantir?
Desempenho
Quanto tempo a operação leva sob a carga esperada? Exemplo: listar projetos em até 300 ms.
Disponibilidade
As funções essenciais continuam acessíveis quando uma parte falha? Notificações podem atrasar sem bloquear tarefas.
Segurança
Só pessoas autorizadas leem ou alteram os dados? A API confere o acesso ao projeto.
Facilidade de mudança
Uma mudança fica isolada? Trocar o provedor de notificações não altera as regras de tarefas.
Esses requisitos levam a decisões diferentes. Não existe uma técnica que melhore tudo sem custo.
Escreva o comportamento esperado, defina como medir e só então escolha uma solução arquitetural. Assim, a equipe sabe se a decisão resolveu o problema.
Base: cenários de atributos de qualidade do Software Engineering Institute e Software Architecture in Practice.
Fronteiras entre módulos:
quem é dono dos dados?
Se Tarefas depende diretamente das tabelas de Projetos, uma mudança nelas pode quebrar outro módulo. Defina quem é dono dos dados e qual contrato os outros módulos usam.
Regras relacionadas ficam juntas: Projetos cuida das regras de projetos.
Quanto um módulo depende dos detalhes internos de outro. Prefira contratos estáveis.
Projetos grava projects; Tarefas mantém tasks e verifica acesso pelo contrato.
Se a estrutura das tabelas de Projetos mudar, Tarefas quebra. A leitura direta também pode ignorar as regras de acesso.
Projetos e Tarefas podem usar o mesmo banco. Só Projetos grava projects; aplique esse limite no código e nas permissões do banco.
Parnas propõe esconder decisões sujeitas a mudança. Neste exemplo, a estrutura das tabelas fica atrás do contrato de Projetos: artigo de 1972.
Como explicar
uma decisão?
Mostre só a estrutura necessária para responder à pergunta. Registre o motivo da escolha, as alternativas e os custos que ela cria.
Comece com as pessoas, sistemas e partes principais.
Aproxime o diagrama apenas quando uma conversa exigir mais detalhe.
Exemplo: começar com um monólito modular
Uma nota curta ajuda a equipe a lembrar por que escolheu esse caminho.
Equipe pequena; regras compartilhadas; sem necessidade de deploy separado.
Uma aplicação, com módulos e contratos explícitos.
Serviços separados ou código sem fronteiras claras.
Operação simples; todos publicam juntos; limites precisam ser mantidos.
Projeto criado.
Quem avisa o restante?
Cenário: a API deve confirmar a criação; notificação e auditoria podem acontecer logo depois.
Escolha A, B ou C. Diga o que a API faz antes de responder e que cuidado os consumidores precisam ter.
Para continuar
estudando.
Definição de arquitetura, qualidade e diagramas.
Requisitos claros.
Decisões justificadas.
Descreva as partes, suas relações, os requisitos que importam e os custos de cada decisão.
VOLTAR AO INÍCIO ↑