Arquitectura multi-tenant con NestJS
El gran desafío del software as a service (SaaS) es escalar la infraestructura de forma económicamente viable. El aislamiento de datos de cada cliente (tenant) no debería implicar levantar una base de datos física para cada uno de ellos a menos que sea un requerimiento de compliance estricto.
Estrategias de Tenant Isolation
En líneas generales, contamos con tres enfoques clásicos:
- Base de datos única, esquema compartido: Filtramos todas las queries usando una columna
tenant_id. - Base de datos única, esquemas separados: Usamos el sistema de esquemas lógicos nativo de Postgres.
- Múltiples bases de datos: El aislamiento definitivo. Cada tenant tiene su propio connection string.
Implementando esquemas dinámicos en NestJS
Con NestJS, podemos usar un middleware para extraer el header x-tenant-id e inyectar la conexión correspondiente dinámicamente.
typescriptimport { Injectable, Scope } from '@nestjs/common'; @Injectable({ scope: Scope.REQUEST }) export class TenantService { private tenantId = ''; setTenant(tenantId: string) { this.tenantId = tenantId; } getTenantId(): string { return this.tenantId; } }
Al utilizar providers dinámicos con Scope.REQUEST, cada petición HTTP tiene su propia instancia aislada del servicio.
¿Te sirvió este post?
Discusión
2 comentariosJG
Juana GómezHace 2 horas
Excelente desglose. La explicación del Request scope me vino al pelo.
¿Te gustó el artículo?
Suscribite para recibir las últimas publicaciones directo en tu email.