GBR: ADR-0002 Framework P2P Universal com Roteamento Dinâmico (Multistream-Select sobre ETS) | Wiki
Documentação de engenharia e especificações técnicas da Gleam-BR.
GBR: ADR-0002 Framework P2P Universal com Roteamento Dinâmico (Multistream-Select sobre ETS)
*Status:* Aceito *Data:* 2026-05-01
*Contexto:*
A versão inicial da malha gbr_p2p possuía os protocolos (Kademlia, GossipSub) acoplados diretamente ao código fonte (hardcoded). Quando o projeto evoluiu para o Falcon 2.0, exigiu-se a capacidade de registrar novos protocolos em tempo real (como o /horus/telemetry/1.0.0 para métricas e comandos reversos) sem precisar alterar a base do framework P2P, suportando uma abordagem agnóstica de Inversão de Controle. O desafio arquitetural era permitir essa inspeção profunda de pacotes (Deep Packet Inspection) e roteamento para o Ator correto sem criar contenção (bottleneck) em um processo OTP central durante o estabelecimento de milhares de conexões Yamux.
*Decisão:*
-
*Roteamento Dinâmico via ETS:* A API pública do Host agora expõe
gbr_p2p.register_protocol(host, protocol_id, actor_spec). Esta função persiste a intenção em uma tabela Erlang Term Storage (gbr_p2p_protocols) otimizada comReadConcurrency(True). -
*Negociador Multistream-Select:* Quando um novo stream é aberto no multiplexador Yamux, o primeiro pacote lido não é tratado pelo domínio. O módulo
yamux_streamatua como roteador/lexador; ele consome os bytes do cabeçalho do protocolo, realiza um lookup O(1) não-bloqueante na tabela ETS, instancia o Ator do domínio específico (ex: Telemetria ou Túnel) e faz o hand-off (repassa o controle do Stream) para o respectivo Ator. -
*Padrão Builder e Isolamento de Configuração:* A configuração do Node (Timeouts, K-Buckets, Bootstrap Nodes) foi movida para uma ADT
P2PConfiginstanciada pelo Padrão Builder, garantindo imutabilidade e simplificando a Developer Experience (DX).
*Consequências:*
- *Positivas:* Transformação de um código monolítico em um verdadeiro Framework Universal. Permite que múltiplos Hosts P2P operem na mesma máquina virtual com configurações distintas (Cloud Edge vs IoT); roteamento de novos protocolos não afeta a latência da malha.
- *Negativas/Riscos:* A extração do handler do ator torna a depuração de falhas de conexão ligeiramente mais opaca, uma vez que pacotes cujo cabeçalho não correspondam a nenhum registro na ETS sofrerão drop silencioso (ou rejeição de protocolo no Multistream-select) sem envolver lógicas de negócio.