main content
< Volver a blog sobre aplicaciones móviles

Arquitectura Multi-Tenant Web a Medida

Como implementar una arquitectura multi-tenant en tu aplicacion web a medida

En una mesa redonda reciente sobre SaaS, un fundador madrileño contaba la escena que cambio su roadmap: el cliente numero treinta y tres pedia un campo personalizado, y cada alta exigia desplegar una instancia nueva. "Cobrabamos 200 euros al mes y nos costaba 180 mantenerlo", admitio. Esa cuenta, sumada a una madrugada apagando fuegos, fue el detonante para repensarlo todo.

La pregunta detras es vieja pero sigue mandando: ¿cada cliente vive en su propia copia del sistema o todos comparten la misma fontaneria? Saber como implementar una arquitectura multi-tenant en tu aplicacion web a medida se nota en la cuenta de resultados desde el segundo año. Quienes acertaron pronto presumen de margenes brutos por encima del 70%. Quienes no, siguen refactorizando.

Que significa realmente multi-tenancy

Imagina un edificio de oficinas. Cada empresa tiene su llave, su despacho amueblado a su gusto y la sensacion de estar en un sitio propio. La caldera, los ascensores y la fibra optica son una sola instalacion. Eso es multi-tenancy: una instancia del software sirve a multiples clientes —tenants— a la vez, con datos separados y configuracion independiente, mientras codigo, servidores y a menudo la base de datos son recursos compartidos.

Este enfoque sostiene la mayoria del SaaS que cualquiera usa cada mañana. Desde Slack hasta una plataforma de facturacion local: detras hay multi-tenancy haciendo que miles de clientes convivan sin multiplicar infraestructura.

La alternativa, single-tenant, monta una instancia entera por cliente. Empezar asi es comodo, pero el coste operativo crece lineal: cada nuevo logo añade servidores, bases de datos y despliegues que alguien tiene que mantener despierto a las tres de la madrugada.

Los tres modelos clasicos de aislamiento de datos

La decision tecnica que mas determina el resto del producto es donde y como se aislan los datos. Existen tres modelos clasicos, y conviene mirarlos con la calculadora al lado.

Base de datos compartida con esquema compartido

Una sola base de datos, las mismas tablas para todos, y una columna tenant_id que dice de quien es cada fila. Punto.

Es el modelo mas barato en infraestructura: una unica base de datos, un solo esquema, un solo punto de mantenimiento. Las migraciones se aplican una vez y benefician —o castigan— a todos por igual. Para una startup que aun no sabe si su producto va a sobrevivir al primer año, esta simplicidad pesa mucho.

¿El precio? El riesgo de fuga de datos. Una consulta que olvida el filtro por tenant_id puede dejar que un cliente vea informacion de otro. Suena improbable hasta que ocurre y lo detecta el equipo de seguridad de un cliente grande. Hay otro problema menos dramatico: un tenant que dispara su volumen degrada el rendimiento de los demas sin que nadie sepa por que la app va lenta esa mañana.

Base de datos compartida con esquemas separados

Una sola base de datos, pero cada tenant vive en su propio esquema. En PostgreSQL es literal: cada cliente trabaja dentro de su schema, con sus tablas replicadas. El aislamiento logico sube varios escalones respecto a la columna discriminadora.

El equilibrio es atractivo. Las migraciones cuestan algo mas porque hay que recorrerse cada esquema, pero la infraestructura sigue siendo una sola base de datos y los respaldos por tenant se vuelven manejables. Empresas que arrancan con cincuenta clientes B2B suelen aterrizar aqui.

La complicacion llega con la escala. Gestionar cientos de esquemas en una misma base de datos puede colapsar tiempos de migracion y saturar la gestion de conexiones. Conviene tener un plan B antes de cruzar el umbral.

Bases de datos separadas por tenant

Cada cliente, su propia base de datos. Aislamiento total: no hay consulta mal escrita capaz de cruzar fronteras. Es el modelo que prefieren los sectores donde una auditoria mal contestada cuesta una multa o una licencia: banca, salud, administracion publica.

A cambio, todo se multiplica. Cada base de datos arrastra configuracion, respaldos y monitorizacion propias. Las migraciones dejan de ser una orden y pasan a ser un proyecto, con su ventana de mantenimiento y su rollback documentado. Si la propuesta de valor exige ese aislamiento, el coste sale a cuenta.

Como elegir el modelo adecuado

No existe un modelo universalmente superior. La eleccion depende de cuatro factores que se cruzan en una sola conversacion.

Numero esperado de tenants. Un SaaS para miles de pymes a 15 euros al mes casi siempre acaba en base de datos compartida con tenant_id. Si los clientes son veinte corporaciones pagando seis cifras anuales, las bases separadas tienen otra logica.

Requisitos regulatorios. El RGPD se cumple con cualquiera de los tres modelos si se implementan con cabeza. La diferencia esta en demostrarlo. Una base separada simplifica la conversacion con un auditor o con el DPO de un cliente bancario.

Presupuesto de infraestructura. El modelo compartido aguanta con un solo servidor de base de datos mucho mas tiempo del que uno pensaria. Los modelos separados multiplican el AWS desde el primer despliegue.

Necesidad de personalizacion por tenant. Cuando cada cliente pide sus campos a medida, sus flujos distintos o integraciones especificas, el aislamiento a nivel de esquema o base de datos facilita la vida. No por imposibilidad tecnica del modelo compartido, sino porque la disciplina para mantenerlo limpio es mayor de la que un equipo joven suele tener.

Patrones de implementacion que funcionan en la practica

Middleware de contexto de tenant

El patron que mas se repite en codigo real consiste en resolver el tenant al principio de cada peticion HTTP. Un middleware mira el subdominio (acme.tuapp.com), una cabecera, el claim de un JWT o un tramo de URL, identifica al tenant y deja un contexto que acompaña a toda la peticion como una etiqueta cosida.

En Django, Express o Spring Boot este middleware se monta como un interceptor que inyecta el tenant_id en el contexto. A partir de ahi, las consultas lo incorporan de forma automatica y el desarrollador deja de tener que acordarse del filtro en cada query. Esa es la diferencia entre un equipo que duerme tranquilo y uno que pone alertas en el SIEM cada noche.

Row-Level Security en PostgreSQL

PostgreSQL trae una red de seguridad nativa para el modelo de esquema compartido: Row-Level Security. Se definen politicas a nivel de base de datos que impiden a una sesion acceder a filas que no le pertenecen.

El flujo tipico fija una variable de sesion con el tenant_id al inicio de cada conexion, y las politicas RLS filtran a partir de ahi. Es un seguro contra los errores propios. Aunque la aplicacion meta la pata, la base de datos no entrega lo que no toca. Quien haya pasado por una fuga sabe que ese segundo perimetro tiene un valor dificil de exagerar.

Personalizaciones por tenant sin romper la base comun

Toda aplicacion multi-tenant llega a la misma encrucijada: clientes que piden campos propios, apariencias propias, flujos propios. Si esas peticiones acaban en condicionales repartidos por el codigo, el producto se convierte en un laberinto que solo dos personas entienden.

La estrategia que aguanta el tiempo separa configuracion y codigo. Las personalizaciones viven como datos —tablas de configuracion, JSON, feature flags— y el codigo las interpreta en ejecucion. El motor es uno solo; lo que cambia es el combustible inyectado a cada tenant.

Para adaptaciones mas profundas, como flujos completamente distintos por cliente, encajan mejor los patrones de plugins o hooks. Permiten inyectar logica especifica sin tocar el nucleo y dejan el codigo principal en un estado donde un nuevo developer puede entrar sin dos meses de onboarding.

Seguridad y cumplimiento del RGPD

Si la aplicacion opera en Europa, la proteccion de datos deja de ser una conversacion de pasillo. El RGPD impone obligaciones concretas que tocan el diseño desde el primer diagrama.

Derecho de supresion. Cuando un tenant pide borrar todo, el sistema debe ejecutarlo limpio. Con bases separadas, basta con dropear la base. En el modelo compartido toca un proceso que localice y elimine cada registro asociado al tenant_id, incluyendo logs, caches y respaldos.

Portabilidad de datos. El usuario tiene derecho a llevarse lo suyo. La arquitectura debe permitir exportar todo lo de un tenant en formato estructurado y legible por maquina, sin intervencion manual.

Cifrado y acceso. Datos cifrados en transito y en reposo, politicas de autorizacion que impidan a un operador mirar lo que no debe sin justificacion documentada. La diferencia entre cumplir y aparentarlo esta en si existe un log de quien consulto que.

Estrategias de escalado para cuando el sistema crece

Una multi-tenancy bien diseñada escala mejor que la single-tenancy, pero no escala sola. Hay que anticipar los cuellos de botella antes de chocar contra ellos en hora punta.

Sharding horizontal. Cuando una base de datos ya no puede con todo, los tenants se reparten entre varios servidores. Cada uno alberga un subconjunto, y un servicio de enrutamiento decide a quien le toca cada peticion. El truco esta en diseñar el shard key desde el principio para no tener que migrar tenants entre shards cada seis meses.

Colas y procesamiento asincrono. Generar informes, importar ficheros gordos o lanzar envios masivos no puede vivir dentro del ciclo HTTP. RabbitMQ, Kafka o servicios gestionados como SQS permiten desacoplar esa carga y proteger los tiempos de respuesta del producto principal.

Cache por tenant. Un Redis bien organizado con prefijos de tenant evita colisiones y simplifica las invalidaciones. Cada cliente ocupa su propio espacio, asi un despliegue que limpia la cache de uno no se lleva por delante el rendimiento de los demas.

Cuando la multi-tenancy no es la respuesta

No todo proyecto la necesita. Una herramienta interna de gestion, un portal corporativo o un sistema de reservas para una cadena unica son escenarios donde la complejidad añadida de la multi-tenancy no devuelve nada que el negocio note.

Tampoco merece la pena forzarla cuando los requisitos de cada cliente son tan distintos que compartir codigo genera mas fricciones que ahorros. En esos casos, single-tenant con automatizacion seria —Infrastructure as Code, contenedores, orquestacion— suele ser mas eficiente.

Diseñar bien desde el principio para no rediseñar despues

Pasar una aplicacion single-tenant a multi-tenant cuando ya esta en produccion es una de las refactorizaciones mas dolorosas que existen. Afecta a la base de datos, a la capa de autorizacion, a las integraciones, a los despliegues y, casi siempre, a la facturacion. Sale infinitamente mas barato acertar al principio del desarrollo.

Si estas pensando como implementar una arquitectura multi-tenant en tu aplicacion web a medida, esta conversacion debe estar en la primera reunion tecnica, no en la decima. Y si quieres una segunda opinion antes de elegir modelo, hablemos sin compromiso para revisar tu caso antes de la primera linea de codigo.

Contacta con nosotros
Fila 1