No description
- Rust 100%
| .woodpecker | ||
| src | ||
| tests | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
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
- Implementar
criar_noinicializando struct com ativo=true e carga=0 - Implementar
selecionar_round_robincom(indice_atual + 1) % nos_ativos.len() - Implementar
selecionar_menor_cargausando.iter().min_by_key() - Implementar
atribuir_missaocom match na estratégia e verificação de capacidade - Implementar
realizar_health_checkverificando ativo e carga < 90% - Implementar
filtrar_nos_ativosusando.iter().filter() - Implementar
calcular_metricasagregando dados com fold - Implementar
desativar_nobuscando por ID erebalancearredistribuindo igualmente
9. Como Executar
cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check
10. Dicas
- Round-robin é circular:
(i + 1) % nnunca ultrapassa o limite - Use
.iter_mut().find()para localizar e modificar um nó por ID - Health check:
carga < carga_maxima * 90 / 100para verificar o limite de 90% - Rebalanceamento:
carga_total / nos_ativoscom divisão inteira - Métricas: cuidado com divisão por zero quando não há nós