Qué es (y qué no es) multi-tenant
- Multi-tenant: una misma base de código y (generalmente) una misma infraestructura atienden a múltiples organizaciones. Cada solicitud se procesa en el “contexto de un tenant”.
- No es lo mismo que multiusuario: en multiusuario hay usuarios; en multi-tenant hay “organizaciones” (tenant) que agrupan usuarios, datos, políticas y configuración.
- Aislamiento: puede ser lógico (por columna TenantId) o físico (por base de datos/servidor).
Modelos comunes de almacenamiento (del más compartido al más aislado)
1. Base compartida + tablas compartidas (TenantId por fila)
- Un esquema único; cada tabla contiene
TenantId. - Es el modelo más común por costo y simplicidad operativa inicial.
2. Base compartida + esquema por tenant
- Esquemas separados (por ejemplo
TenantA.*,TenantB.*) dentro de la misma base. - Aumenta aislamiento, complica despliegues y tooling.
3. Base por tenant (mismo servidor o varios)
- Aislamiento alto, backups/restores por cliente, control granular de rendimiento.
- Incrementa costos y complejidad operativa.
4. Infraestructura por tenant (aislamiento completo)
- Se usa en clientes con alta criticidad/regulación.
- Es el modelo más caro; se justifica por requisitos.
Pros del multi-tenant
1) Economía de escala (costo)
- Infra compartida: menor costo por cliente.
- Mejor utilización de recursos (CPU, memoria, conexiones, licencias).
- Operaciones centralizadas (monitoring, despliegues, seguridad).
2) Time-to-market y mantenimiento
- Una base de código, un pipeline, un proceso de release.
- Un conjunto de features para todos; evita divergencias por cliente.
- Correcciones y parches de seguridad se propagan rápidamente.
3) Datos y producto: aprendizaje transversal
- Métricas agregadas (respetando privacidad) facilitan mejorar el producto.
- Posibilidad de benchmarks anónimos, modelos predictivos, optimización operativa.
4) Estandarización de integraciones
- Un “contrato” de APIs y flujos, con configuración por tenant.
- Menos variantes por cliente.
Contras del multi-tenant (los problemas reales)
1) Riesgo de aislamiento insuficiente (seguridad)
- Un bug puede exponer datos de otros tenants.
- Errores típicos: filtros omitidos, joins incorrectos, cachés no segregadas, exportaciones sin tenant.
Impacto: alto. Es el riesgo principal.
2) “Noisy neighbor” (performance impredecible)
- Un tenant con carga alta degrada al resto.
- Consultas pesadas, picos de tráfico, locks y contención (SQL), saturación de pools.
3) Operación y soporte más complejos
- Diagnóstico: hay que correlacionar incidentes por tenant.
- Migraciones de datos: más difíciles si cada tenant está en un estado distinto.
- Gestión de configuraciones: feature flags, políticas, límites, etc.
4) Despliegues y cambios de esquema con mayor riesgo
- Un cambio en DB afecta a todos.
- Exige disciplina: migraciones seguras, compatibilidad hacia atrás, rollout gradual.
5) Compliance y requisitos por industria
- Algunas regulaciones o contratos exigen segregación física.
- Requisitos de retención, residencia de datos, auditoría avanzada, cifrado por tenant.
Mitigaciones prácticas (lo que debe existir en un multi-tenant serio)
Aislamiento y seguridad
- Tenant resolution consistente: el tenant se determina por host/subdominio, token, header, o routing, y se valida en cada request.
- Capa de datos con “guardrails”:
- EF Core: Global Query Filters por
TenantId. - SQL Server: Row-Level Security (RLS) cuando aplica.
- Constraints e índices con
TenantIdpara evitar scans y errores de unicidad cruzada.
- EF Core: Global Query Filters por
- Caché segregada: claves con prefijo
TenantId, particiones por tenant y límites.
Performance y estabilidad
- Cuotas y límites por tenant (rate limiting, concurrencia, tamaño de payload).
- Índices compuestos por
(TenantId, …)alineados a patrones de consulta. - Observabilidad por tenant: métricas, logs y trazas con
TenantIdcomo dimensión obligatoria. - Separación de workloads: colas, jobs y procesos batch con control por tenant.
Operación
- Backups/restore: definir estrategia según modelo (por fila vs por base).
- Onboarding/Offboarding automatizado: creación de tenant, seeds, límites, claves.
- Feature flags y despliegue gradual: habilitación por tenant para reducir blast radius.
Consideraciones específicas en .NET
- TenantContext como dependencia transversal (scoped), inyectado desde middleware.
- Autorización: políticas que incluyan “pertenencia al tenant” (no solo roles).
- EF Core:
HasQueryFilter()por entidad paraTenantId.- Interceptores para asegurar
TenantIdal insertar/actualizar. - Evitar “IgnoreQueryFilters” salvo casos auditados.
- Background services: los jobs deben iterar tenants de forma controlada (y no ejecutar todo sin límites).
- Multiconfiguración: settings por tenant (planes, límites, integraciones), preferentemente en una fuente central con caché segregada.
Consideraciones específicas en SQL Server
- Diseño de claves e índices:
- Unicidad frecuentemente debe ser
(TenantId, CampoNegocio)en lugar de soloCampoNegocio. - Índices compuestos deben comenzar por
TenantIdsi el patrón filtra por tenant.
- Unicidad frecuentemente debe ser
- Contención y locking:
- En tablas multi-tenant grandes, una mala consulta afecta a todos.
- Revisar planes de ejecución, estadísticas y niveles de aislamiento.
- RLS:
- Útil para reducir riesgo humano/errores, pero requiere diseño cuidadoso y pruebas de performance.
- Estrategias de particionamiento/sharding:
- Cuando crece, puede evolucionar a “grupos de tenants” por base/servidor.
Cuándo multi-tenant es buena idea (y cuándo no)
Buena idea si:
- El producto es estandarizable (80–90% común).
- Necesita escalar en número de clientes con costo controlado.
- Puede imponer límites y políticas de uso.
- El equipo tiene disciplina de ingeniería (observabilidad, pruebas, migraciones).
No es buena idea (o requiere aislamiento mayor) si:
- Hay requisitos regulatorios fuertes de segregación.
- Pocos clientes pero muy grandes y con SLAs rígidos por cliente.
- Personalización por cliente es alta y tiende a bifurcar el producto.
- La operación exige restore/forense por cliente de forma frecuente.
Conclusión
Multi-tenant maximiza eficiencia y velocidad, pero aumenta el costo técnico de aislamiento, gobernanza de datos y operación. La decisión correcta no es binaria: muchos SaaS exitosos comienzan con modelo compartido por fila y, al crecer, migran a bases por tenant para clientes “enterprise” o para grupos de tenants (sharding), manteniendo una única base de código.
Hasta aquí por hoy. Gracias por acompañarme.
Multi-tenant en SaaS: pros, contras y criterios de arquitectura (con .NET y SQL Server)
