GBR: ADR-001 Adoção do ETS (Erlang Term Storage) para Roteamento de Alta Frequência (gbr_monitor) | Wiki
Documentação de engenharia e especificações técnicas da Gleam-BR.
GBR: ADR-001 Adoção do ETS (Erlang Term Storage) para Roteamento de Alta Frequência (gbr_monitor)
- *Status:* Aceito
- *Data:* 2026-05-01
*Contexto:*
A FVideen está desenvolvendo o gbr_monitor, o componente central para processamento de eventos do sistema operacional distribuído. Inicialmente, o componente gerenciava o estado dos processos monitorados utilizando um Dicionário (Dict) mantido na memória de um único Ator Gerenciador (Registry). Com o aumento da frequência de ingestão esperada (milhões de eventos por segundo) e a necessidade de escalabilidade massiva, o Dicionário local formava um gargalo de contenção, pois todas as leituras e escritas exigiam passagem sequencial pela caixa de mensagens (Mailbox) do Ator Gerenciador, bloqueando o despacho paralelo.
*Decisão:*
- *Roteamento Baseado em ETS (Erlang Term Storage):* Substituir o Dicionário local por uma tabela ETS pública. O ETS opera como um banco de dados em memória nativo do Erlang, escrito em C.
- *Leituras Lock-free e Escritas Serializadas:* - *Roteador (Router):* Implementar o roteamento de métricas como funções puras que realizam a leitura direta no ETS sem bloqueios. Se o Ator alvo (PID) estiver registrado, o roteador despacha o evento instantaneamente de forma paralela. - *Criador (Spawner/Manager):* Implementar um Ator central responsável apenas por instanciar novos Atores quando a busca no ETS falhar, garantindo a prevenção de condições de corrida (Race Conditions) durante a criação simultânea de recursos.
-
*Criação do Wrapper gbr_ets:* Isolar a complexidade da API nativa do ETS (
ets:new,ets:lookup) em um projeto separado (shared/gbr_ets). Utilizar FFI em Erlang puro (.erl) para instanciar as tabelas, abstraindo tipos nativos (set,read_concurrency) por trás de uma API de Tipos Customizados (Custom Types) tipicamente segura em Gleam. -
*Cast Opaco (FFI Identity):* Devido à remoção intencional da função
dynamic.fromna versão 0.70+ dogleam_stdlibpara reforçar a segurança de tipos, implementou-se a função FFIidentityem Erlang. Esta função permite a injeção forçada de tipos complexos (como o Subject do Ator) na tabela ETS sem incorrer na sobrecarga computacional dedynamic.decodeno momento da extração. A extração é operada utilizando o pacote interno do compilador Gleam comunsafe_coerce, otimizando a latência da execução.
*Consequências:*
- *Positivas:* Redução significativa do estrangulamento por contenção de Mensagens no Registry; throughput superior suportando a taxa exigida pelo GKE; estrutura adaptada a sistemas críticos de telecomunicações; isolamento robusto entre tipos complexos e primitivas C.
-
*Negativas/Riscos:* A utilização de
unsafe_coerceviola as garantias matemáticas do compilador Gleam. Esse risco foi mitigado através de validação estrita no momento da inserção (somente o Manager insere os tipos corretos na tabela ETS). Se pacotes não autorizados adulterarem o ETS, ocorrerá um erro catastrófico em runtime.