Pular para conteúdo

Modelagem de dados

O backend distribui os dados entre configuração por tenant, registros globais, estado de processamento, projeções e caches/contadores. MongoDB mantém documentos; Redis também guarda estado operacional, não apenas dados descartáveis. Arquivos ficam em object storage e Monitoring consulta Elasticsearch.

Esta seção cobre os 23 repositórios backend do workspace, incluindo serviços sem persistência própria. As definições de collections/índices vêm do código; não são inventário físico de DEV, STAGING ou PROD. Defaults de configuração pertencem ao código, e manifests do ambiente local não comprovam a topologia corporativa.

Modelo consolidado da plataforma

Explore todas as collections, campos, tipos embutidos e relações entre domínios em um único desenho vetorial, com zoom, pesquisa e navegação livre.

Abrir o diagrama mestre

Organização dos dados

Os blocos representam domínios, não instâncias de banco compartilhadas. Setas indicam referências/projeções lógicas. IDs de origem e owner permitem relacionar dados globais e de tenants sem foreign keys físicas.

%%{init: {"theme":"base","themeVariables":{"fontFamily":"Arial, sans-serif","fontSize":"16px","lineColor":"#64748b","primaryTextColor":"#172b4d"},"flowchart":{"htmlLabels":true,"useMaxWidth":true,"nodeSpacing":28,"rankSpacing":38,"padding":14,"curve":"linear","subGraphTitleMargin":{"top":12,"bottom":16}},"sequence":{"useMaxWidth":true,"actorMargin":28,"width":145,"height":45,"diagramMarginX":32,"diagramMarginY":12,"messageMargin":24,"wrap":true,"mirrorActors":false},"themeCSS":".edgeLabel, .edgeLabel p {background-color:var(--diagram-surface)!important;color:var(--diagram-text)!important}\n.cluster rect {fill:var(--diagram-group)!important;stroke:var(--diagram-line)!important}\n.cluster-label span, .cluster-label text {color:var(--diagram-text)!important;fill:var(--diagram-text)!important}\n.flowchart-link, .actor-line {stroke:var(--diagram-line)!important}\nmarker path {fill:var(--diagram-line)!important;stroke:var(--diagram-line)!important}\n.actor {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\ntext.actor, .messageText, .loopText, .labelText {fill:var(--diagram-text)!important}\n.messageLine0, .messageLine1, .loopLine {stroke:var(--diagram-line)!important}\n.labelBox {fill:var(--diagram-surface)!important;stroke:var(--diagram-line)!important}\n.note {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.noteText {fill:var(--diagram-text)!important}\n.nodeLabel, .nodeLabel p, .nodeLabel span {color:var(--diagram-text)!important}\n.node .nodeLabel, .node .nodeLabel p {font-size:17px;font-weight:600;line-height:1.4;text-align:center}\n.nodeLabel small {display:inline-block;margin-top:4px;font-size:15px;font-weight:400;line-height:1.4;color:var(--diagram-description)!important}\ntext.actor, text.actor tspan {font-size:17px;font-weight:600}\n.node.entry rect, .node.entry polygon, .node.entry path, .node.entry circle {fill:var(--diagram-entry)!important;stroke:var(--diagram-entry-border)!important}\n.node.domain rect, .node.domain polygon, .node.domain path, .node.domain circle {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\n.node.security rect, .node.security polygon, .node.security path, .node.security circle {fill:var(--diagram-security)!important;stroke:var(--diagram-security-border)!important}\n.node.store rect, .node.store polygon, .node.store path, .node.store circle {fill:var(--diagram-store)!important;stroke:var(--diagram-store-border)!important}\n.node.async rect, .node.async polygon, .node.async path, .node.async circle {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.node.external rect, .node.external polygon, .node.external path, .node.external circle {fill:var(--diagram-external)!important;stroke:var(--diagram-external-border)!important}\n text.actor tspan, .loopText tspan, .labelText tspan, .messageText tspan, .noteText tspan {fill:var(--diagram-text)!important}\n\n"}}%%
flowchart TB
    global["Registros globais<br/><small>Registry · catálogo e aliases</small>"]:::store
    models["Modelos reutilizáveis<br/><small>Template Service · banco do autor</small>"]:::domain
    instance["Instâncias e políticas<br/><small>Core / Security / IP / Rate Limit</small>"]:::domain
    operation["Operações por tenant<br/><small>Templates / Importer · progresso</small>"]:::async
    global -->|Owner / modelo / versão| models
    models -->|Instanciação / proveniência| instance
    operation -->|IDs e checkpoints| instance
    classDef domain stroke-width:1.5px;
    classDef store stroke-width:1.5px;
    classDef async stroke-width:1.5px;

Arquivos, jobs e projeções documentais complementam estes domínios: possuem modelos próprios vinculados na tabela abaixo. A visão de eventos explica a outbox compartilhada; Redis mantém seus diagramas separados.

Domínio / modeloDocumento / dadosProcessamentoSegurançaProvedor externo

Retângulos identificam collections, tipos embutidos ou serviços conforme o rótulo; cilindros identificam armazenamentos nos diagramas de cache. Toda seta informa se é referência, snapshot, embedding ou interação por serviço.

Modelos por domínio

O atlas dos diagramas reúne os modelos visuais de todos os proprietários Mongo, com resumos nas páginas de domínio e detalhes com zoom. As relações entre domínios, eventos e contratos Redis possuem visões complementares.

Cada página contém escopo do banco, collections, relacionamentos, índices declarados, consultas, ciclo de vida, dicionário de campos/tipos, estruturas embutidas, enums e fragmentos JSON sanitizados derivados dos modelos.

Domínio Principais dados
Core Gateways, rotas, revisões, categorias, wizard e favoritos de catálogo
Template Service Modelos, revisões, snapshots e operações de instanciação/upgrade
Global Registry Catálogo global e aliases
Security Autorizações e configuração OAuth/OIDC
IP Policy Regras ALLOW/DENY e CIDRs
Rate Limit Configuração de quotas e identidade idempotente
Importer Importações e resultado por recurso
Object Storage Metadados por tenant, registro global e blobs
Scheduler Atividades HTTP/quotas, resultados e checkpoints
OpenAPI Doc Documentos derivados e Inbox
Tunnel Identidades locais e recursos Cloudflare

Inventário completo por microserviço

“Tenant/biblioteca” significa seleção de database delegada a totvs-gateway-mongo-tenant-scoped. Os casos de seleção explícita estão na visão de ownership. Collections lógicas de IP Policy/Rate Limit têm nome físico delegado; não foram nomeadas por suposição.

Serviço Banco / escopo e collections Persistência complementar / decisão
Core Tenant/biblioteca: gateways, gateway_revisions, routes, route_revisions, categories, gateway_wizard, catalog_item_state, outbox_events Autor de configuração; hooks de invalidação
Template Service Tenant/biblioteca e leitura do owner: gateway_templates, gateway_template_revisions, route_templates, route_template_revisions, route_template_categories, operations, outbox_events Snapshots embutidos, checkpoints e leases de upgrade
Global Registry Global gateway-globals: catalog, tenant-aliases Escritor do cache Redis de aliases
Security Database tenantId: authorizations Clients/credenciais também mantidos em Keycloak
IP Policy Tenant/biblioteca: documento IpPolicy, nome físico delegado Sem cache próprio identificado; invalidação por hooks
Rate Limit Tenant/biblioteca: documento RateLimit, nome físico delegado Scheduler escreve o contador Redis; política Mongo não é contador
Importer Tenant/biblioteca: gateway_import, gateway_import_status RabbitMQ para trabalho; DTOs iPaaS não são collections
Object Storage Tenant: object_storage; global configurável, default gateway-globals: global_file_registry MinIO/GCS; arquivo binário fora do Mongo
Scheduler MONGODB_DATABASE (default default): rate_limit_activities, http_calls_activities, scheduler_reconciliation_checkpoints JobRunr em JOBRUNR_DATABASE (default scheduler_jobrunr_v2); Redis quotas/locks
OpenAPI Doc Tenant/biblioteca: gateway_openapi, inbox_processed Projeções derivadas; consumidor RabbitMQ
Tunnel Tenant/biblioteca: tunnels Recursos Cloudflare; token persistido no documento
Outbox Dispatcher Varre databases Mongo visíveis, excluindo admin, local, config; lê/atualiza outbox_events (configurável) Não cria domínio de negócio próprio; publica RabbitMQ e controla lease/retry
Auth Provider Sem collections próprias Redis/memória para tokens/OIDC/JWK; JWKS de realm em memória
BFF Sem collections próprias Redis para buckets de limites e leitura de alias; DTOs/VOs são transporte
Broker Sem collections próprias Redis para concorrência; JWKS em memória; envelopes de request/response transitórios
Builder Sem collections próprias Redis para configuração de rota e recursos iPaaS via CacheUtil
Security Checker Sem collections próprias Redis/memória para políticas/tokens; consome quotas Redis
Discovery Sem collections próprias Mapa de rotas por tenant em memória, invalidação RabbitMQ
Cache Invalidator Sem collections próprias Remove chaves Redis e publica invalidação; Cache Monitor no mesmo repositório pode executar recuperação ampla
Monitoring Sem Mongo próprio; lê Elasticsearch logs-{tenant}.otel-gateway e metrics-{tenant}.otel-gateway Consultas _search; não define mappings/retention desses índices
Web Pages Sem collections próprias; lê artefato em GCS Cache Caffeine openapi-doc-cache, TTL de escrita 3 min; consulta documentos via OpenAPI Doc
Router Sem banco/cache de negócio identificado Request, envelope e corpo de resposta em memória
JSON Handler Sem banco/cache de negócio identificado Transformações e validação de schemas em memória

São 30 contratos de documento raiz em 11 serviços proprietários, contando outbox_events em cada produtor e os dois modelos de nome físico delegado. O Dispatcher acessa a outbox existente. O dicionário inclui 128 modelos/enums alcançáveis pelos campos desses documentos; tipos auxiliares não viram collections por terem uma classe Java.

Persistência complementar e limites

  • Elasticsearch: Monitoring seleciona os índices por tenant em LogQueryVO/MetricsQueryVO e lê logs/métricas. Ingestão, mappings e retenção não são implementados por esse serviço. Consultas.
  • Web Pages/GCS: GcpOpenApiService lê um blob HTML UTF-8 do bucket/caminho configurados; não grava entidades Mongo. O cache local guarda a apresentação documental, não a configuração original. Leitor, configuração.
  • Keycloak/Cloudflare: contratos externos mantêm identidade e conectividade; suas bases internas não estão modeladas nos repositórios Gateway. Security, Tunnel.
  • JobRunr: armazenamento interno da biblioteca separado das atividades de domínio; nomes de collections internas não são declarados no código de aplicação. Scheduler.
  • SQL: nenhum dos 23 serviços analisados declara persistência de domínio SQL; bancos de dependências do ambiente local não são bancos de negócio Gateway. Infraestrutura por ambiente.

Evidências e manutenção

Os links dos modelos, repositories, índices, serviços e testes apontam para commits do checkout analisado. Relacionamentos, versionamento, multi-tenancy, Redis e eventos concentram contratos transversais sem repetir todos os campos. Possíveis problemas de consistência ficam em Análises de dados.

Cobertura dos repositórios

Código e configuração foram inspecionados nos commits abaixo. Modelos, repositories, consultas e testes específicos estão vinculados nas páginas de domínio.

Repositório Commit Código / dependências
totvs-gateway-auth-provider 51fd6513f82d Código · Dependências
totvs-gateway-bff 2f16f060de64 Código · Dependências
totvs-gateway-broker d419481fbf7a Código · Dependências
totvs-gateway-builder fe44ac95d218 Código · Dependências
totvs-gateway-cacheinvalidator 13abb76112a1 Código · Dependências
totvs-gateway-core 4138c7539324 Código · Dependências
totvs-gateway-discovery 0f962a284892 Código · Dependências
totvs-gateway-globalregistry 45a7d6dc16bf Código · Dependências
totvs-gateway-importer feb15d4b8816 Código · Dependências
totvs-gateway-ippolicy ca79becbd061 Código · Dependências
totvs-gateway-jsonhandler cc52b48774b1 Código · Dependências
totvs-gateway-monitoring 4c967b473073 Código · Dependências
totvs-gateway-object-storage 06a37462d6a7 Código · Dependências
totvs-gateway-openapi-doc 703494186f3a Código · Dependências
totvs-gateway-outbox-dispatcher e46f47d54a4c Código · Dependências
totvs-gateway-ratelimit a72eb4e7ce73 Código · Dependências
totvs-gateway-router 1e6c4fa7adfc Código · Dependências
totvs-gateway-scheduler 4ff6a2ec923a Código · Dependências
totvs-gateway-security 85ce9ec0e4a2 Código · Dependências
totvs-gateway-securitychecker ab1bb6146477 Código · Dependências
totvs-gateway-template-service b84abeaa22b0 Código · Dependências
totvs-gateway-tunnel c4eb448d1f1a Código · Dependências
totvs-gateway-webpages 27d8a0f1f754 Código · Dependências