GBR: ADR-005 Persistência Hexagonal do BPE utilizando Mnesia (Zero-Cost Serialization) | Wiki
Documentação de engenharia e especificações técnicas da Gleam-BR.
GBR: ADR-005 Persistência Hexagonal do BPE utilizando Mnesia (Zero-Cost Serialization)
- *Status:* Aceito
- *Data:* 2026-05-01
*Contexto:*
O motor de processos de negócios (gbr_bpm) operava as transições de estado da Rede de Petri puramente em memória (RAM). Em um cenário de missão crítica de telemetria corporativa (Horus Falcon 2.0), se o servidor fosse reiniciado (Crash da BEAM ou atualização), o estado de milhares de ExecutionTokens (ex: "Servidor está em estado de alerta há 5 minutos") seria perdido. A integração com bancos de dados externos tradicionais (ex: PostgreSQL) via I/O de rede e mapeamento objeto-relacional (ORM) introduziria latência inaceitável e violaria a pureza funcional da máquina de estados.
*Decisão:*
-
*Padrão de Portas e Adaptadores (Hexagonal):* Definiu-se um contrato tipado em Gleam (
BpeStorage) possuindo funções injetáveis para salvar e carregar oExecutionToken. A função matemática de transição (machine.step) agora aceita a injeção funcional desta interface de armazenamento (Option(BpeStorage)). -
*Adoção do Mnesia (Banco de Dados Nativo do Erlang):* Criou-se a biblioteca adaptadora
shared/gbr_bpm_mnesia. O Mnesia suporta transações ACID, persistência em disco (disc_copies) e é embutido diretamente na máquina virtual da BEAM, não requerendo infraestrutura externa. -
*Serialização Nativa (Zero-Cost):* Para evitar o processamento (e latência) de transformar as estruturas de dados do Gleam (Árvores Algébricas) em JSON, a persistência utiliza a FFI em Erlang
term_to_binarypara gravar a representação binária exata do tipo estrito em disco, ebinary_to_termpara carregar.
*Consequências:*
- *Positivas:* Rastreabilidade e tolerância a falhas extremas em tempo de I/O em micro-segundos; o motor BPE permanece agnóstico em relação à infraestrutura de armazenamento, mantendo a pureza de seus testes unitários em memória.
-
*Negativas/Riscos:* O Mnesia tradicionalmente sofre com gargalos de fragmentação de rede (Split-Brain) em topologias altamente particionadas e possui um limite de tamanho de banco em disco (2GB por tabela nativamente, a menos que customizado). Contramedidas futuras avaliarão a implementação de adaptadores alternativos (ex:
gbr_bpm_rocksdb) se a limitação volumétrica for atingida por clientes massivos.