Isolamento Multi-Domínio de Segredos e Pools de Conexão
1. Visão Geral e Motivação
O yzex-worker-service atua como um worker unificado hospedando workflows Temporal e consumidores AMQP (RabbitMQ) para múltiplos domínios de negócio da organização yzex-tech:
-
Domínio MSE (
yzex-mse): Varejo baterias automotivas e industriais, inventário e conciliação. -
Domínio Connect (
yzex-conect): Comunicações omni-channel, instâncias do WhatsApp (Evolution API, ZapsterAPI), dispatch de e-mails transacionais e gerenciamento de sessões.
Historicamente, o serviço utilizava variáveis globais não prefixadas (DATABASE_URL, SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY), o que acarretava colisão de conexões, contaminação cruzada de poolers e falhas em runtime ao tentar persistir eventos de um domínio no banco de dados do outro.
2. Segregação Estrita de Pools de Banco de Dados
A camada de infraestrutura relacional (src/infrastructure/database/postgres.ts) mantém pools pg.Pool completamente independentes e segregados:
Matriz de Pools
| Pool | Variável de Origem | application_name |
Propósito |
|---|---|---|---|
|
|
|
Operações relacionais do domínio MSE (tabelas de contagens, divergências, inventário). |
|
|
|
Operações relacionais do domínio Connect ( |
|
|
|
Pool administrativo do worker (default para compatibilidade transitória). |
Prevenção de Starvation e Conexões Órfãs
Cada pool configura:
* max: 10 conexões máximas por pool.
* idleTimeoutMillis: 10000 (10 segundos).
* connectionTimeoutMillis: 5000 (5 segundos fail-fast).
* statement_timeout: 30000 (30 segundos).
* Encerramento atômico ordenado via closeAllPostgresPools() durante o ciclo de graceful shutdown da aplicação.
3. Segregação de Clientes Supabase Admin
A camada Supabase (src/infrastructure/database/supabase.ts) instancia clientes independentes com schemas dedicados:
-
mseSupabaseAdmin: Criado a partir deMSE_SUPABASE_URLeMSE_SUPABASE_SERVICE_ROLE_KEY. Schema default:public. -
connectSupabaseAdmin: Criado a partir deCONNECT_SUPABASE_URLeCONNECT_SUPABASE_SERVICE_ROLE_KEY. Schema default:connect(configurado explicitamente viadb.schema: 'connect').
4. Bounded Contexts e Guardrails Arquiteturais
Para garantir que desenvolvedores e atividades futuras não quebrem o isolamento:
-
Testes de Fronteira Arquitetural (
src/tests/architecture/domain-boundaries.test.ts): Varre estaticamente a árvore de código-fonte e bloqueia imports demseSupabaseAdminoumseDbPooldentro de pastas do domínio Connect (src/temporal/activities/conect/,src/consumers/conect/), e vice-versa. -
Pipelines de Graceful Shutdown: Desconecta consumidores RabbitMQ primeiro, interrompe pollers de workers Temporal e encerra pools PostgreSQL de ambos os domínios deterministicamente.
-
Namespacing de Schedules no Temporal: Manutenção isolada das rotinas cron com listas canônicas
OFFICIAL_MSE_SCHEDULE_IDSeOFFICIAL_CONECT_SCHEDULE_IDS, impedindo que uma limpeza em um namespace afete o outro.