Una aplicación SaaS multitenancy sirve múltiples clientes (tenants) desde la misma aplicación. El desafío es aislamiento: que Tenant A no vea datos de Tenant B.
Estrategias de aislamiento: row-level, schema-level, database-level
Row-level: mismo schema, pero cada tenant solo ve sus filas (con WHERE tenant_id = X). Más barato, complejidad operacional media.
Schema-level: cada tenant su schema en misma base de datos. Mejor aislamiento, un poco más costoso.
Database-level: cada tenant su base de datos. Máximo aislamiento, máximo costo, máxima complejidad operacional.
- Row-level: la mayoría usa esto para economizar.
- Schema-level: si necesitas personalización por tenant.
- Database-level: si tenants tienen requisitos reguladores estrictos.
Aislamiento en código: middleware y context
Sea cual sea la estrategia de base de datos, tu código debe imponer aislamiento. No basta confiar en WHERE. Usa middleware que valida que usuario actual tiene acceso a datos que solicita.
- Identifica tenant del usuario en autenticación.
- Propaga tenant_id en contexto o cookie.
- En cada query, asegúrate que tenant_id coincide.
Billing y metering: cobra según uso
Multitenancy requiere medir uso de cada tenant: qué API calls hizo, qué storage usó, qué features utilizó. Basado en eso, generas factura.
Las métricas deben ser exactas: subercargar alienado a clientes, subcargar te arruina.
- Registra eventos de uso (API calls, storage).
- Agrega diarios para calcular factura.
- Facturación automática o manual según modelo.
Rendimiento: múltiples tenants en misma BD
El riesgo es que un tenant "ladrón" (que hace muchas queries) ralentice a otros. Solución: rate limiting por tenant, queries lentas monitoredo.
También puedes usar índices smart que consideren tenant_id primero para buscar rápido.
Una arquitectura multitenancy bien hecha parece un servidor privado para cada cliente, aunque internamente comparten infraestructura.
Secretos y configuración por tenant
Algunos tenants necesitan webhooks propios, credenciales externas, o configuración especial. Guarda eso en tabla de configuración por tenant.
Eso permite personalización sin afectar otros clientes.