🏛️ Systems Architecture
Definição: Arquitetura é o conjunto de decisões significativas sobre a organização de um sistema de software, que são difíceis (e caras) de mudar no futuro.
🏗️ Padrões de Macro-Arquitetura
Section titled “🏗️ Padrões de Macro-Arquitetura”1. Monólito Modular
Section titled “1. Monólito Modular”- O que é: Um único deployable, mas com fronteiras de domínio (módulos) internamente bem definidas.
- Quando usar: Ideal para o início de projetos ou equipas pequenas. Facilita o refactoring e o deployment.
- Trade-off: Escala como uma unidade única; se um módulo consome muita CPU, todo o monólito tem de ser replicado.
2. Microserviços
Section titled “2. Microserviços”- O que é: Sistemas distribuídos onde cada serviço é independente e comunica via rede (HTTP, gRPC, Mensageria).
- Quando usar: Organizações grandes com múltiplas equipas independentes que precisam de ciclos de deploy distintos.
- Trade-off: Introduz a “taxa do sistema distribuído” (latência de rede, consistência eventual, complexidade de observabilidade).
🔁 Estilos de Comunicação
Section titled “🔁 Estilos de Comunicação”Event-Driven Architecture (EDA)
Section titled “Event-Driven Architecture (EDA)”Em vez de chamadas diretas (A chama B), os sistemas reagem a Eventos.
- Vantagens: Desacoplamento extremo e alta escalabilidade.
- Desafios: Rastrear o fluxo de uma transação torna-se difícil sem ferramentas de Distributed Tracing.
Request/Response (Síncrono)
Section titled “Request/Response (Síncrono)”O modelo clássico (REST/gRPC).
- Vantagens: Simplicidade de raciocínio e feedback imediato.
- Desafios: Pode criar “cascatas de erro” se um serviço na cadeia falhar.
🛡️ Resiliência (Patterns Críticos)
Section titled “🛡️ Resiliência (Patterns Críticos)”Para sistemas seniores, falhar é uma certeza. O objetivo é a degradação graciosa.
- Circuit Breaker: Interrompe chamadas a um serviço que está a falhar para permitir que ele recupere (evita o efeito de “estouro de fila”).
- Retries com Exponential Backoff: Tentar de novo, mas esperando cada vez mais tempo entre tentativas para não massacrar o servidor.
- Idempotência: Garantir que processar a mesma mensagem duas vezes não causa efeitos secundários (ex: cobrar duas vezes ao cliente).
⚖️ Decisões de Design (O olhar do Sénior)
Section titled “⚖️ Decisões de Design (O olhar do Sénior)”Teorema CAP
Section titled “Teorema CAP”Num sistema distribuído, só podes escolher dois entre três: Consistência, Disponibilidade e Tolerância a Partição. Como a rede vai falhar (P), tens de decidir entre C ou A.
Acoplamento vs. Coesão
Section titled “Acoplamento vs. Coesão”- Coesão Alta: Coisas que mudam juntas devem estar juntas.
- Acoplamento Baixo: Mudar o Serviço A não deve obrigar a mudar o Serviço B.
💡 Nota de Senioridade: O “Santo Graal” não é o sistema mais complexo, mas sim o sistema mais simples que resolve o problema do negócio enquanto mantém a porta aberta para a escalabilidade futura. Não construas para 1 milhão de utilizadores se hoje tens 10.
🔗 Links Relacionados
Section titled “🔗 Links Relacionados”- [[Mensageria-Kafka-RabbitMQ]]
- [[Observabilidade-Logs-Metrics]]
- [[Modelacao-DDD]]