Saltar al contenido principal
BACK-1001 • 34 Horas • Nivel Avanzado / Principal SaaS Platform Architect

Arquitecturas SaaS Multi-Tenant de Grado Financiero: Aislamiento (Silo/Bridge/Pool), Metered Billing y NGAC

Topologías de aislamiento de datos (Silo, Bridge y Pool con PostgreSQL Row-Level Security), propagación criptográfica del Tenant Context, prevención de Noisy Neighbor (Rate Limiting por Tier y Fair Queuing), Metered Billing idempotente y autorización NGAC.

Módulo 1: Módulo 1: Modelos de Aislamiento Multi-Tenant (Silo, Bridge, Pool) y Blindaje con PostgreSQL RLS

Economía y Seguridad de los Modelos Silo, Bridge y Pool: Arquitectura Basada en Celdas (Cell-Based SaaS) (50 min)

Economía y Seguridad de los Modelos Silo, Bridge y Pool: Arquitectura Basada en Celdas (Cell-Based SaaS)

1. Matriz Comparativa de Aislamiento de Inquilinos (Tenants)

| Modelo | Aislamiento Físico/Lógico | Costo Operativo / FinOps | Caso de Uso Ideal | | :--- | :--- | :--- | :--- | | 1. Silo (DB por Tenant) | Instancia o base de datos dedicada por cliente + KMS Key propia (BYOK) | Alto costo base; complejo migrar $5,000$ esquemas en CI/CD | Clientes Regulado Tier-1 (Banca, Gobierno, Salud HIPAA) | | 2. Bridge (Schema por Tenant) | Mismo clúster DB, distinto esquema tenant_x.orders | Degrada el catálogo pg_class y shared_buffers al superar $\approx 500$ esquemas | SaaS B2B Mid-Market con $< 200$ inquilinos | | 3. Pool + RLS (Shared Table) | Tablas compartidas particionadas con tenant_id y Row-Level Security (RLS) | Máxima eficiencia FinOps y despliegues de esquema en $\mathcal{O}(1)$ | SaaS de alta escala ($100,000+$ tenants) combinado con Pods/Celdas dedicadas para clientes Enterprise |

Defensa en Profundidad en el Modelo Pool: PostgreSQL Row-Level Security (RLS) Compatible con PgBouncer (55 min)

Defensa en Profundidad en el Modelo Pool: PostgreSQL Row-Level Security (RLS) Compatible con PgBouncer

1. Por Qué Confiar Solo en WHERE tenant_id = ? en el ORM Causa Fugas Catastróficas (Cross-Tenant Data Leak)

Un único desarrollador que olvide incluir .where({ tenantId }) en un nuevo endpoint o reporte expone los datos de todos los clientes. Row-Level Security (RLS) traslada la invariante de aislamiento al motor del kernel de PostgreSQL:

ALTER TABLE tenant_invoices ENABLE ROW LEVEL SECURITY;
ALTER TABLE tenant_invoices FORCE ROW LEVEL SECURITY; -- Obligatorio incluso para el owner de la tabla

CREATE POLICY tenant_isolation_policy ON tenant_invoices AS RESTRICTIVE USING (tenant_id = NULLIF(current_setting('app.current_tenant_id', true), '')::uuid) WITH CHECK (tenant_id = NULLIF(current_setting('app.current_tenant_id', true), '')::uuid);

[!CAUTION]
Inyección Segura con PgBouncer Transaction Pooling: Jamás ejecutes SET app.current_tenant_id = '...' a nivel de sesión. El middleware transaccional debe abrir BEGIN; SET LOCAL app.current_tenant_id = '...'; para que el contexto muera atómicamente al hacer COMMIT/ROLLBACK y nunca contamine al siguiente cliente del pool. Si una consulta corre sin definir la variable, NULLIF(..., '') evalúa a NULL, devolviendo 0 filas (Fail-Closed).

Propagación Inmutable del Tenant Context y Cifrado por Inquilino (Envelope Encryption & BYOK) (45 min)

Propagación Inmutable del Tenant Context y Cifrado por Inquilino (Envelope Encryption & BYOK)

1. Prohibición de Leer tenant_id Desde el Body o Query Params de la Petición

El identificador del inquilino (tenant_id) jamás debe aceptarse desde el payload JSON o parámetros URL enviados por el cliente (vulnerabilidad crítica IDOR / BOLA). El API Gateway extrae el tenant_id exclusivamente de los claims firmados criptográficamente en el token JWT / mTLS y lo propaga hacia los microservicios internos en una cabecera firmada o token de intercambio STS.

2. Bring Your Own Key (BYOK) con Envelope Encryption

En clientes financieros que exigen poder revocar criptográficamente sus datos en segundos (Crypto-Shredding), cada fila sensible se cifra con una DEK (Data Encryption Key) por tenant, la cual a su vez está envuelta (wrapped) por la KEK (Key Encryption Key) alojada en el AWS KMS / Cloud HSM del propio cliente.

Módulo 2: Módulo 2: Mitigación del Efecto "Noisy Neighbor", Fair Queuing y Rate Limiting Multi-Tier

Erradicación del Noisy Neighbor: Patrón Bulkhead y Shuffle Sharding Combinatorio (50 min)

Erradicación del Noisy Neighbor: Patrón Bulkhead y Shuffle Sharding Combinatorio

1. Matemática del Shuffle Sharding (AWS Route 53 / DynamoDB Isolation Pattern)

Si tienes $N = 8$ workers en un pool compartido y un inquilino malicioso o desbocado (Noisy Neighbor) lanza una tormenta de peticiones pesadas, tumbará los 8 workers afectando al $100\%$ de tus clientes.

Con Shuffle Sharding, asignamos a cada tenant un subconjunto virtual determinista de $k = 2$ workers elegidos mediante hash de su tenant_id. El número de combinaciones posibles es:

$\binom{8}{2} = \frac{8!}{2!(8-2)!} = 28\text{ shards virtuales}$

Si un inquilino satura sus 2 workers asignados, la probabilidad de que otro cliente cualquiera comparta exactamente esos mismos 2 workers es de apenas $1 / 28 = 3.57\%$, reduciendo el radio de explosión (Blast Radius) en un $96.4\%$ sin aumentar el número de servidores.

Planificación Justa en Colas de Trabajo Asíncronas: Weighted Fair Queuing (WFQ) y Deficit Round Robin (50 min)

Planificación Justa en Colas de Trabajo Asíncronas: Weighted Fair Queuing (WFQ) y Deficit Round Robin

1. Por Qué una Cola FIFO Única en Kafka/RabbitMQ Causa Inanición (Starvation) entre Tenants

Si el Tenant_A encola de golpe $500,000$ trabajos de generación de reportes a las 09:00:00 y el Tenant_B encola $1$ trabajo urgente a las 09:00:01 en la misma cola FIFO, el Tenant_B tendrá que esperar horas detrás de los $500,000$ mensajes de Tenant_A.

Solución de Producción (Deficit Round Robin / Per-Tenant Virtual Queues): El despachador mantiene punteros lógicos por tenant_id con un Quantum de crédito proporcional a su plan comercial (ENTERPRISE = 100, PRO = 30, FREE = 5), alternando el consumo entre todos los inquilinos activos en cada ronda.

Rate Limiting Consciente del Costo de Cómputo (Query Complexity Quota) y Load Shedding por Prioridad (45 min)

Rate Limiting Consciente del Costo de Cómputo (Query Complexity Quota) y Load Shedding por Prioridad

1. Por Qué Contar Peticiones por Segundo (RPS) No Protege el Backend

Un GET /health cuesta $0.1\text{ ms}$ de CPU, mientras que un POST /analytics/export cuesta $800\text{ ms}$ de CPU y $50\text{ MB}$ de RAM. Limitar por RPS trata ambas peticiones como iguales.

En arquitecturas SaaS de grado financiero, el algoritmo Token Bucket / GCRA descuenta Unidades de Costo de Cómputo (Compute Units) por petición y aplica Adaptive Load Shedding: cuando la latencia p95 del clúster supera el umbral crítico, el gateway rechaza proactivamente tráfico batch/free con HTTP 429 + Retry-After preservando el $100\%$ de disponibilidad para transacciones críticas de tiers superiores.

Módulo 3: Módulo 3: Facturación por Uso (Usage-Based Metered Billing), Idempotencia y Control de Acceso NGAC

Ingeniería de Metered Billing (Facturación por Consumo): Ingesta Idempotente y Reconciliación Contable (55 min)

Ingeniería de Metered Billing (Facturación por Consumo): Ingesta Idempotente y Reconciliación Contable

1. Por Qué un Error en el Pipeline de Medición Es Directamente Pérdida de Ingresos o Fraude de Cobro

En modelos SaaS basados en consumo (tokens de IA procesados, minutos de voz, llamadas API, GB almacenados), el pipeline de medición (Metering Pipeline) es un sistema contable auditable:

flowchart LR
    API["Gateway / Worker Emite Evento con idempotency_key"] --> KFK["Kafka Topic: usage_events"]
    KFK --> DEDUP["Deduplicador Transaccional + Agregador Horario (ClickHouse / Postgres)"]
    DEDUP --> LEDGER["Usage Ledger Inmutable (Append-Only)"]
    LEDGER -->|"Sincronización con Idempotency-Key"| STRIPE["Motor de Facturación (Stripe Billing Meters / Lago)"]

Tres Leyes Inquebrantables del Metering: 1. Clave de Idempotencia Determinista: Cada evento lleva idempotency_key = sha256(tenant_id + resource_id + action_type + timestamp_bucket). Si un worker reintenta 3 veces, jamás se cobra triple al cliente. 2. Inmutabilidad y Ajustes por Contra-Asiento: Los eventos de uso nunca se editan con UPDATE; cualquier bonificación o reverso se inserta como un evento compensatorio con signo negativo. 3. Separación entre event_time (cuándo ocurrió el consumo) e ingested_at para respetar los cierres de ciclo mensual con período de gracia.

Motor de Entitlements, Límites de Plan y Control de Acceso NGAC (Next Generation Access Control) (45 min)

Motor de Entitlements, Límites de Plan y Control de Acceso NGAC (Next Generation Access Control)

1. Separación entre Feature Flags de Despliegue y Entitlements Comerciales

- Release Feature Flag (Efímero): Activa progresivamente un nuevo motor de búsqueda al $5\% \to 50\% \to 100\%$ del tráfico técnico y se elimina del código una vez estabilizado. - Tenant Entitlements & Policy Graph (NGAC Permanente): Modela en un grafo de políticas qué capacidades (sso_saml, audit_log_retention_days: 365, max_seats: 50) posee cada organización, evaluando permisos jerárquicos en $< 1\text{ ms}$ desde caché local invalidada por eventos.

Live Tenant Migration: Promoción en Caliente de un Cliente desde el Pool Compartido a un Silo Dedicado (45 min)

Live Tenant Migration: Promoción en Caliente de un Cliente desde el Pool Compartido a un Silo Dedicado

Cuando un cliente PRO del Pool compartido firma un contrato ENTERPRISE que exige base de datos aislada (Silo), ejecutamos una migración sin tiempo de inactividad: 1. Snapshot Inicial + Replicación Lógica Filtrada (CDC por tenant_id) desde el Pool hacia el nuevo Silo. 2. Verificación de checksum de filas (count y sum(hash)). 3. Pausa breve en el router de conexiones ($< 200\text{ ms}$) para drenar transacciones en vuelo, actualizar la tabla de ruteo de tenants (Control Plane Routing Table) hacia el DSN del Silo y purgar los datos antiguos del Pool.

Módulo 4: Módulo 4: Laboratorio de Facturación Metered Billing Idempotente y Evaluación de Certificación

Telemetría FinOps Multi-Tenant: Atribución de Costo de Infraestructura por Inquilino (Cost-Per-Tenant) (45 min)

Telemetría FinOps Multi-Tenant: Atribución de Costo de Infraestructura por Inquilino (Cost-Per-Tenant)

En un modelo Pool compartido, el costo mensual de AWS/GCP se prorratea midiendo en cada petición los milisegundos de CPU, bytes de red y tokens/IOPS consumidos por tenant_id, permitiendo detectar instantáneamente clientes con Margen Bruto Negativo cuyo consumo real supera la tarifa de su plan.

Laboratorio Práctico: Liquidación de Metered Billing con Deduplicación de Eventos e Impuestos por Tier (60 min)

Laboratorio Práctico: Liquidación de Metered Billing con Deduplicación de Eventos e Impuestos por Tier

Contexto del Desafío Financiero SaaS

El motor de facturación debe liquidar el consumo mensual de nuestros clientes a partir de la tabla de ingesta raw_usage_metering, la cual contiene eventos duplicados producto de reintentos de red de los workers: - idempotency_key (TEXT: identificador único del evento real) - tenant_id (TEXT) - units_consumed (INTEGER: unidades consumidas en ese evento) - unit_price_cents (INTEGER: precio por unidad en centavos de USD)

Objetivo de la Consulta SQL

1. Primero deduplica los eventos por idempotency_key (conservando solo 1 instancia por cada idempotency_key única). 2. Luego agrupa por tenant_id y devuelve: - tenant_id - unique_events: cantidad de eventos únicos válidos del tenant - total_units: suma de units_consumed (sin duplicados) - invoice_usd: monto total a facturar en dólares ROUND(SUM(units_consumed * unit_price_cents) / 100.0, 2) Ordena el resultado por invoice_usd DESC.

Evaluación de Certificación: Arquitecturas SaaS Multi-Tenant de Grado Financiero y Metered Billing (45 min)

Evaluación de Certificación: BACK-1001

Valida tu dominio de aislamiento Multi-Tenant con PostgreSQL RLS, Shuffle Sharding, Fair Queuing y Metered Billing idempotente.