Referência: API B2B SaaS
Uma arquitetura de referência para uma API B2B multi-tenant em Node.js 24 - padrões que você pode copiar e adaptar. Anotada para NestJS 11, Prisma, Redis, OpenTelemetry e Kubernetes.
Busque em todas as páginas da documentação
Uma arquitetura de referência para uma API B2B multi-tenant em Node.js 24 - padrões que você pode copiar e adaptar. Anotada para NestJS 11, Prisma, Redis, OpenTelemetry e Kubernetes.
Cartão de receita de referência rápida - arquitetura em um relance.
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ ALB/Ingress│────▶│ orders-api │────▶│ Postgres 16 │
│ + WAF │ │ Nest+Fastify │ │ (tenant_id) │
└─────────────┘ └──────┬───────┘ └─────────────┘
│
┌──────▼───────┐ ┌─────────────┐
│ Redis │────▶│ order-worker│
│ cache+queue │ │ BullMQ │
└──────────────┘ └─────────────┘
│
┌──────▼───────┐
│ OTel Collector│
└──────────────┘Stack (2026-07):
| Camada | Escolha |
|---|---|
| Runtime | Node.js 24.18.0 LTS |
| Framework | NestJS 11, adaptador Fastify |
| ORM | Prisma 6 |
| Cache/fila | Redis 7, BullMQ |
| Observabilidade | OpenTelemetry SDK → Grafana Tempo |
| Deploy | 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 - tenant-scoped queries
@Injectable()
export class OrdersService {
constructor(private prisma: PrismaService) {}
list(tenantId: string) {
return this.prisma.order.findMany({
where: { tenantId },
take: 100,
});
}
}# k8s/deployment.yaml (excerpt)
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 verifica Postgres + Redisprisma migrate deploy antes do Rollout| Estratégia | Esta referência |
|---|---|
tenant_id em nível de linha | Sim - mais simples para <500 tenants |
| Schema por tenant | Escalar mediante solicitação de conformidade |
| DB por tenant | Apenas para o tier Enterprise |
tenantId da guard - aplicado na revisão de código@Public() apenas em /health/*// Trace propagation into BullMQ job data
await this.queue.add("order.created", payload, {
headers: { traceparent: getCurrentTraceparent() },
});/v1/orderstenantId obrigatório em cada payload do job.PrismaService singleton com hooks de ciclo de vida.main.ts desde o primeiro dia.Versões da Stack: Esta página foi escrita para Node.js 24.18.0 (LTS Ativo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5, e NestJS 11.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026