O modo multi-tenant permite que o Matcher atenda múltiplos clientes com isolamento completo de dados. Cada tenant opera em seu próprio banco de dados, message broker e namespace de cache — garantindo que os dados de um tenant nunca sejam visíveis para outro. Isso é essencial para deployments SaaS, ambientes regulados ou qualquer cenário onde limites rígidos de dados entre clientes sejam necessários.Documentation Index
Fetch the complete documentation index at: https://docs.lerian.studio/llms.txt
Use this file to discover all available pages before exploring further.
Visão geral
Por padrão, o Matcher roda em modo single-tenant: todas as requisições compartilham um banco de dados e um conjunto de conexões de infraestrutura. Essa é a configuração mais simples e funciona bem para deployments de um único cliente. Quando o modo multi-tenant é habilitado, cada tenant recebe:
- Banco de dados isolado — um banco de dados PostgreSQL dedicado provisionado e gerenciado pelo serviço Tenant Manager
- Message broker isolado — um virtual host RabbitMQ dedicado, além de headers
X-Tenant-IDem cada mensagem como defesa em profundidade - Cache isolado — todas as chaves Redis são automaticamente prefixadas com o identificador do tenant
- Storage isolado — objetos S3 são prefixados com o identificador do tenant
tenant_id no token indica ao Matcher a qual tenant a requisição pertence, e as conexões de infraestrutura corretas são resolvidas automaticamente. A claim legada tenantId também é aceita como fallback para compatibilidade com versões anteriores.
Como ativar
Pré-requisitos
- O serviço Tenant Manager deve estar em execução e acessível a partir da rede do Matcher. Você pode verificar isso chamando seu endpoint
/health. - O Matcher deve estar configurado com autenticação habilitada (
PLUGIN_AUTH_ENABLED=true), já que a identidade do tenant vem do token JWT.
Configuração
As configurações multi-tenant são definidas através de variáveis de ambiente, assim como outras configurações do Matcher. Onde você as define depende do seu método de deployment:- Docker Compose: adicione-as a um arquivo
.envna raiz do projeto ou diretamente nodocker-compose.ymlna seçãoenvironment - Kubernetes / Helm: adicione-as ao seu arquivo de valores Helm na seção de ambiente apropriada
- Standalone: defina-as no ambiente do seu shell ou na configuração do gerenciador de processos
Consulte o Guia de instalação para detalhes sobre onde os arquivos de ambiente estão localizados no seu deployment.
Variáveis obrigatórias
Adicione estas à sua configuração de ambiente para habilitar o modo multi-tenant:Ajustes opcionais
Você pode ajustar tamanhos de pool, timeouts e comportamento do circuit breaker:Isolamento de tenants
Isolamento de banco de dados
Cada tenant recebe seu próprio banco de dados PostgreSQL. Quando uma requisição chega, o Matcher resolve o tenant a partir do JWT e conecta ao banco de dados dedicado daquele tenant. Se ainda não existir um pool de conexões para aquele tenant, um é criado sob demanda usando configuração do Tenant Manager. Os pools de conexão são limitados porMULTI_TENANT_MAX_TENANT_POOLS e removidos quando ociosos além de MULTI_TENANT_IDLE_TIMEOUT_SEC.
Isolamento do message broker
O isolamento do RabbitMQ usa duas camadas:- Virtual host por tenant — as mensagens de cada tenant são roteadas através de um vhost dedicado, prevenindo qualquer vazamento de mensagens entre tenants
- Headers de tenant ID — cada mensagem publicada inclui um header
X-Tenant-IDcomo uma camada adicional de segurança para consumidores downstream
Isolamento de cache
Todas as chaves Redis são automaticamente prefixadas com o identificador do tenant no formatotenant:{tenantID}:{key}. Isso se aplica a verificações de idempotência, deduplicação, rate limiting e cache de credenciais.
Isolamento de storage
Objetos armazenados em storage compatível com S3 são prefixados com{tenantID}/, garantindo que exportações e arquivos de cada tenant sejam separados no nível de armazenamento.
Gerenciamento de pools de conexão
O Matcher mantém um pool de conexões de banco de dados para cada tenant ativo. Estas configurações controlam o uso de recursos:
| Variável | Padrão | Descrição |
|---|---|---|
MULTI_TENANT_MAX_TENANT_POOLS | 100 | Número máximo de pools de tenants mantidos simultaneamente. Quando o limite é atingido, o pool menos recentemente utilizado é removido. |
MULTI_TENANT_IDLE_TIMEOUT_SEC | 300 | Quanto tempo (em segundos) um pool de tenant não utilizado permanece aberto antes de ser limpo. |
Planejamento de capacidade
Cada pool de tenant usa atéPOSTGRES_MAX_OPEN_CONNS conexões (padrão: 25). Com 100 pools de tenants, o total no pior caso é 2.500 conexões PostgreSQL. Dimensione o max_connections do seu banco de dados adequadamente.
Verificações de saúde automáticas
O Matcher periodicamente re-verifica a configuração dos tenants (a cadaMULTI_TENANT_CONNECTIONS_CHECK_INTERVAL_SEC, padrão 30s) para detectar rotação de credenciais ou mudanças nas configurações do pool. Configurações atualizadas são aplicadas sem necessidade de reinicialização.
Circuit breaker
Se o Tenant Manager se tornar inacessível, um circuit breaker protege o Matcher de falhas em cascata.
| Variável | Padrão | Descrição |
|---|---|---|
MULTI_TENANT_CIRCUIT_BREAKER_THRESHOLD | 5 | Quantas falhas consecutivas antes do circuit breaker ativar. |
MULTI_TENANT_CIRCUIT_BREAKER_TIMEOUT_SEC | 30 | Quanto tempo o breaker permanece ativo antes de permitir uma nova tentativa. |
Cache de configuração de tenants
Para reduzir chamadas ao Tenant Manager, o Matcher armazena em cache as configurações dos tenants em memória.
| Variável | Padrão | Descrição |
|---|---|---|
MULTI_TENANT_CACHE_TTL_SEC | 120 | Quanto tempo (em segundos) a configuração do tenant é cacheada antes de ser atualizada a partir do Tenant Manager. |
Credenciais M2M (integração com Fetcher)
Quando o modo multi-tenant está habilitado e o Matcher precisa chamar o serviço Fetcher, ele se autentica usando credenciais machine-to-machine (M2M) por tenant armazenadas no AWS Secrets Manager.
Como funciona
- Quando o Matcher chama o Fetcher em nome de um tenant, ele busca as credenciais daquele tenant
- As credenciais são cacheadas em dois níveis para performance: em memória (30 segundos) e Redis (TTL configurável)
- Se o Fetcher retornar um
401 Unauthorized, ambos os caches são automaticamente limpos e novas credenciais são buscadas
Configuração
Adicione estas à sua configuração de ambiente se o Matcher precisar chamar o Fetcher em modo multi-tenant:A IAM role do serviço precisa da permissão
secretsmanager:GetSecretValue para o caminho tenants/{env}/{tenantOrgID}/matcher/m2m/fetcher/credentials.Todas as variáveis de ambiente
Infraestrutura multi-tenant
| Variável | Tipo | Padrão | Obrigatório | Descrição |
|---|---|---|---|---|
MULTI_TENANT_ENABLED | bool | false | Não | Chave mestra para o modo multi-tenant. |
MULTI_TENANT_URL | string | — | Sim (quando habilitado) | URL base do serviço Tenant Manager. |
MULTI_TENANT_SERVICE_API_KEY | string | — | Sim (quando habilitado) | Chave de API para autenticação com o Tenant Manager. |
MULTI_TENANT_ENVIRONMENT | string | — | Não | Label de ambiente para resolução de tenant. |
MULTI_TENANT_MAX_TENANT_POOLS | int | 100 | Não | Máximo de pools de conexão de tenants simultâneos. |
MULTI_TENANT_IDLE_TIMEOUT_SEC | int | 300 | Não | Segundos antes de um pool de tenant ocioso ser removido. |
MULTI_TENANT_TIMEOUT | int | 30 | Não | Timeout HTTP (segundos) para chamadas à API do Tenant Manager. |
MULTI_TENANT_CIRCUIT_BREAKER_THRESHOLD | int | 5 | Não | Falhas consecutivas antes do circuit breaker ativar. |
MULTI_TENANT_CIRCUIT_BREAKER_TIMEOUT_SEC | int | 30 | Não | Segundos que o circuit breaker permanece ativo. |
MULTI_TENANT_CACHE_TTL_SEC | int | 120 | Não | TTL do cache (segundos) para configurações de tenants. |
MULTI_TENANT_CONNECTIONS_CHECK_INTERVAL_SEC | int | 30 | Não | Intervalo (segundos) para verificações de saúde dos pools de conexão. |
MULTI_TENANT_REDIS_HOST | string | — | Não | Host Redis para descoberta de tenant orientada a eventos. |
MULTI_TENANT_REDIS_PORT | string | 6379 | Não | Porta Redis para descoberta de tenant. |
MULTI_TENANT_REDIS_PASSWORD | string | — | Não | Senha Redis para descoberta de tenant. |
MULTI_TENANT_REDIS_TLS | bool | false | Não | Habilitar TLS para Redis de descoberta de tenant. |
Tenant padrão
| Variável | Tipo | Padrão | Descrição |
|---|---|---|---|
DEFAULT_TENANT_ID | string | 11111111-1111-1111-1111-111111111111 | UUID do tenant padrão (fallback). Usado no modo single-tenant. |
DEFAULT_TENANT_SLUG | string | default | Slug do tenant padrão. |
Credenciais M2M (Fetcher)
| Variável | Tipo | Padrão | Obrigatório | Descrição |
|---|---|---|---|---|
M2M_TARGET_SERVICE | string | fetcher | Não | Nome do serviço de destino para busca de credenciais. |
M2M_CREDENTIAL_CACHE_TTL_SEC | int | 300 | Não | TTL do cache Redis (segundos) para credenciais M2M. |
AWS_REGION | string | — | Sim (se M2M) | Região AWS para Secrets Manager. |
Verificando o modo multi-tenant
Após ativar o modo multi-tenant, verifique se tudo está funcionando:
- Verifique os logs de inicialização. Procure por mensagens confirmando que a infraestrutura multi-tenant foi inicializada com sucesso.
-
Teste com um JWT de tenant. Envie uma requisição de API (por exemplo, listar contextos) usando um JWT que contenha uma claim
tenant_id. A requisição deve ter sucesso e retornar dados para aquele tenant específico. - Verifique o isolamento. Faça a mesma chamada de API com JWTs para dois tenants diferentes. Confirme que dados criados sob um tenant não são visíveis para o outro.
-
Verifique métricas (se telemetria estiver habilitada). A métrica
tenant_connections_totaldeve incrementar conforme novos pools de tenants são criados. - Verifique credenciais M2M (se usando Fetcher). Verifique os logs para busca bem-sucedida de credenciais quando o Matcher chama o Fetcher para um tenant.
Desativando o modo multi-tenant
Para retornar ao modo single-tenant:
- Defina
MULTI_TENANT_ENABLED=falsena sua configuração de ambiente (ou remova a variável completamente). - Reinicie o serviço Matcher.
Considerações de deployment
Migração de chaves Redis
Migração de chaves Redis
Ao mudar do modo single-tenant para multi-tenant, as chaves Redis mudam de formato. Chaves no formato antigo são tratadas como cache misses até que seu TTL expire. Isso é auto-corrigível e tipicamente se resolve em 1-5 minutos.
Migração de objetos S3
Migração de objetos S3
Objetos existentes criados antes da ativação multi-tenant permanecem em seus caminhos originais. Novos objetos recebem o prefixo do tenant automaticamente. Se dados históricos devem ser acessíveis por tenant, um script de migração único pode ser necessário.
Dimensionamento de pools de conexão
Dimensionamento de pools de conexão
Planeje o
max_connections do seu PostgreSQL baseado no número máximo de pools de tenants multiplicado por conexões por pool. Use MULTI_TENANT_IDLE_TIMEOUT_SEC para recuperar pools de tenants inativos.Circuit breaker durante indisponibilidade do Tenant Manager
Circuit breaker durante indisponibilidade do Tenant Manager
Enquanto o circuit breaker está ativo, requisições de novos tenants falham rapidamente, mas pools de tenants existentes continuam funcionando. Planeje alta disponibilidade do Tenant Manager em produção.
Próximos passos
Configuração em tempo de execução
Altere configurações do Matcher em runtime sem reinicializações.
Guia de instalação
Configure o Matcher do zero.
Segurança
Autenticação, autorização e proteção de dados.
Discovery (Fetcher)
Descoberta automática de sources através do Fetcher.

