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

mseDbPool

MSE_DATABASE_URL

yzex-worker-mse

Operações relacionais do domínio MSE (tabelas de contagens, divergências, inventário).

connectDbPool

CONNECT_DATABASE_URL

yzex-worker-connect

Operações relacionais do domínio Connect (connect.whatsapp_instances, logs, status).

workerDbPool

MSE_DATABASE_URL

yzex-worker-service

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 de MSE_SUPABASE_URL e MSE_SUPABASE_SERVICE_ROLE_KEY. Schema default: public.

  • connectSupabaseAdmin: Criado a partir de CONNECT_SUPABASE_URL e CONNECT_SUPABASE_SERVICE_ROLE_KEY. Schema default: connect (configurado explicitamente via db.schema: 'connect').

4. Bounded Contexts e Guardrails Arquiteturais

Para garantir que desenvolvedores e atividades futuras não quebrem o isolamento:

  1. Testes de Fronteira Arquitetural (src/tests/architecture/domain-boundaries.test.ts): Varre estaticamente a árvore de código-fonte e bloqueia imports de mseSupabaseAdmin ou mseDbPool dentro de pastas do domínio Connect (src/temporal/activities/conect/, src/consumers/conect/), e vice-versa.

  2. Pipelines de Graceful Shutdown: Desconecta consumidores RabbitMQ primeiro, interrompe pollers de workers Temporal e encerra pools PostgreSQL de ambos os domínios deterministicamente.

  3. Namespacing de Schedules no Temporal: Manutenção isolada das rotinas cron com listas canônicas OFFICIAL_MSE_SCHEDULE_IDS e OFFICIAL_CONECT_SCHEDULE_IDS, impedindo que uma limpeza em um namespace afete o outro.