No description
Find a file
2026-09-01 13:15:42 +02:00
.woodpecker chore: migrate CI to .woodpecker/{push,branch}.yml 2026-09-01 13:15:42 +02:00
src fix(054): align rebalancear doc with test expectations (remainder to last nodes) 2026-09-01 13:15:42 +02:00
tests fix: content audit corrections (accuracy, coherence, concordância, tests) 2026-09-01 13:15:42 +02:00
.gitignore Initial commit 2026-09-01 11:15:21 +00:00
Cargo.lock initial content 2026-09-01 13:15:39 +02:00
Cargo.toml chore: declare MSRV 1.85 (edition 2024) 2026-09-01 13:15:42 +02:00
LICENSE chore: add AGPL-3.0 license and standard .gitignore 2026-09-01 13:15:42 +02:00
README.md initial content 2026-09-01 13:15:39 +02:00

Lição 54: Arquitetura Distribuída (Microservices, Load Balancing)

1. Narrativa

Quando a Academia Æther opera com esquadras de mechas espalhadas pelo globo, a coordenação exige uma arquitetura distribuída robusta. Cada mecha é um microserviço independente com suas capacidades e limitações. O load balancer distribui as missões entre as unidades disponíveis, garantindo que nenhuma seja sobrecarregada. O piloto arquiteto projeta sistemas que escalam sem colapsar sob pressão inimiga.

2. Conceito

Arquitetura distribuída envolve múltiplos serviços trabalhando juntos:

  • Microservices: Serviços pequenos e independentes, cada um com responsabilidade única
  • Load Balancing: Distribuição inteligente de carga entre nós disponíveis
  • Service Discovery: Localização automática de serviços na rede
  • Health Checks: Monitoramento contínuo da saúde de cada nó
  • Rebalanceamento: Redistribuição de carga quando nós são adicionados/removidos

3. Requisitos

  • Modelar nós de serviço com capacidade e carga
  • Implementar estratégias de load balancing (Round-Robin, Menor Carga)
  • Simular health checks com critérios de saúde
  • Calcular métricas de utilização da rede
  • Implementar rebalanceamento dinâmico de cargas

4. Design de Dados

graph TD
    A[Cliente: Missão] --> B[Load Balancer]
    B --> C{Estratégia}
    C -->|Round-Robin| D[NoServico 1]
    C -->|Menor Carga| E[NoServico 2]
    C -->|Aleatório| F[NoServico 3]
    D --> G[Health Check]
    E --> G
    F --> G
    G --> H{Saudável?}
    H -->|Sim| I[Executar Missão]
    H -->|Não| J[Desativar / Rebalancear]

5. Diagrama de Fluxo

flowchart TD
    A[Missão Recebida] --> B[Filtrar Nós Ativos]
    B --> C{Há nós?}
    C -->|Não| D[SemNosDisponiveis]
    C -->|Sim| E[Aplicar Estratégia]
    E --> F{Capacidade?}
    F -->|Sem capacidade| G[SemCapacidade]
    F -->|OK| H[Atribuir Missão]
    H --> I[Incrementar Carga]
    I --> J[Retornar Resultado]

6. Funções

Função Descrição
criar_no Cria um novo nó de serviço
selecionar_round_robin Seleciona próximo nó circularmente
selecionar_menor_carga Seleciona nó com menor utilização
atribuir_missao Atribui missão usando estratégia
realizar_health_check Verifica saúde de um nó
filtrar_nos_ativos Filtra nós ativos
calcular_metricas Calcula métricas de utilização
desativar_no Remove nó do cluster
rebalancear Redistribui carga igualmente

7. Exemplo

let mut nos = vec![
    criar_no("mecha-01", "192.168.1.10", 8080, 100),
    criar_no("mecha-02", "192.168.1.11", 8080, 100),
];
let resultado = atribuir_missao(&mut nos, EstrategiaBalanceamento::RoundRobin, 0, 25);
assert!(matches!(resultado, ResultadoAtribuicao::Atribuido { .. }));
let hc = realizar_health_check(&nos[0], 1000);
assert!(hc.sucesso);

8. Missão

  1. Implementar criar_no inicializando struct com ativo=true e carga=0
  2. Implementar selecionar_round_robin com (indice_atual + 1) % nos_ativos.len()
  3. Implementar selecionar_menor_carga usando .iter().min_by_key()
  4. Implementar atribuir_missao com match na estratégia e verificação de capacidade
  5. Implementar realizar_health_check verificando ativo e carga < 90%
  6. Implementar filtrar_nos_ativos usando .iter().filter()
  7. Implementar calcular_metricas agregando dados com fold
  8. Implementar desativar_no buscando por ID e rebalancear redistribuindo igualmente

9. Como Executar

cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check

10. Dicas

  • Round-robin é circular: (i + 1) % n nunca ultrapassa o limite
  • Use .iter_mut().find() para localizar e modificar um nó por ID
  • Health check: carga < carga_maxima * 90 / 100 para verificar o limite de 90%
  • Rebalanceamento: carga_total / nos_ativos com divisão inteira
  • Métricas: cuidado com divisão por zero quando não há nós