3.14 Multitenancy y arquitectura SaaS
Visión general y motivación
La multitenancy consiste en ejecutar una única instancia del software para que atienda a múltiples clientes de forma simultánea, manteniendo los datos y la configuración de cada uno de ellos lógicamente separados mientras comparten el mismo código y, con frecuencia, la misma infraestructura. Cada cliente es un tenant. Esta idea sencilla es el motor económico del software como servicio (SaaS), un modelo en el que se vende el acceso a una aplicación en ejecución en lugar de una copia para instalar. Cuando mil tenants comparten la misma implantación, se parchea una sola vez, se escala un solo sistema y el coste marginal del siguiente cliente se aproxima a cero. Por eso un producto multitenant bien diseñado puede atender a una empresa de dos personas y a una corporación con cien mil licencias desde la misma base de código, y por eso el modelo de tenencia que se elija moldeará los márgenes, la postura de seguridad y la carga operativa durante años.
Para los equipos grandes, las consecuencias van más allá del coste. La multitenancy impone un requisito indeclinable en el centro de la arquitectura: el tenant A nunca debe ver los datos del tenant B, nunca, bajo ningún fallo, ninguna carrera concurrente ni ninguna configuración errónea. Una sola fuga entre tenants puede acabar con una empresa. Al mismo tiempo, todo el punto de compartir es la eficiencia, de modo que cada decisión de diseño se sitúa en un espectro que va desde un aislamiento fuerte (más seguro, más caro) hasta un reparto denso (más barato, más arriesgado). Acertar en este equilibrio marca la diferencia entre un producto que escala con gracia y otro que o bien arruina a la empresa por la infraestructura o la lleva a las portadas de los periódicos. Este capítulo se apoya en la arquitectura en la nube (capítulo 3.11), depende en gran medida de la arquitectura de datos (capítulo 3.4) y la seguridad en la nube (capítulo 4.3), y se conecta con la escalabilidad y la resiliencia (capítulo 3.5) y la atribución de costes (capítulo 9.4).
Las empresas y los organismos públicos elevan la exigencia aún más. Los compradores empresariales negocian garantías contractuales sobre los datos, exigen un aislamiento dedicado para su nivel de servicio y esperan que puedan migrarlos entre entornos sin interrupción. Los gobiernos suman leyes de residencia de datos, separación basada en clasificación y, a menudo, el requerimiento de que cada agencia sea su propio tenant con su propio perímetro de auditoría. Las decisiones sobre tenencia en estos contextos no son detalles de implementación; son compromisos que se asumen con cada cliente que confía en uno sus datos.
Principios clave
- El aislamiento es un espectro, no un interruptor. Los modelos silo, piscina y puente intercambian eficiencia por separación; elígase por nivel de servicio y por recurso, no de una vez para todo.
- El contexto de tenant es sagrado. Cada petición, consulta, línea de registro y trabajo en segundo plano debe portar un identificador de tenant, y cada acceso a datos debe estar acotado por él.
- La fuga entre tenants es el fallo que más importa. Diseñe de modo que un único filtro omitido no pueda exponer los datos de otro tenant; lo que se necesita es defensa en profundidad, no una sola cláusula WHERE.
- Los vecinos ruidosos son un problema de arquitectura. Sin cuotas ni mecanismos de equidad, un tenant sobrecargado degrada a todos; hay que anticiparlo antes de que ocurra.
- La configuración por tenant escala; el código por tenant, no. Adapte el producto con datos y banderas de función, no con ramas de código divergentes.
- El ciclo de vida del tenant es una función de producto. La incorporación, la aprovisionamiento, la desincorporación y la exportación de datos deben ser de primer nivel, automatizadas y auditable.
- No se puede gestionar lo que no se puede atribuir. La observabilidad y el coste deben desgranarse por tenant, o se navega a ciegas tanto en fiabilidad como en margen.
Recomendaciones
Elija un modelo de tenencia por nivel de servicio, a lo largo del espectro entre aislamiento y eficiencia
Tres modelos anclan el espectro. En el modelo silo (dedicado), cada tenant dispone de su propio conjunto aislado: cómputo separado, base de datos separada, a veces una cuenta o red separada. El aislamiento es el más fuerte y el radio de impacto de un fallo se limita a un solo tenant, pero se paga capacidad ociosa por cliente y se operan muchas copias. En el modelo piscina compartida (shared pool), todos los tenants comparten el mismo cómputo y la misma base de datos, separados únicamente por lógica y un identificador de tenant. La eficiencia es máxima y el coste marginal de un tenant es casi nulo, pero ahora el aislamiento depende enteramente de que el código sea correcto. El modelo puente (híbrido) combina ambos: cómputo compartido con bases de datos por tenant, o una piscina compartida para tenants pequeños y silos dedicados para los grandes o los sometidos a regulación.
No elija un solo modelo para todo el producto. La respuesta correcta suele ser un puente que se mapee a los niveles de servicio de la oferta comercial. Sitúe la larga cola de tenants pequeños en una piscina compartida eficiente, donde su economía lo justifica. Ofrezca una implantación dedicada o de un solo tenant como nivel premium para los clientes empresariales que estarán dispuestos a pagar por el aislamiento y por las garantías contractuales. Plantee el mapeo como una decisión de arquitectura documentada (capítulo 3.11), porque «qué tenants comparten qué» es una afirmación en la que confían los equipos de seguridad, ventas y finanzas.
Particione los datos de forma deliberada y haga imposible olvidar la delimitación por tenant
Los datos son donde la multitenancy triunfa o fracasa, así que trátela como una decisión central de arquitectura de datos (capítulo 3.4). Tres estrategias se paralelizan con los modelos de tenencia. Una base de datos separada por tenant ofrece el aislamiento más fuerte, copias de seguridad y restauraciones fáciles por tenant y una exportación de datos sencilla, al precio de muchas bases de datos que gestionar y migraciones de esquema que desplegar. Un esquema separado por tenant dentro de una base de datos compartida es una vía intermedia: un solo servidor, separación lógica, pero aún muchos objetos que migrar. Tablas compartidas con una columna de tenant, en las que cada fila porta un tenant_id, es la opción más densa y barata, y también la más peligrosa, porque ahora una sola consulta que falte su filtro de tenant puede filtrar datos entre clientes.
Si se comparten tablas, no confíe en que los desarrolladores recuerden el filtro. Exija la delimitación por tenant en una capa que no se pueda eludir: seguridad a nivel de fila en la base de datos que adjunta un predicado obligatorio a cada consulta según el tenant de la sesión, una capa de acceso a datos o un ORM que inyecte la cláusula de tenant automáticamente, o ambas. Doble cinturón y suspenso: aquí es lo acertado. A medida que crecen los tenants, el sharding por tenant se vuelve natural: distribuir grupos de tenants en distintos fragmentos de base de datos de modo que ninguna instancia contenga a todos, lo que también limita el radio de impacto del fallo de un fragmento y permite trasladar a un tenant grande a su propio fragmento sin cambiar el modelo.
Propague el contexto de tenant por todas partes y defienda en profundidad contra las fugas entre tenants
El identificador de tenant debe acompañar a cada unidad de trabajo. Establézcase en el extremo, normalmente a partir de la sesión autenticada o de un subdominio, válidese y trátese a través del contexto de la petición, cada llamada a un servicio descendente, cada sesión de base de datos, cada trabajo en cola y cada línea de registro y métrica. Las brechas más peligrosas son las asincrónicas: un trabajador en segundo plano que procesa un trabajo sin restablecer el contexto de tenant, una caché que no lleva el tenant en su clave, un controlador de webhook que confía en un identificador de tenant aportado por el emisor. Cada uno de ellos es una vía para servir los datos de un tenant a otro.
Trate el aislamiento entre tenants como una propiedad de seguridad con defensa en profundidad, y remita los detalles al capítulo 4.3. Aplique el principio de mínimo privilegio de modo que, incluso si un componente se ve comprometido, solo pueda alcanzar el tenant para el que actúa. Nunca acepte un identificador de tenant a partir de la entrada del cliente para decisiones de autorización; dérivelo de la identidad autenticada. Namespacee las cachés, los prefijos de almacenamiento de objetos y los índices de búsqueda por tenant, de modo que una colisión de claves no cruce el límite. Y pruebe ese límite a propósito: pruebas automatizadas que afirmen que las credenciales del tenant A no pueden leer los registros del tenant B, y ejercicios periódicos de red team que intenten saltarse el tenant de uno. Una fuga que descubre su suite de pruebas es un error; una fuga que descubre un cliente es una crisis.
Contenga a los vecinos ruidosos con cuotas, límites de tasa y equidad
Cuando los tenants comparten recursos, un pico de un tenant se convierte en la caída de todos. El problema del vecino ruidoso no es un caso límite; es el comportamiento por defecto de una piscina compartida bajo carga. Diseñe para contrarrestarlo desde el inicio. Fije cuotas por tenant en los recursos que importan (peticiones por segundo, trabajos concurrentes, almacenamiento, coste de consulta) y exíjalas con limitación de tasa en el extremo y en las fronteras internas de mayor coste. Prefiera una programación justa que otorgue a cada tenant su parte frente a colas de primera entrada, primera salida, que dejan a un tenant hambriento mientras otro acapara.
Adapte la exigencia al modelo de tenencia. En una piscina compartida, las cuotas y la equidad son la defensa principal, así que invierta en ellas. Para un tenant cuya carga realmente excede lo que el reparto justo puede absorber, la respuesta suele ser promoverlo fuera de la piscina a una implantación de puente o silo, algo que se puede vender como función en lugar de tratarlo como un fallo. Víncule esto con el trabajo de escalabilidad y resiliencia (capítulo 3.5): la reducción de carga, los disyuntores de circuito y la presión de retroceso deben ser conscientes del tenant, de modo que descargando el exceso de un solo tenant se proteja a los demás en vez de degradar el sistema entero.
Configure a los tenants con datos, no con copias del código
Cada cliente querrá algo ligeramente distinto: su logotipo, sus reglas de flujo, sus integraciones, un campo que aún no existe. La forma escalable de decir que sí es la configuración por tenant: banderas de función, ajustes, derechos de acceso y puntos de extensión que son datos, evaluados en tiempo de ejecución y compartidos por una misma base de código. La vía que destruye un negocio SaaS es el código personalizado por tenant: una rama, una copia o un caso especial en la ruta de ejecución para un cliente grande. Diez de esos y ya no se tiene un producto, sino diez productos bajo un mismo abrigo, y cada cambio hay que probarlo diez veces.
Trace una línea firme. Modele los ejes de variación que se está dispuesto a admitir como configuración de primer nivel, y trate las peticiones fuera de esos ejes como bien agenda de producto o como un no rotundo. Cuando un cliente necesita una personalización real, ofrézcale puntos de extensión (webhooks, una API, complementos, campos personalizados) que ejecuten su lógica sin ramificar la propia. Reserve las implantaciones genuinamente a medida para el nivel premium de un solo tenant, donde el aislamiento es el valor añadido y el precio más alto cubre el coste operativo.
Haga el ciclo de vida del tenant automatizado, observable y atribuido en costes
La incorporación de un tenant debe ser un flujo de autosservicio y automatizado: aprovisionar la partición de datos del tenant, sembrar valores predeterminados, fijar los derechos de acceso y estar listo en segundos, no en un ticket para el equipo de operaciones. La desincorporación importa tanto y es más fácil de descuidar. Cuando un tenant se va, hay que poder exportar sus datos en un formato usable y, acto seguido, borrarlos de forma demostrable, porque los contratos y la ley de privacidad exigen ambas cosas. Diseñe la exportación de datos y la eliminación desde el primer día; retrofittearlos en un esquema de tablas compartidas es doloroso.
Instrumente todo por tenant. Etiquete registros, trazas y métricas con el identificador de tenant para poder responder en segundos a «¿es esta caída de todos los tenants o de uno solo?» y «¿qué tenant está generando este coste?». Atribuya el coste de la infraestructura a los tenants para conocer el margen real por cliente y detectar al tenant cuyo uso lo hace inrentable a su precio actual (capítulo 9.4). La observabilidad y la atribución de costes por tenant convierten la multitenancy de una caja negra en un sistema que se puede gestionar y facturar de verdad.
Contrapartidas: ventajas y desventajas
| Modelo de tenencia | Ventajas | Desventajas |
|---|---|---|
| Silo (conjunto dedicado por tenant) | Aislamiento más fuerte, radio de impacto mínimo, cumplimiento y exportación por tenant sencillos, historia de vecinos ruidosos sencilla | Coste más alto, capacidad ociosa por tenant, muchas copias que operar y parchear |
| Piscina (compartida total) | Coste marginal más bajo, empacado más denso, un solo sistema que escalar y actualizar | El aislamiento depende enteramente de la corrección del código, mayor riesgo de vecinos ruidosos, más difícil la exportación y eliminación por tenant |
| Puente (híbrido, por niveles) | Eficiente para tenants pequeños, aislamiento dedicado para los grandes, se mapea a la oferta de precios | Más modelos que construir y operar, hay que mantener la vía de promoción entre niveles |
| BD compartida, esquema compartido (columna de tenant) | Almacenamiento más barato, una sola migración, operaciones más simples | Un solo filtro faltante filtra datos; requiere seguridad a nivel de fila como red de seguridad |
| BD compartida, esquema por tenant | Aislamiento lógico, un solo servidor, exportación razonable | Muchos objetos de esquema, las migraciones se despliegan en abanico, límites de escalabilidad por servidor |
| Base de datos por tenant | Fuerte aislamiento de datos, copia de seguridad y exportación por tenant | Muchas bases de datos, migraciones en abanico, coste más alto |
La tensión central es el aislamiento frente a la eficiencia, y atraviesa cada fila. Un reparto más denso multiplica los márgenes y multiplica el riesgo en el mismo movimiento; un aislamiento más fuerte compra seguridad y simplicidad a un coste real por tenant. La resolución no está en elegir un extremo, sino en situar a cada tenant a lo largo del espectro con deliberación, normalmente por nivel: empacar a los tenants pequeños con densidad donde la economía lo exige y el riesgo es acotado, aislar a los grandes y los regulados donde pagaran por ello y el radio de impacto debe ser pequeño. Luego, haga el extremo denso seguro con delimitación forzada por tenant, y el extremo aislado barato con automatización, de modo que ninguno duela tanto como la versión ingenua.
Preguntas para debatir con el equipo
Si mañana faltara un filtro de delimitación de tenant, ¿vería un cliente los datos de otro? Esta es la pregunta que separa un producto multitenant defendible de un accidente a la espera de pasar. La prueba honesta es trazar una ruta de lectura real y preguntarse qué impone el límite entre tenants: ¿es una sola cláusula WHERE escrita por un desarrollador, o hay una red de seguridad como la seguridad a nivel de fila o una capa de acceso a datos que inyecte el alcance con independencia de lo que haga? Traiga sus rutas de consulta reales, sus trabajos en segundo plano y sus cachés, porque la fuga casi siempre se esconde en la esquina asincrónica que nadie acotó. También traiga los resultados de una prueba que use deliberadamente la sesión del tenant A para solicitar los registros del tenant B y afirme la denegación. Si el límite descansa en la sola vigilancia humana, se tiene una brecha latente, y la corrección (defensa en profundidad) debe subir a lo primero de la agenda.
¿Qué modelo de tenencia y partición de datos usa realmente cada nivel de cliente, y coincide con lo que se vendió? Muchos equipos caen en un único modelo por defecto y luego descubren que su oferta de precios y su arquitectura no concuerdan: los clientes empresariales se les prometió un aislamiento que la piscina compartida no proporciona, o los clientes pequeños ocupan conjuntos dedicados caros que destruyen el margen. Mapee cada nivel a su modelo real (silo, piscina o puente; base de datos por tenant, esquema o tabla compartida) y colóquelo junto a las garantías contractuales sobre los datos que hace el equipo de ventas. Donde divergen, hay un riesgo de cumplimiento o un problema de coste, y ambos merecen ser visibles antes de que un cliente o un auditor los encuentre. La evidencia que conviene traer es el mapeo de nivel a modelo, el coste por tenant y el lenguaje real de los contratos empresariales.
Cuando la carga de un tenant grande se dispara, ¿quiénes más lo notan y cuál es el plan? En una piscina compartida la respuesta suele ser «todos», y con frecuencia los equipos no lo saben hasta que un incidente lo hace evidente. Repase lo que ocurre cuando el tenant más grande ejecuta una importación en masa o recibe un pico de tráfico: ¿las cuotas por tenant y la programación justa lo contienen, la reducción de carga protege a los vecinos, o todo el sistema se degrada a la vez? Traiga los datos de carga y el relato del último incidente de vecino ruidoso, porque el tenant que daña es, casi siempre, uno que se puede nombrar. La respuesta debe moldear tanto la inversión en limitación de tasa como la estrategia de niveles, ya que la solución más limpia para un tenant que supera el reparto justo es promoverlo a una implantación de puente o dedicada por la que se pueda cobrar.
Si un tenant se desincorporara mañana, ¿podría entregarle una exportación limpia y demostrar que se borró toda rastro, o habría que improvisar? La desincorporación es la parte del ciclo de vida que los equipos posponen hasta que una cláusula de salida contractual o una solicitud de la ley de privacidad la obliga, y para entonces el esquema compartido hace que la extracción y la eliminación sean dolorosas. Para un equipo grande, el riesgo se multiplica, porque los datos de un tenant están dispersos en la base de datos principal, las cachés, el almacenamiento de objetos, los índices de búsqueda, las copias de seguridad y las canalizaciones de analítica, y cada uno debe exportarse en un formato usable y, luego, purgarse de forma demostrable. Las consideraciones en tensión son reales: las tablas compartidas que dan un almacenamiento barato son exactamente las que hacen más difícil la extracción y eliminación por tenant, de modo que la eficiencia comprada en la capa de almacenamiento puede cobrarse a la salida. Traiga una simulación en vivo de una desincorporación sobre un tenant real, la lista de cada almacén que contiene datos de tenant y la evidencia que se mostraría para que la eliminación se haya producido realmente. Para tenants empresariales o de organismos públicos, la exportación debe ser certificada y la eliminación demostrable para cumplir con las leyes de registros públicos y de privacidad, así que trátela como un defecto de cumplimiento que hay que cerrar ahora, no como una función para añadir cuando un cliente se vaya.
¿Cuántos casos especiales de un solo cliente viven ya en la ruta de ejecución y dónde está la línea que no se cruza? Las ramas de código por tenant son la forma silenciosa en que un negocio SaaS deja de ser un solo producto y se convierte en muchos productos con un solo nombre, donde cada cambio hay que probarlo contra cada caso especial y la velocidad decae a medida que se añaden clientes. La tensión es que un cliente grande con una necesidad real es difícil de rechazar, y una rama en la ruta de ejecución parece más rápida que construir una superficie de configuración, de modo que los casos especiales se acumulan una excepción razonable tras otra. Traiga un inventario honesto: busque en el código los nombres de clientes y las ramas específicas de nivel, cuénte-los y estime el coste extra de pruebas y revisión que cada uno impone a un cambio no relacionado. El debate debe trazar una línea firme entre la variación que se modela como configuración de primer nivel (banderas, derechos de acceso, puntos de extensión) y el trabajo verdaderamente a medida que se reserva para el nivel premium de un solo tenant, donde el precio más alto cubre el coste operativo. Para los compradores empresariales que exigen una personalización profunda, la respuesta duradera son los puntos de extensión que ejecutan su lógica sin ramificar la propia, de modo que la gobernanza y la auditoría se mantengan tractables en toda la flota.
¿Se puede saber, por tenant, tanto qué cuesta un incidente y a quién, como qué clientes no son rentables a su precio actual? La multitenancy se convierte en una caja negra en el momento en que los registros, trazas, métricas y el coste de infraestructura no llevan dimensión de tenant, porque entonces no se puede saber si una caída afecta a un solo tenant o a toda la flota, y no se puede nombrar al tenant cuyo uso lo hace inrentable a su precio de contrato. Para un equipo grande, esa atribución es lo que separa la gestión del plataforma del tanteo a ciegas, y moldea directamente tanto la respuesta ante incidentes como la fijación de precios. Las consideraciones se oponen al coste de instrumentación y a la cardinalidad: etiquetar todo por tenant no es gratis, y las métricas de alta cardinalidad tensionan el presupuesto de observabilidad, así que hay que elegir deliberadamente qué se segmenta por tenant y qué se muestrea. Traiga la cobertura actual de etiquetado por tenant, una consulta real que atribuya el gasto en la nube a un solo tenant y la tabla de márgenes que permitiría nombrar al cliente menos rentable. En entornos de organismos públicos y regulados, el coste y la observabilidad con alcance de auditoría por tenant alimentan también la asignación de costes, la planificación de capacidad y el perímetro de auditoría que cada agencia o unidad de negocio tiene derecho a recibir, de modo que la dimensión de tenant es un requisito de gobernanza tanto como un requisito operativo.
Mirada sectorial
Startup. Lances una única piscina compartida desde el primer día y acertarás. Dirija la atención de ingeniería tan escasa a la única cosa que no se puede retrofittear: la delimitación forzada por tenant. Un Postgres gestionado con seguridad a nivel de fila, un tenant_id en cada tabla y el contexto de tenant resuelto en el extremo dan una densidad segura sin necesidad de un equipo de operaciones. No construya niveles silo ni infraestructura por tenant de forma especulativa; añada un nivel de puente solo cuando una empresa prospectiva que paga hace que el aislamiento valga su coste.
Pequeña empresa. Sin especialista en plataforma y con un presupuesto ajustado, apoye en lo que su nube y su framework ya ofrecen en lugar de construir maquinaria de aislamiento a mano. Bases de datos gestionadas con seguridad a nivel de fila, una plataforma como servicio que delimita los tenants por usted y un proveedor de autenticación que porta la identidad de tenant suelen ser más baratos y más seguros que los equivalentes caseros. Trate la multitenancy como una decisión de compra versus construcción en cada capa, y reserve el trabajo a medida para las pruebas de límite de tenant que solo usted puede escribir.
Empresa. El problema es la gobernanza de la cartera entre muchos equipos: una arquitectura de puente por niveles, una decisión de arquitectura documentada que mapee cada nivel a su modelo de tenencia y partición de datos, y la atribución de costes por tenant para que finanzas conozca el margen real de cada cuenta. Estandarice la propagación del contexto de tenant y la red de seguridad de delimitación para que ningún equipo los reinvente, presupueste el aislamiento y la automatización del ciclo de vida de forma explícita, y mantenga una vía soportada y con precio para migrar un tenant entre niveles sin interrupción a medida que crece o cambian sus necesidades de cumplimiento.
Organismo público. La contratación, la residencia de datos y la rendición de cuentas pública condicionan el modelo. Ancle los datos de cada agencia a regiones nacionales con política como código, silo las cargas sensibles o de alta clasificación en cuentas separadas con su propio perímetro de auditoría, y dote a cada agencia de su propia integración de identidad, sus propias reglas de retención y su propio rastro de auditoría, para que los auditores de una agencia nunca vean la actividad de otra. La desincorporación debe producir una exportación certificada y una eliminación demostrable, porque los registros están sujetos a leyes de registros públicos y de privacidad, y las garantías de tenencia que se firmen deben ser las que la arquitectura puede cumplir realmente.
Ejemplos
Startup. Una startup de quince personas construye su producto como una única piscina compartida desde el primer día y actúa bien. Todos los tenants comparten una base de datos Postgres gestionada con un tenant_id en cada tabla; la seguridad a nivel de fila impone el predicado de tenant en la base de datos, de modo que un filtro olvidado no puede filtrar nada, y la aplicación resuelve el tenant a partir de un subdominio en el extremo y lo traza a través de cada petición y cada trabajo en segundo plano. La incorporación es de autosservicio: una nueva inscripción aprovisiona su fila de tenant, siembra los valores predeterminados y queda lista en segundos. Dos ingenieros operan toda la plataforma porque hay un solo sistema. Cuando su primera empresa prospectiva real exige una base de datos dedicada y una garantía contractual de aislamiento, añaden un nivel de puente: la misma base de código, pero este tenant obtiene su propia base de datos en su propio fragmento, vendida a un precio que cubre el coste.
Empresa. Un proveedor SaaS que sirve a grandes entidades financieras ejecuta una arquitectura de puente por niveles. Miles de clientes pequeños y medianos viven en piscinas compartidas regionales, fragmentadas por tenant, con cuotas y programación justa que mantienen a raya a los vecinos ruidosos. Los clientes de banca de máximo nivel obtienen implantaciones de un solo tenant en cuentas de nube aisladas, con bases de datos dedicadas, claves de cifrado por tenant y garantías contractuales de residencia de datos y de aislamiento redactadas en el acuerdo marco. Una capacidad de plataforma migra a un tenant entre niveles sin interrupción cuando crece o cambian sus necesidades de cumplimiento. El coste de cada tenant se atribuye mediante etiquetado, de modo que finanzas conoce el margen real de cada cuenta, y la observabilidad etiquetada por tenant permite que el ingeniero de guardia determine en segundos si una alerta afecta a un solo tenant o a toda la flota.
Organismo público. Un proveedor nacional de plataformas aloja a muchos organismos como tenants separados y trata el aislamiento como un requisito legal, no como una preferencia. La ley de residencia de datos ancla los datos de cada agencia a regiones nacionales, forzadas por política como código que bloquea cualquier recurso en una región no permitida (capítulo 3.11). La clasificación impulsa el modelo: las agencias que manipulan material sensible obtienen implantaciones plenamente silo en cuentas separadas con su propio perímetro de auditoría, mientras que las cargas de clasificación menor comparten una piscina gobernada. Cada agencia es su propio tenant con su propia integración de identidad, sus propias reglas de retención y exportación y un rastro de auditoría acotado a su perímetro, de modo que los auditores de una agencia nunca ven la actividad de otra. La desincorporación produce una exportación de datos certificada y una eliminación demostrable, porque los registros están sujetos a leyes de registros públicos y de privacidad.
Justificación empresarial: motivaciones, retorno y coste total de propiedad
El núcleo de la justificación empresarial de la multitenancy es el margen. Un modelo de un solo tenant, en el que se despliega una copia nueva por cliente, implica que el coste de infraestructura y operaciones crece aproximadamente en línea con el número de clientes, y los ingenieros pasan sus días parcheando muchas copias. Un modelo multitenant compartido rompe ese vínculo: se parchea una sola vez, se escala un solo sistema y se empacan los clientes con suficiente densidad para que el coste marginal del siguiente tenant se aproxime a cero. Es lo que permite a un negocio SaaS hacer crecer los ingresos mucho más rápido que los costes, y es por eso que inversores y consejos de administración tratan una arquitectura multitenant limpia como un proxy de una empresa escalable.
El retorno se manifiesta en tres frentes: palanca operativa (un solo equipo gestiona toda la flota), entrega más rápida (una corrección llega a todos los tenants de una vez, de modo que la velocidad no decae al añadir clientes) y opcionalidad de precios (un plan compartido para la larga cola y un plan aislado premium para empresas, ambos desde una misma base de código). Póngase estos frente a los costes que hay que financiar con honestidad: la ingeniería para construir el aislamiento forzado de tenant, las cuotas, la automatización del ciclo de vida y la observabilidad por tenant, más la disciplina para mantener el límite intacto. El coste de equivocarse es asimétrico y severo, porque una sola fuga de datos entre tenants puede desencadenar sanciones reguladoras, una fuga masiva de clientes y un daño reputacional que enaneca la infraestructura que se ahorró al compartir. Plantee el caso ante la dirección como margen y escalabilidad en el lado positivo y riesgo existencial en el negativo. Ancre el acuerdo de nivel de servicio y las garantías contractuales sobre los datos al modelo de tenencia que se pueda entregar realmente, porque una promesa que la arquitectura no puede cumplir es una pasiva, no una venta.
Antipatrones y trampas
- Delimitación de tenant por convención. Confiar en que los desarrolladores recuerden el filtro de tenant en cada consulta, sin una red de seguridad a nivel de base de datos ni a nivel de capa de acceso; una omisión es una brecha.
- Confiar en un identificador de tenant aportado por el cliente. Aceptar el tenant de la entrada de la petición para decisiones de autorización en lugar de derivarlo de la identidad autenticada, lo que permite a un emisor pedir los datos de otro.
- Trabajo en segundo plano sin delimitación. Trabajos, cachés, webhooks y exportaciones que pierden el contexto de tenant porque alguien solo acotó la ruta síncrona de la petición.
- Ramas de código por tenant. Un caso especial para un cliente grande en la ruta de ejecución hasta mantener muchos productos divergentes bajo un solo nombre y cada cambio costar diez veces más.
- Sin defensa contra vecinos ruidosos. Ejecutar una piscina compartida sin cuotas ni equidad por tenant, de modo que el primer tenant que hace pico tumbe a todos.
- La desincorporación como olvido. Construir sin exportación de datos ni eliminación demostrable y luego incumplir una cláusula de salida contractual o una solicitud de la ley de privacidad porque el esquema compartido hace dolorosa la extracción.
- Volar a ciegas por tenant. Registros, métricas y costes sin dimensión de tenant, de modo que no se puede saber de quién es el incidente ni qué tenant es inrentable.
Modelo de madurez
- Nivel 1, Iniciar: La multitenancy es improvisada y reactiva. La separación de tenants descansa en filtros escritos a mano sin red de seguridad, el modelo es uno para todos, no hay cuotas, la incorporación es manual y los registros y los costes no llevan dimensión de tenant. El equipo conoce al vecino ruidoso y al casi-fallo por los incidentes.
- Nivel 2, Desarrollar: Aparecen prácticas básicas, pero de forma inconsistente entre equipos. Se elige un modelo de tenencia, el contexto de tenant se propaga por la ruta principal de petición, una red de seguridad a nivel de base de datos o de acceso a datos impone la delimitación en las tablas centrales y existen cuotas básicas por tenant. La incorporación está parcialmente automatizada y los registros llevan un identificador de tenant, pero las rutas asincrónicas, la exportación y la atribución de costes varían de un servicio a otro y no están documentadas en ninguna parte.
- Nivel 3, Estandarizar: El enfoque de tenencia está documentado y exigido en toda la organización. La tenencia por niveles se mapea a la oferta de precios, con una piscina compartida para tenants pequeños e implantaciones aisladas para las empresariales y las reguladas; la delimitación por tenant se exige en profundidad y se prueba a propósito, las cuotas y la programación justa contienen a los vecinos ruidosos, el ciclo de vida del tenant, incluida la exportación y la eliminación demostrable, está automatizado, y la observabilidad y los costes se segmentan por tenant. Cada equipo sigue el mismo estándar de tenencia en lugar del propio.
- Nivel 4, Gestionar: La cartera de tenencia se mide y controla frente a líneas base. El aislamiento entre tenants, la equidad, la latencia y el coste se siguen como métricas con objetivos acordados: la cobertura de pruebas entre tenants, las tasas de incumplimiento de cuota y de incidentes de vecinos ruidosos, el tiempo de incorporación y desincorporación, y el margen por tenant se informan frente a líneas base, y las decisiones de promover un tenant entre niveles o repricingar uno inrentable se toman sobre esa evidencia en lugar de por anécdota. La conformidad con la residencia y la clasificación se monitorea de forma continua, y la desviación del estándar dispara una respuesta documentada.
- Nivel 5, Orquestar: La tenencia se mejora de forma continua e integrada en toda la organización. Los límites entre tenants se ejercitan mediante rutinas de red team, los tenants se desplazan entre niveles sin interrupción a medida que crecen o cambian sus necesidades de cumplimiento, el margen por tenant alimenta la fijación de precios y la planificación de capacidad, y las reglas de residencia y clasificación se exigen por política en lugar de por revisión. El modelo se adapta a medida que cambia la mezcla de clientes y el panorama regulatorio, y las lecciones alimentan producto, seguridad y finanzas como un mismo bucle.
Propuestas de debate
- ¿Dónde se sitúa cada nivel de cliente en el espectro entre aislamiento y eficiencia hoy, y hay algún nivel en el modelo equivocado para las garantías que se vendieron o el margen que se necesita?
- Si tuviera que demostrar ante un auditor que el tenant A no puede acceder a los datos del tenant B, ¿qué evidencia podría producir ahora mismo y cuánta de ella es automatizada frente a asertada?
- ¿Cuáles de sus rutas asincrónicas (trabajos, cachés, webhooks, exportaciones, índices de búsqueda) restablecen el contexto de tenant y cuáles meramente lo heredan o confían en el emisor?
- Cuando un tenant supera el reparto justo, ¿existe una vía soportada y con precio para promoverlo a una implantación de puente o dedicada, o la respuesta por defecto es un incidente?
- ¿Se puede atribuir el coste de infraestructura a tenants individuales con suficiente precisión para nombrar al menos rentable, y eso cambiaría la forma de fijar precios?
- Para un tenant de un organismo público o regulado, ¿se puede imponer la residencia de datos y el aislamiento por clasificación mediante política, y desincorporar con una exportación certificada y una eliminación demostrable?
Ideas clave
- La multitenancy, una única instancia que sirve a muchos tenants, es el motor económico del SaaS: impulsa los márgenes y coloca el aislamiento entre tenants en el centro de la arquitectura.
- Trate el aislamiento frente a la eficiencia como un espectro y estratifíquelo: empaque a los tenants pequeños en una piscina compartida eficiente, aísle a los grandes y a los regulados en implantaciones de puente o silo que pagaran.
- Nunca deje la delimitación de tenant en un filtro escrito a mano; exígala en profundidad con seguridad a nivel de fila o una capa de acceso a datos, y pruebe el límite a propósito.
- Propague el contexto de tenant a través de cada petición, trabajo, caché y registro, y defienda las rutas asincrónicas donde se esconden las fugas.
- Contenga a los vecinos ruidosos con cuotas, límites de tasa y programación justa por tenant, y promueva a los tenants que superan la piscina en lugar de dejar que la degraden.
- Adapte el producto con configuración por tenant, no con código por tenant, y haga del ciclo de vida del tenant, la observabilidad y la atribución de costes por tenant capacidades de primer nivel.
Referencias y lectura complementaria
- Tom Kwok, Thao Nguyen y Linh Lam, A Software as a Service with Multi-tenancy Support for an Electronic Contract Management Application (IEEE International Conference on Services Computing)
- Frederick Chong y Gianpaolo Carraro, Architecture Strategies for Catching the Long Tail (Microsoft)
- Amazon Web Services, SaaS Lens, AWS Well-Architected Framework y SaaS Tenant Isolation Strategies
- Microsoft, Multitenant SaaS architecture and patterns (Azure Architecture Centre)
- Google Cloud, Architecture for Multi-tenant SaaS Applications
- Cor-Paul Bezemer y Andy Zaidman, Multi-Tenant SaaS Applications: Maintenance Dream or Nightmare? (Proceedings of the Joint ERCIM Workshop on Software Evolution)
- The Open Web Application Security Project, OWASP Application Security Verification Standard (requisitos de control de acceso y multitenancy)
- Martin Kleppmann, Designing Data-Intensive Applications (particionamiento, sharding e isolación de datos)