Referencia: API SaaS B2B
Una arquitectura de referencia para una API SaaS B2B multi-inquilino en Node.js 24 - patrones que puedes copiar y adaptar. Anotada para NestJS 11, Prisma, Redis, OpenTelemetry y Kubernetes.
Busca en todas las páginas de la documentación
Una arquitectura de referencia para una API SaaS B2B multi-inquilino en Node.js 24 - patrones que puedes copiar y adaptar. Anotada para NestJS 11, Prisma, Redis, OpenTelemetry y Kubernetes.
Tarjeta de receta de referencia rápida - arquitectura de un vistazo.
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ ALB/Ingress│────▶│ orders-api │────▶│ Postgres 16 │
│ + WAF │ │ Nest+Fastify │ │ (tenant_id) │
└─────────────┘ └──────┬───────┘ └─────────────┘
│
┌──────▼───────┐ ┌─────────────┐
│ Redis │────▶│ order-worker│
│ cache+queue │ │ BullMQ │
└──────────────┘ └─────────────┘
│
┌──────▼───────┐
│ OTel Collector│
└──────────────┘Pila (2026-07):
| Capa | Elección |
|---|---|
| Tiempo de ejecución | Node.js 24.18.0 LTS |
| Framework | NestJS 11, adaptador Fastify |
| ORM | Prisma 6 |
| Caché/cola | Redis 7, BullMQ |
| Observabilidad | OpenTelemetry SDK → Grafana Tempo |
| Despliegue | EKS, Argo CD, HPA |
src/
├── modules/
│ ├── orders/
│ │ ├── orders.controller.ts
│ │ ├── orders.service.ts
│ │ └── orders.repository.ts
│ ├── tenants/
│ └── webhooks/
├── common/
│ ├── guards/tenant.guard.ts
│ ├── interceptors/logging.interceptor.ts
│ └── prisma/prisma.service.ts
└── main.ts// src/common/guards/tenant.guard.ts
@Injectable()
export class TenantGuard implements CanActivate {
canActivate(ctx: ExecutionContext): boolean {
const req = ctx.switchToHttp().getRequest();
const tenantId = req.headers["x-tenant-id"] as string;
if (!tenantId) throw new UnauthorizedException("Missing tenant");
req.tenantId = tenantId;
return true;
}
}// src/modules/orders/orders.service.ts - consultas con ámbito de inquilino
@Injectable()
export class OrdersService {
constructor(private prisma: PrismaService) {}
list(tenantId: string) {
return this.prisma.order.findMany({
where: { tenantId },
take: 100,
});
}
}# k8s/deployment.yaml (extracto)
resources:
requests: { cpu: "500m", memory: "512Mi" }
limits: { cpu: "2", memory: "768Mi" }
env:
- name: NODE_OPTIONS
value: "--max-old-space-size=512"
- name: OTEL_SERVICE_NAME
value: orders-apihttp_request_duration_p95/health/ready comprueba Postgres + Redisprisma migrate deploy Job antes del despliegue| Estrategia | Esta referencia |
|---|---|
tenant_id a nivel de fila | Sí - lo más simple para <500 inquilinos |
| Esquema por inquilino | Escalar a petición de cumplimiento |
| DB por inquilino | Solo nivel empresarial |
tenantId del guard - aplicado en la revisión de código@Public() solo en /health/*// Propagación de trazas en los datos de trabajo de BullMQ
await this.queue.add("order.created", payload, {
headers: { traceparent: getCurrentTraceparent() },
});/v1/orderstenantId requerido en cada carga útil del trabajo.PrismaService singleton con hooks de ciclo de vida.main.ts desde el primer día.Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS Activo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 19 jul 2026