El modo multi-tenant permite que Matcher sirva a múltiples clientes con aislamiento completo de datos. Cada inquilino opera en su propia base de datos, broker de mensajes y namespace de caché, asegurando que los datos de un inquilino nunca sean visibles para otro. Esto es esencial para despliegues SaaS, entornos regulados o cualquier escenario donde se requieran límites estrictos de datos entre clientes.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.
Descripción general
Por defecto, Matcher se ejecuta en modo single-tenant: todas las solicitudes comparten una base de datos y un conjunto de conexiones de infraestructura. Esta es la configuración más simple y funciona bien para despliegues de un solo cliente. Cuando se habilita el modo multi-tenant, cada inquilino recibe:
- Base de datos aislada — una base de datos PostgreSQL dedicada provisionada y gestionada por el servicio Tenant Manager
- Broker de mensajes aislado — un virtual host dedicado de RabbitMQ, más encabezados
X-Tenant-IDen cada mensaje como defensa en profundidad - Caché aislado — todas las claves de Redis se prefijan automáticamente con el identificador del inquilino
- Almacenamiento aislado — los objetos S3 se prefijan con el identificador del inquilino
tenant_id en el token le indica a Matcher a qué inquilino pertenece la solicitud, y las conexiones de infraestructura correctas se resuelven automáticamente. El claim heredado tenantId también se acepta como alternativa para compatibilidad con versiones anteriores.
Cómo activar
Prerrequisitos
- El servicio Tenant Manager debe estar en ejecución y accesible desde la red de Matcher. Puede verificar esto llamando a su endpoint
/health. - Matcher debe estar configurado con autenticación habilitada (
PLUGIN_AUTH_ENABLED=true), ya que la identidad del inquilino proviene del token JWT.
Configuración
Las configuraciones multi-tenant se establecen a través de variables de entorno, igual que otras configuraciones de Matcher. Dónde las defina depende de su método de despliegue:- Docker Compose: agréguelas a un archivo
.enven la raíz del proyecto o directamente endocker-compose.ymlen la secciónenvironment - Kubernetes / Helm: agréguelas a su archivo de valores de Helm en la sección de entorno correspondiente
- Standalone: defínalas en su entorno de shell o configuración del gestor de procesos
Consulte la Guía de instalación para detalles sobre dónde se ubican los archivos de entorno en su despliegue.
Variables requeridas
Agregue estas a su configuración de entorno para habilitar el modo multi-tenant:Ajuste opcional
Puede ajustar tamaños de pool, tiempos de espera y comportamiento del circuit breaker:Aislamiento de inquilinos
Aislamiento de base de datos
Cada inquilino obtiene su propia base de datos PostgreSQL. Cuando llega una solicitud, Matcher resuelve el inquilino desde el JWT y se conecta a la base de datos dedicada de ese inquilino. Si aún no existe un pool de conexiones para ese inquilino, se crea bajo demanda usando la configuración del Tenant Manager. Los pools de conexiones están limitados porMULTI_TENANT_MAX_TENANT_POOLS y se desalojan cuando están inactivos más allá de MULTI_TENANT_IDLE_TIMEOUT_SEC.
Aislamiento del broker de mensajes
El aislamiento de RabbitMQ utiliza dos capas:- Virtual host por inquilino — los mensajes de cada inquilino se enrutan a través de un vhost dedicado, previniendo cualquier filtración de mensajes entre inquilinos
- Encabezados de Tenant ID — cada mensaje publicado incluye un encabezado
X-Tenant-IDcomo capa de seguridad adicional para consumidores posteriores
Aislamiento de caché
Todas las claves de Redis se prefijan automáticamente con el identificador del inquilino en el formatotenant:{tenantID}:{key}. Esto aplica a verificaciones de idempotencia, deduplicación, limitación de tasa y almacenamiento en caché de credenciales.
Aislamiento de almacenamiento
Los objetos almacenados en almacenamiento compatible con S3 se prefijan con{tenantID}/, asegurando que las exportaciones y archivos de cada inquilino estén separados a nivel de almacenamiento.
Gestión de pools de conexiones
Matcher mantiene un pool de conexiones de base de datos para cada inquilino activo. Estas configuraciones controlan el uso de recursos:
| Variable | Por defecto | Descripción |
|---|---|---|
MULTI_TENANT_MAX_TENANT_POOLS | 100 | Número máximo de pools de inquilinos mantenidos simultáneamente. Cuando se alcanza el límite, el pool menos recientemente usado se desaloja. |
MULTI_TENANT_IDLE_TIMEOUT_SEC | 300 | Cuánto tiempo (en segundos) un pool de inquilino inactivo permanece abierto antes de ser limpiado. |
Planificación de capacidad
Cada pool de inquilino usa hastaPOSTGRES_MAX_OPEN_CONNS conexiones (por defecto: 25). Con 100 pools de inquilinos, el peor caso total es 2,500 conexiones PostgreSQL. Dimensione el max_connections de su base de datos en consecuencia.
Verificaciones de salud automáticas
Matcher verifica periódicamente la configuración de inquilinos (cadaMULTI_TENANT_CONNECTIONS_CHECK_INTERVAL_SEC, por defecto 30s) para detectar rotación de credenciales o cambios en la configuración del pool. Las configuraciones actualizadas se aplican sin requerir un reinicio.
Circuit breaker
Si el Tenant Manager se vuelve inaccesible, un circuit breaker protege a Matcher de fallos en cascada.
| Variable | Por defecto | Descripción |
|---|---|---|
MULTI_TENANT_CIRCUIT_BREAKER_THRESHOLD | 5 | Cuántos fallos consecutivos antes de que el circuit breaker se active. |
MULTI_TENANT_CIRCUIT_BREAKER_TIMEOUT_SEC | 30 | Cuánto tiempo el breaker permanece activo antes de permitir un reintento. |
Caché de configuración de inquilinos
Para reducir llamadas al Tenant Manager, Matcher almacena en caché las configuraciones de inquilinos en memoria.
| Variable | Por defecto | Descripción |
|---|---|---|
MULTI_TENANT_CACHE_TTL_SEC | 120 | Cuánto tiempo (en segundos) la configuración del inquilino se almacena en caché antes de actualizarse desde el Tenant Manager. |
Credenciales M2M (integración con Fetcher)
Cuando el modo multi-tenant está habilitado y Matcher necesita llamar al servicio Fetcher, se autentica usando credenciales machine-to-machine (M2M) por inquilino almacenadas en AWS Secrets Manager.
Cómo funciona
- Cuando Matcher llama a Fetcher en nombre de un inquilino, busca las credenciales de ese inquilino
- Las credenciales se almacenan en caché en dos niveles para rendimiento: en memoria (30 segundos) y Redis (TTL configurable)
- Si Fetcher devuelve un
401 Unauthorized, ambas cachés se limpian automáticamente y se obtienen credenciales frescas
Configuración
Agregue estas a su configuración de entorno si Matcher necesita llamar a Fetcher en modo multi-tenant:El rol IAM del servicio necesita el permiso
secretsmanager:GetSecretValue para la ruta tenants/{env}/{tenantOrgID}/matcher/m2m/fetcher/credentials.Todas las variables de entorno
Infraestructura multi-tenant
| Variable | Tipo | Por defecto | Requerida | Descripción |
|---|---|---|---|---|
MULTI_TENANT_ENABLED | bool | false | No | Interruptor principal para el modo multi-tenant. |
MULTI_TENANT_URL | string | — | Sí (cuando está habilitado) | URL base del servicio Tenant Manager. |
MULTI_TENANT_SERVICE_API_KEY | string | — | Sí (cuando está habilitado) | Clave API para autenticarse con el Tenant Manager. |
MULTI_TENANT_ENVIRONMENT | string | — | No | Etiqueta de entorno para resolución de inquilinos. |
MULTI_TENANT_MAX_TENANT_POOLS | int | 100 | No | Pools de conexiones de inquilinos concurrentes máximos. |
MULTI_TENANT_IDLE_TIMEOUT_SEC | int | 300 | No | Segundos antes de que un pool de inquilino inactivo sea desalojado. |
MULTI_TENANT_TIMEOUT | int | 30 | No | Tiempo de espera HTTP (segundos) para llamadas a la API del Tenant Manager. |
MULTI_TENANT_CIRCUIT_BREAKER_THRESHOLD | int | 5 | No | Fallos consecutivos antes de que el circuit breaker se active. |
MULTI_TENANT_CIRCUIT_BREAKER_TIMEOUT_SEC | int | 30 | No | Segundos que el circuit breaker permanece activo. |
MULTI_TENANT_CACHE_TTL_SEC | int | 120 | No | TTL de caché (segundos) para configuraciones de inquilinos. |
MULTI_TENANT_CONNECTIONS_CHECK_INTERVAL_SEC | int | 30 | No | Intervalo (segundos) para verificaciones de salud del pool de conexiones. |
MULTI_TENANT_REDIS_HOST | string | — | No | Host de Redis para descubrimiento de inquilinos basado en eventos. |
MULTI_TENANT_REDIS_PORT | string | 6379 | No | Puerto de Redis para descubrimiento de inquilinos. |
MULTI_TENANT_REDIS_PASSWORD | string | — | No | Contraseña de Redis para descubrimiento de inquilinos. |
MULTI_TENANT_REDIS_TLS | bool | false | No | Habilitar TLS para Redis de descubrimiento de inquilinos. |
Inquilino por defecto
| Variable | Tipo | Por defecto | Descripción |
|---|---|---|---|
DEFAULT_TENANT_ID | string | 11111111-1111-1111-1111-111111111111 | UUID del inquilino por defecto (fallback). Usado en modo single-tenant. |
DEFAULT_TENANT_SLUG | string | default | Slug del inquilino por defecto. |
Credenciales M2M (Fetcher)
| Variable | Tipo | Por defecto | Requerida | Descripción |
|---|---|---|---|---|
M2M_TARGET_SERVICE | string | fetcher | No | Nombre del servicio de destino para búsqueda de credenciales. |
M2M_CREDENTIAL_CACHE_TTL_SEC | int | 300 | No | TTL de caché en Redis (segundos) para credenciales M2M. |
AWS_REGION | string | — | Sí (si M2M) | Región de AWS para Secrets Manager. |
Verificar el modo multi-tenant
Después de activar el modo multi-tenant, verifique que todo esté funcionando:
- Revise los logs de inicio. Busque mensajes que confirmen que la infraestructura multi-tenant se inicializó correctamente.
-
Pruebe con un JWT de inquilino. Envíe una solicitud de API (por ejemplo, listar contextos) usando un JWT que contenga un claim
tenant_id. La solicitud debería ser exitosa y devolver datos para ese inquilino específico. - Verifique el aislamiento. Realice la misma llamada de API con JWTs para dos inquilinos diferentes. Confirme que los datos creados bajo un inquilino no son visibles para el otro.
-
Revise las métricas (si la telemetría está habilitada). La métrica
tenant_connections_totaldebería incrementarse a medida que se crean nuevos pools de inquilinos. - Verifique las credenciales M2M (si usa Fetcher). Revise los logs para verificar la obtención exitosa de credenciales cuando Matcher llama a Fetcher para un inquilino.
Desactivar el modo multi-tenant
Para volver al modo single-tenant:
- Establezca
MULTI_TENANT_ENABLED=falseen su configuración de entorno (o elimine la variable completamente). - Reinicie el servicio Matcher.
Consideraciones de despliegue
Migración de claves de Redis
Migración de claves de Redis
Al cambiar de modo single-tenant a multi-tenant, las claves de Redis cambian de formato. Las claves con formato antiguo se tratan como cache misses hasta que expire su TTL. Esto se auto-repara y típicamente se resuelve en 1–5 minutos.
Migración de objetos S3
Migración de objetos S3
Los objetos existentes creados antes de la activación multi-tenant permanecen en sus rutas originales. Los nuevos objetos obtienen el prefijo de inquilino automáticamente. Si los datos históricos deben ser accesibles por inquilino, puede ser necesario un script de migración único.
Dimensionamiento de pools de conexiones
Dimensionamiento de pools de conexiones
Planifique el
max_connections de PostgreSQL basándose en el número máximo de pools de inquilinos multiplicado por las conexiones por pool. Use MULTI_TENANT_IDLE_TIMEOUT_SEC para reclamar pools de inquilinos inactivos.Circuit breaker durante interrupciones del Tenant Manager
Circuit breaker durante interrupciones del Tenant Manager
Mientras el circuit breaker está activo, las solicitudes de nuevos inquilinos fallan rápidamente pero los pools de inquilinos existentes continúan funcionando. Planifique alta disponibilidad del Tenant Manager en producción.
Próximos pasos
Configuración en tiempo de ejecución
Cambie la configuración de Matcher en tiempo de ejecución sin reinicios.
Guía de instalación
Configure Matcher desde cero.
Seguridad
Autenticación, autorización y protección de datos.
Discovery (Fetcher)
Descubrimiento automático de fuentes a través de Fetcher.

