Pular para conteúdo

ADR 0001 — Monólito modular em Elixir/Phoenix, não microserviços

Status

Aceita — 2026-08-08

Contexto

A tese que fundamenta o The Band descreve sua arquitetura como um Federated Information System: serviços autônomos baseados em ontologia (OBS), cada um com seu repositório próprio (OBDR), comunicando-se por um message broker para propagar mudanças e manter consistência entre repositórios.

Lida literalmente, essa descrição sugere uma implementação com um serviço por ontologia — doze serviços, doze bancos, um broker, e a operação toda que isso implica.

O que a tese exige de fato é autonomia semântica entre as ontologias: um módulo não pode depender do modelo interno de outro, conceitos reutilizados não podem ser duplicados, e cada dado precisa ser rastreável até sua origem. Nada disso exige processos separados.

O projeto começa com uma equipe pequena, sem demanda de escala conhecida, e com o risco principal concentrado na corretude semântica — não na capacidade de processamento. Distribuir cedo transforma erro de modelagem em erro distribuído, que é mais caro de diagnosticar e mais lento de corrigir.

Decisão

The Band nasce como monólito modular multitenant em Elixir/Phoenix, com PostgreSQL, Ecto e Oban.

As camadas da tese viram fronteiras internas:

  • cada ontologia é um módulo com API pública e schemas privados;
  • a comunicação entre módulos passa exclusivamente pela API pública;
  • filas, retries, agendamento e propagação usam Oban sobre o PostgreSQL existente, no lugar do message broker;
  • as tabelas são prefixadas pela ontologia dona do conceito, preservando a separação dos OBDRs em um único banco.

A autonomia é mantida por disciplina de fronteira verificada em revisão e teste, e não por fronteira de rede.

Alternativas consideradas

Um serviço por ontologia, com broker (leitura literal da tese). Fiel ao texto, mas paga custo operacional alto — deploy, observabilidade distribuída, consistência eventual entre doze repositórios — antes de existir qualquer evidência de que a escala justifique. Erros de modelagem, que são o risco real nesta fase, ficariam mais caros de corrigir.

Monólito sem fronteiras internas explícitas. Mais rápido no começo, mas dissolve justamente a propriedade que a tese exige: se qualquer módulo pode ler o schema de outro, a autonomia semântica desaparece em poucos meses e não volta sem reescrita.

Kafka ou RabbitMQ como espinha dorsal desde o início. Resolveria propagação e desacoplamento, mas adiciona um componente de infraestrutura que precisa ser operado, monitorado e versionado — sem carga que o justifique. Oban cobre o caso atual usando um banco que já é obrigatório.

Consequências

Positivas

  • Um deploy, um banco, uma stack de observabilidade.
  • Refatoração conceitual é local e barata enquanto o modelo ainda está sendo validado.
  • Transações locais garantem consistência sem coordenação distribuída.
  • Oban entrega filas, retries e agendamento sem infraestrutura adicional.

Negativas

  • Escala é do processo inteiro, não por ontologia.
  • A autonomia depende de disciplina: sem revisão, a fronteira erode silenciosamente.
  • Uma ontologia com carga muito maior que as outras não pode ser escalada isoladamente sem antes ser extraída.

Mitigações

  • API pública por módulo com defdelegate; acesso a schema de outro módulo é falha de revisão, não estilo.
  • Tabelas prefixadas por ontologia, mantendo a separação lógica dos repositórios.
  • Extrair um módulo para serviço permanece viável: a fronteira já existe no código.

Gatilhos para revisitar

  • Uma ontologia precisar de escala ou ciclo de release independente.
  • O volume de ingestão exceder o que Oban sustenta confortavelmente.
  • Necessidade real de consumidores externos independentes por ontologia.

Qualquer um desses exige nova ADR — esta não é revogada por preferência.