Volver al archivo
Arquitectura multi-tenant con NestJS
Arquitectura06 JUL, 20261 min lectura

Arquitectura multi-tenant con NestJS

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:

  1. Base de datos única, esquema compartido: Filtramos todas las queries usando una columna tenant_id.
  2. Base de datos única, esquemas separados: Usamos el sistema de esquemas lógicos nativo de Postgres.
  3. 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.

typescript
import { 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 comentarios
JG
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.