Dependências e integrações¶
Esta página responde quem consome quem, para quê e por qual mecanismo. O inventário cobre os 23 microserviços backend do workspace: chamadas HTTP, callbacks, hooks delegados e circuitos assíncronos implementados. Cada linha representa um par origem/destino e agrupa as operações com a mesma finalidade; não é um catálogo de todos os endpoints.
As tabelas separam relações entre serviços Gateway de integrações externas e de transporte assíncrono. A coluna Código aponta ao cliente, chamador ou consumidor no commit analisado. O detalhamento de endpoints do BFF permanece no Control Plane; bancos, chaves Redis e compartilhamento de dados ficam na modelagem de dados.
Chamadas síncronas¶
Entrada administrativa — BFF¶
São os 14 destinos HTTP internos do BFF. Accounts, Authenticator e os dois destinos iPaaS estão na tabela de integrações externas. SSE é um stream HTTP iniciado pelo BFF, não uma assinatura RabbitMQ.
| Origem | Destino | Finalidade | Mecanismo | Código |
|---|---|---|---|---|
| BFF | Core | Administrar gateways, rotas, revisões, categorias, wizard e favoritos | HTTP/JSON | código · código |
| BFF | Template Service | Autoria, publicação, instanciação, upgrade e acompanhamento de operações | HTTP/JSON e SSE | código · código |
| BFF | Global Registry | Consultar catálogo, resolver modelo/owner/versão e administrar aliases | HTTP/JSON | código · código |
| BFF | Importer | Iniciar/reprocessar importação e acompanhar resultados | HTTP/JSON e SSE | código · código |
| BFF | Security | Administrar autorizações e regenerar segredos | HTTP/JSON | código |
| BFF | IP Policy | Administrar políticas de IP | HTTP/JSON | código |
| BFF | Rate Limit | Administrar quotas | HTTP/JSON | código |
| BFF | Tunnel | Administrar túneis, token e instruções de instalação | HTTP/JSON e conteúdo textual | código |
| BFF | JSON Handler | Gerar variáveis/schemas e transformar formulários | HTTP/JSON | código · código |
| BFF | Monitoring | Consultar logs e métricas | HTTP/JSON | código |
| BFF | Auth Provider | Testar OAuth/OIDC e expor emissão/JWKS públicos | HTTP/JSON | código |
| BFF | Object Storage | Enviar, ler e excluir arquivos; servir leitura pública | HTTP multipart/binário/JSON | código |
| BFF | OpenAPI Doc | Obter documentação do template no contexto do owner | HTTP/JSON | código |
| BFF | Web Pages | Obter apresentação documental do catálogo | HTTP/HTML | código |
Configuração, modelos e políticas¶
| Origem | Destino | Finalidade | Mecanismo | Código |
|---|---|---|---|---|
| Core | Security | Consultar/validar autorizações referenciadas | HTTP/JSON | código |
| Core | IP Policy | Consultar/validar políticas de IP referenciadas | HTTP/JSON | código |
| Core | Rate Limit | Consultar/validar quotas referenciadas | HTTP/JSON | código |
| Core | JSON Handler | Validar JSON Schema na configuração | HTTP/JSON | código |
| Template Service | Core | Criar instâncias/rotas/categorias; preparar/aplicar upgrade e wizard; remover instância em compensação | HTTP/JSON | código |
| Template Service | Global Registry | Publicar modelos, alterar visibilidade e consultar revisões publicadas | HTTP/JSON | código |
| Template Service | Rate Limit | Consultar e criar quotas de instâncias, com chave idempotente no upgrade | HTTP/JSON | código |
| Template Service | Object Storage | Vincular e publicar arquivo do modelo | HTTP/JSON | código |
| Template Service | Scheduler | Agendar exclusão da instância temporária de teste | HTTP/JSON | código · código |
| Importer | Core | Criar gateway/categorias/rotas, atualizar e marcar revisões publicáveis; excluir gateway na compensação | HTTP/JSON | código |
| Importer | JSON Handler | Transformar configuração iPaaS com schema para autoria | HTTP/JSON | código |
| Security | Core | Consultar uso de autorização antes de excluir | HTTP/JSON | código |
| IP Policy | Core | Contar vínculos de políticas nas rotas | HTTP/JSON | código |
| Rate Limit | Core | Contar vínculos de quotas nas rotas | HTTP/JSON | código |
| Rate Limit | Scheduler | Criar, alterar e excluir atividade de reposição de quota | HTTP/JSON | código |
Execução e identidade¶
| Origem | Destino | Finalidade | Mecanismo | Código |
|---|---|---|---|---|
| Security Checker | Discovery | Resolver rota, autenticação e políticas pelo tenant/método/path | HTTP/JSON | código |
| Security Checker | Security | Carregar autorização no tenant proprietário em miss de cache | HTTP/JSON | código |
| Security Checker | IP Policy | Carregar regras de IP no tenant proprietário em miss de cache | HTTP/JSON | código |
| Security Checker | Auth Provider | Validar token OAuth externo/provido | HTTP/JSON | código |
| Discovery | Core | Carregar configurações de rotas para resolução e cache | HTTP/JSON | código |
| Broker | Builder | Preparar request e, quando aplicável, transformar resposta | HTTP/JSON | código |
| Broker | Router | Executar requisição preparada e receber envelope da resposta | HTTP/JSON | código |
| Broker | Web Pages | Obter apresentação documental no caminho de documentação | HTTP/HTML | código |
| Builder | Core | Consultar revisão ativa da rota em miss de cache | HTTP/JSON | código |
| Builder | Auth Provider | Emitir token interno para chamada ERP | HTTP/JSON | código · código |
| Auth Provider | Security | Obter certificados do realm para JWKS | HTTP/JSON | código |
Documentação, agendamento e recuperação¶
| Origem | Destino | Finalidade | Mecanismo | Código |
|---|---|---|---|---|
| OpenAPI Doc | Core | Buscar modelo documental do gateway | HTTP/JSON | código |
| OpenAPI Doc | Template Service | Buscar modelo documental do template | HTTP/JSON | código |
| OpenAPI Doc | Discovery | Resolver gateway a partir do caminho de origem da documentação | HTTP/JSON | código |
| Web Pages | OpenAPI Doc | Obter JSON OpenAPI com x-origin-url |
HTTP/JSON | código |
| Scheduler | Core (callback configurado) | Excluir gateway temporário em DELETE …/gateways/{id}/force; URL definida pelo Template Service |
HTTP agendado | código · código |
| Cache Monitor (repo Invalidator) | Discovery | Limpar cache no procedimento de recuperação | HTTP DELETE /cache |
código |
| Cache Monitor (repo Invalidator) | Cache Invalidator | Verificar saúde antes de decidir recuperação | HTTP GET /cacheinvalidator/q/health |
código |
O Scheduler executa a URL persistida na atividade. A relação com Core acima é comprovada pelo callback criado pelo Template Service. Cache Monitor é um script no repositório Cache Invalidator; suas chamadas são de recuperação operacional.
Invalidação delegada à biblioteca¶
Os serviços abaixo declaram hooks e a configuração do cliente de invalidação. O endpoint receptor implementa HTTP POST /cacheinvalidator/invalidate; o transporte/interceptor da biblioteca corporativa não tem fonte neste workspace. Essas relações permanecem identificadas como delegadas, sem atribuir à aplicação uma chamada HTTP própria inexistente.
| Origem | Destino | Finalidade | Mecanismo | Código |
|---|---|---|---|---|
| Core | Cache Invalidator | Notificar mudança de gateway/rota | Hook ObjectEventListener; cliente configurado pela biblioteca |
código · código · código |
| Security | Cache Invalidator | Notificar mudança/exclusão de autorização | Hook ObjectEventListener; cliente configurado pela biblioteca |
código · código |
| IP Policy | Cache Invalidator | Notificar atualização de regra de IP | Hook ObjectEventListener; cliente configurado pela biblioteca |
código · código |
Serviços sem chamada HTTP direta a outro serviço Gateway¶
Global Registry, JSON Handler, Monitoring, Object Storage, Tunnel e Outbox Dispatcher não possuem cliente HTTP de outro microserviço Gateway no código analisado. Global Registry usa Mongo/Redis; JSON Handler processa os dados recebidos; Monitoring, Object Storage e Tunnel usam provedores externos; Dispatcher usa Mongo/RabbitMQ. Cache Invalidator usa Redis/RabbitMQ, e suas chamadas HTTP de recuperação pertencem ao script Cache Monitor listado acima.
Router executa a URL recebida em cada requisição, sem destino Gateway fixo; aparece na tabela de destinos dinâmicos.
Esse fechamento, junto às origens das tabelas, cobre os 23 serviços do inventário backend. Frameworks, health checks automáticos, exportação de telemetria e ferramentas de build não são tratados como integrações funcionais entre microserviços.
Integrações externas e destinos dinâmicos¶
Estas dependências são consumidas pelo backend, mas não são microserviços Gateway do workspace. HTTP indica o contrato; TLS e os endereços dependem da configuração. SDKs/bibliotecas são identificados quando encapsulam o transporte.
| Origem | Destino | Finalidade | Mecanismo | Código |
|---|---|---|---|---|
| BFF | iPaaS — Connector Service Core | Consultar aplicações, recursos, ambientes, contas e diagramas | HTTP/JSON | código |
| BFF | iPaaS — Connector Auth | Resolver nome do tenant por código | HTTP/JSON | código |
| BFF | Accounts | Obter token técnico e chaves JWT | HTTP via AccountsAdapter / JWKS | código · código |
| BFF | Authenticator | Consultar permissões quando o mecanismo é acionado | HTTP/JSON | código |
| Core | iPaaS | Validar recursos de conta/ambiente e dependências de diagramas | HTTP/JSON | código |
| Core | Accounts | Obter token técnico para iPaaS | AccountsAdapter / HTTP | código |
| Builder | iPaaS | Resolver recurso, ambiente, conta e diagrama da execução | HTTP/JSON | código |
| Builder | Accounts | Obter token técnico para iPaaS | AccountsAdapter / HTTP | código |
| Importer | iPaaS | Ler recursos e configurações da importação | HTTP/JSON | código |
| Importer | Accounts | Obter token técnico para iPaaS | AccountsAdapter / HTTP | código |
| Security | Keycloak | Administrar clients/credenciais e obter certificados | Admin SDK REST / HTTP | código · código |
| Security | Provedor OIDC | Validar URL de discovery e metadados de autorização externa | HTTP/JSON | código |
| Auth Provider | Keycloak | Emitir tokens | HTTP OAuth2 | código |
| Auth Provider | Provedor OIDC/JWKS | Descobrir metadados e obter chaves de validação | HTTP/JSON | código |
| Security Checker | Keycloak | Obter token para autenticação interna | HTTP OAuth2 | código |
| Broker | Keycloak | Obter JWKS para validar identidade interna | HTTP/JSON | código |
| Router | URL de destino preparada | Executar método, headers e corpo recebidos do Broker | HTTP(S) dinâmico | código |
| Scheduler | URL da atividade | Executar chamadas agendadas; Core é um destino configurado, não fixo no executor | HTTP(S) dinâmico | código |
| Object Storage | MinIO / GCS | Gravar, ler e excluir blobs conforme provider | SDK S3 / Google Cloud Storage | código |
| Web Pages | GCS | Ler artefato HTML da documentação | Google Cloud Storage SDK | código |
| Monitoring | Elasticsearch | Consultar logs/métricas por tenant | HTTP _search |
código |
| Tunnel | Cloudflare | Administrar túnel, DNS, configuração e token | HTTP/JSON | código |
| Cache Monitor (repo Invalidator) | RabbitMQ Management | Verificar estado dos shovels | HTTP/JSON | código |
| Cache Monitor (repo Invalidator) | Google Chat | Enviar notificações de recuperação | HTTP webhook/JSON | código |
Retângulos representam serviços ou grupos nomeados; cilindros, armazenamento; caixas com bordas duplas, mensageria; formas arredondadas, sistemas externos. As setas indicam chamadas ou transporte de dados, conforme o rótulo.
Comunicação assíncrona e efeitos auxiliares¶
Publicação a partir de outbox¶
Como um evento persistido chega aos consumidores? O Dispatcher transporta os registros da outbox para RabbitMQ.
%%{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
producers["Core / Template Service"]:::domain
outbox[("MongoDB · outbox")]:::store
dispatcher["Outbox Dispatcher"]:::async
rabbit[["RabbitMQ<br/><small>gateway-events</small>"]]:::async
docs["OpenAPI Doc"]:::domain
templates["Template Service<br/><small>Setups</small>"]:::domain
producers -->|Persiste evento| outbox
outbox -->|Claim / lease| dispatcher
dispatcher -->|AMQP| rabbit
rabbit -->|Documentação| docs
rabbit -->|Setup resolvido| templates
classDef domain stroke-width:1.5px;
classDef store stroke-width:1.5px;
classDef async stroke-width:1.5px;
Invalidação de caches¶
Como uma alteração invalida Redis e o cache do Discovery? Este circuito usa eventos de invalidação, separados dos de publicação.
%%{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
ipaas(["Eventos iPaaS"]):::external
invalidator["Cache Invalidator"]:::async
redis[("Redis / Valkey")]:::store
rabbit[["RabbitMQ<br/><small>Invalidação por entidade</small>"]]:::async
discovery["Discovery<br/><small>Cache em memória</small>"]:::domain
ipaas -->|ipaas-events| invalidator
invalidator -->|Exclui chaves| redis
invalidator -->|AMQP| rabbit
rabbit -->|Invalida| discovery
classDef domain stroke-width:1.5px;
classDef store stroke-width:1.5px;
classDef async stroke-width:1.5px;
classDef external stroke-width:1.5px;
Itens de importação¶
Como o Importer distribui o trabalho? Produtor e consumidor são papéis do mesmo serviço.
%%{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 LR
producer["Importer<br/><small>Produtor</small>"]:::domain
queue[["RabbitMQ<br/><small>Itens de importação</small>"]]:::async
worker["Importer<br/><small>Consumidor</small>"]:::domain
producer -->|Publica| queue
queue -->|Entrega| worker
classDef domain stroke-width:1.5px;
classDef async stroke-width:1.5px;
Produtores, transporte e consumidores¶
As origens indicam quem produz o efeito; a coluna de mecanismo explicita o transporte indireto. Os diagramas acima são recortes por circuito; a tabela também inclui kicks do Dispatcher e eventos externos de invalidação.
| Origem | Destino | Finalidade | Mecanismo | Código |
|---|---|---|---|---|
| Core | Outbox Dispatcher | Disponibilizar publicação/exclusão de gateway e resolução de setups | MongoDB outbox_events, polling/claim |
código · código |
| Template Service | Outbox Dispatcher | Disponibilizar publicação/exclusão de template | MongoDB outbox_events, polling/claim |
código · código |
| Outbox Dispatcher (eventos Core/Templates) | OpenAPI Doc | Gerar/remover documentação: gateway.published/deleted, template.published/deleted |
AMQP / RabbitMQ | código · código |
| Outbox Dispatcher (evento Core) | Template Service | Retomar operação após gateway.setups_solved |
AMQP / RabbitMQ | código · código |
| Cache Invalidator | Discovery | Invalidar cache: gateway, route, authorization, ip_policy |
AMQP / RabbitMQ | código · código |
| Cache Invalidator | Outbox Dispatcher | Antecipar dreno por kick gateway/route |
AMQP / RabbitMQ | código · código |
| Importer (produtor) | Importer (worker) | Distribuir application.import.item para application-import.worker.q |
AMQP / RabbitMQ | código · código |
| iPaaS (externo) | Cache Invalidator | Receber alteração para invalidar dados iPaaS | AMQP; exchange ipaas-events, routing key gateway-cache |
código · código |
Eventos de invalidação (gateway, route, authorization, ip_policy) e eventos de publicação têm consumidores e finalidades distintos. O Dispatcher transporta a outbox; Importer publica seus itens diretamente. Outbox e Inbox detalha leases, retry e limites de entrega; Redis descreve invalidação e estado compartilhado.
Contratos transversais¶
| Contrato | Uso e limite |
|---|---|
x-tenant-id |
Contexto interno em chamadas; não constitui sozinho autorização |
X-Gateway-Discovery |
Contexto de rota entre entrada, Broker e Builder |
X-Auth-Token |
Identidade interna transportada pelo Ingress ao Broker |
x-origin-url |
Resolução documental em contratos específicos |
x-tenant-template-owner-id / catalog-id |
Obtenção de template pelo BFF, derivados da resposta do Registry |
Last-Event-ID |
Encaminhado pelo BFF no SSE; não prova replay garantido pelo produtor |
traceparent / baggage |
Propagação OTel no cliente HTTP do BFF; instrumentação depende de configuração |
Referências com targetTenantId em Authentication/IP Policy resolvem ownership de lookup; não demonstram autorização cross-tenant. Fonte: projeção Core, referências Checker, cliente BFF, catálogo BFF.
Fronteira de entrada e ambiente¶
O cliente administrativo externo consome o BFF. APIs publicadas entram pela fronteira própria de execução. No ambiente local NGINX, Ingress faz subrequest ao Security Checker e encaminha a requisição ao Broker. Essa configuração de borda é documentada como infraestrutura local; o inventário acima descreve contratos de aplicação. O deployment corporativo pertence à visão de ambientes corporativos.