Durante décadas, la frontera entre OLTP (Online Transaction Processing) y OLAP (Online Analytical Processing) ha sido uno de los pilares silenciosos de la arquitectura de datos empresarial. Sin embargo, el auge del cloud, los sistemas distribuidos, los workloads en streaming y la presión creciente por obtener analítica “en tiempo real” han puesto esta frontera bajo tensión. Para CIOs, arquitectos y equipos de datos, entender con precisión qué diferencia a OLTP de OLAP —y cuándo tiene sentido integrar ambos mundos— es hoy más importante que nunca.

En esencia, OLTP gestiona la verdad operativa: transacciones que deben ser rápidas, coherentes y seguras. Son los sistemas que permiten vender, cobrar, registrar movimientos, actualizar inventario o ejecutar órdenes financieras. Cada milisegundo importa, cada inconsistencia cuenta, cada bloqueo puede convertirse en una caída de servicio. Por eso los patrones OLTP giran en torno al aislamiento transaccional, la minimización del fan-out, el particionado inteligente y el equilibrio delicado entre índices, locking y throughput.
OLAP, por su parte, es el territorio del análisis masivo y la exploración del dato. Motores columnar, compresión agresiva, segmentación, vectorización y almacenes capaces de escanear miles de millones de filas por segundo. Su objetivo no es gestionar el día a día, sino entregar inteligencia. OLAP convierte eventos en métricas, tablas en modelos semánticos, históricos en predicciones. Pero es ineficiente —y peligroso— cuando se le pide comportamiento transaccional.
La promesa moderna del “real-time analytics” ha difuminado la separación. Con tecnologías como Kafka, Debezium, Pinot, Druid o Rockset, muchas empresas esperan obtener analítica en segundos sin sacrificar rendimiento operativo. La realidad es más matizada: los patrones híbridos (HTAP, CDC continuo, materializaciones) funcionan, pero exigen rigor arquitectónico, madurez en ingeniería y un entendimiento profundo de consistencia y latencia.
Este capítulo ofrece una guía práctica para evitar los anti-patrones más frecuentes —desde ejecutar dashboards sobre bases OLTP hasta particionar incorrectamente un data warehouse— y diseñar arquitecturas que escalan sin dolor. Con ejemplos sectoriales, un caso real completo y un checklist operativo, el conjunto proporciona una hoja de ruta para tomar decisiones informadas y sostenibles.
La frontera entre transaccionar y analizar
Durante años, la arquitectura de datos empresarial se ha construido sobre una separación casi ritual: los sistemas que hacen que el negocio funcione y los sistemas que explican cómo y por qué funciona. Los primeros, los OLTP, son el corazón que late rápido; los segundos, los OLAP, son el cerebro que reflexiona con calma. En el mundo pre-cloud esta división era tan evidente que apenas se cuestionaba. Un banco no ejecutaba agregaciones de millones de filas sobre su sistema de cuentas, del mismo modo que un supermercado no hacía transacciones de caja sobre su data warehouse. Pero la modernidad tecnológica, con su promesa constante de inmediatez y elasticidad infinita, ha tensado los límites hasta difuminarlos.
La historia reciente de muchas organizaciones se parece más a una improvisación que a una estrategia. Equipos de analítica queriendo dashboards en tiempo real. Equipos de operaciones intentando proteger sus bases de datos de consultas pesadas. Áreas de negocio exigiendo métricas instantáneas sin comprender qué significa técnicamente “instantáneo”. Y entre medias, los arquitectos y los ingenieros tratando de evitar que las cosas se rompan.
Un ejemplo típico —casi un clásico ya en consultoría— se repite especialmente en sectores como fintech, retail o e-commerce. Un equipo de producto lanza la necesidad de tener “visibilidad en directo” del número de pedidos, del stock o de las transacciones aprobadas. El dashboard se conecta de forma directa al sistema transaccional, porque “solo son unas queries”. Los primeros días todo parece ir bien, hasta que la tabla principal crece un poco más, un pico de carga coincide con la campaña de marketing y una consulta mal diseñada provoca un bloqueo global, incrementa la latencia del API y acaba afectando al checkout o al login. La explicación final suele ser la misma: “El dashboard tumbó el OLTP”.
Lo que a menudo se pasa por alto es que no fue culpa del dashboard, sino de la arquitectura. Es un síntoma de un error conceptual: asumir que real time significa consultar directamente la fuente de verdad operacional. Es confundir velocidad con inmediatez, y análisis con operación.
La frontera entre transaccionar y analizar sigue existiendo, aunque las herramientas modernas nos permitan acercarla, suavizarla o incluso cruzarla en entornos específicos. Pero requiere diseño. Requiere disciplina. Requiere entender profundamente qué implica la consistencia, cómo se gestiona la latencia y qué riesgos tiene particionar mal un sistema o mezclar cargas incompatibles.
Este capítulo profundiza precisamente en eso: en por qué OLTP y OLAP no son lo mismo, en qué casos sí pueden convivir, cómo construir analítica en tiempo real sin destruir la operativa, y qué patrones han demostrado ser sostenibles en empresas reales.
OLTP: arquitectura, patrones y expectativas operativas
Cuando se habla de OLTP en arquitectura moderna, lo primero que debe entender un CIO o un arquitecto es que ya no estamos ante simples bases de datos relacionales como las de hace 20 años. El OLTP actual es un ecosistema distribuido, cada vez más automatizado por el cloud, sometido a presiones de latencia agresivas y obligado a convivir con microservicios, particionado horizontal, eventos y tráfico impredecible. Sin embargo, su esencia no ha cambiado: el OLTP sigue siendo el sistema que guarda la verdad transaccional del negocio y, por tanto, el que nunca puede fallar.
Si el OLAP es un producto de inteligencia, el OLTP es un sistema de misión crítica. Un error en OLTP no es “una métrica incorrecta”, sino una incoherencia financiera, un pedido duplicado, un registro corrupto o un fallo en la autenticación de millones de usuarios. Por eso los patrones OLTP se han construido históricamente alrededor de ACID: atomicidad, consistencia, aislamiento y durabilidad. Pero en la práctica, la manera en la que estos principios se implementan ha evolucionado notablemente.
La tendencia general —empujada por empresas digitales de escala masiva— es adoptar motores distribuidos que combinan particionado, replicación y alto rendimiento sin renunciar a la coherencia. Ejemplos relevantes: Amazon Aurora, Google Spanner, YugabyteDB, CockroachDB o TiDB. Todos ellos intentan resolver el mismo problema: cómo seguir siendo OLTP en un mundo global, elástico y exigente sin que la complejidad operacional se dispare.
Los sistemas OLTP nacieron para resolver un problema específico: procesar transacciones de negocio con garantías ACID (Atomicity, Consistency, Isolation, Durability) a escala. Piense en cada compra en un e-commerce, cada transferencia bancaria, cada actualización de inventario. Estas operaciones comparten características comunes:
Patrones de acceso típicos:
- Lecturas y escrituras puntuales por clave primaria (punto de acceso)
- Alto volumen de transacciones concurrentes
- Cada transacción toca pocas filas (típicamente < 100)
- Requerimientos de latencia en el rango 1-50ms para el percentil 99
- Necesidad de garantías de consistencia fuerte
Latencia como contrato social
Una transacción OLTP tiene un objetivo que rara vez se menciona explícitamente: debe completarse en menos de 10 milisegundos, preferiblemente menos de 5. No importa si el negocio está en retail, banca o SaaS; la percepción del usuario depende de esto. Un login lento, un pago lento, un carrito lento… y el cliente abandona. La arquitectura OLTP no se mide solo por consistencia, sino por responsividad.
La latencia es un contrato informal entre ingeniería y negocio. Pero cumplirlo implica tomar decisiones duras: limitar fan-out (evitar consultas que afectan a demasiadas particiones o servicios), reducir el número de joins, evitar agregaciones complejas en tiempo de transacción y, sobre todo, diseñar esquemas que minimicen la contención.
Esquemas para mutabilidad, no para análisis
Uno de los equívocos más extendidos en el diseño OLTP moderno es tratar el modelo transaccional como si fuera también un modelo analítico. En consultoría se observa continuamente: tablas excesivamente normalizadas, docenas de joins para resolver un endpoint, columnas adicionales para cálculos analíticos, índices creados para dar soporte a consultas exploratorias… Todo ello degrada el rendimiento y hace que el sistema pierda su naturaleza OLTP.
El patrón correcto es simple y difícil a la vez:
el esquema OLTP debe estar optimizado para las mutaciones mínimas necesarias para operar, nada más.
Esto implica:
-
Tablas normalizadas hasta el punto en que eviten redundancias críticas, pero sin obsesionarse.
-
Evitar agregados precalculados en OLTP; deben generarse aguas abajo.
-
Mantener índices estrictamente necesarios; demasiados índices penalizan escrituras.
-
Patrones de acceso sencillos, diseñados para update/insert, no para queries complejas.
Particionado y el enemigo invisible: el “hot spot”
En bases distribuidas, el particionado es la espada de doble filo que decide si el sistema escala o colapsa. El arquitecto debe elegir una clave de partición que evite concentrar tráfico en una sola partición caliente (“hot spot”). En un comercio electrónico, por ejemplo, particionar por ID de producto es un error si un producto estrella recibe un volumen desproporcionado de actualizaciones. En SaaS multi-tenant, particionar por cliente puede provocar que un tenant grande monopolice un shard entero.
Los patrones recomendados incluyen:
-
Hash partitioning para distribuir carga aleatoriamente.
-
Range partitioning cuando el acceso está correlacionado con el tiempo (ej. transacciones recientes).
-
Composite keys cuando se necesita controlar la granularidad.
Un buen diseño de particionado reduce el bloqueo, minimiza la contención y permite que más consultas se ejecuten en paralelo sin impacto sistémico.
Cómo piensan los motores OLTP modernos
Aurora optimiza los commit logs con replicación asincrónica hacia réplicas de lectura.
Yugabyte y Cockroach implementan distribución basada en el consenso de Raft.
Spanner introduce relojes GPS y TrueTime para garantizar consistencia global.
Aunque cada motor tiene diferencias drásticas de diseño, todos comparten un objetivo: mantener la coherencia incluso cuando miles de nodos trabajan simultáneamente.
Diseño de esquema orientado a normalización
La normalización (hasta 3NF típicamente) minimiza redundancia y garantiza integridad referencial. Un pedido no duplica los datos del cliente, sino que referencia su ID. Esto optimiza las escrituras y mantiene una única fuente de verdad, pero penaliza las consultas analíticas que necesitan JOINs extensos.
Ejemplo de carga típica:
-- Transacción OLTP típica: crear pedido BEGIN TRANSACTION; INSERT INTO orders (customer_id, order_date, status) VALUES (12345, NOW(), 'pending'); INSERT INTO order_items (order_id, product_id, quantity, price) VALUES (LAST_INSERT_ID(), 789, 2, 49.99); UPDATE inventory SET stock = stock - 2 WHERE product_id = 789 AND warehouse_id = 3; COMMIT;
Esta transacción toca tres tablas, pero cada operación es precisa, predecible y optimizable mediante índices específicos.
Anti-patrones clásicos que siguen apareciendo en 2025
En proyectos reales se siguen viendo errores repetidos:
-
Ejecutar queries analíticas (scans completos) en producción.
-
Intentar “simplificar la arquitectura” almacenando logs, auditorías y métricas en la misma base OLTP.
-
Añadir índices nueva y alegremente para mejorar el rendimiento de lecturas, sin medir el coste en escrituras.
-
Diseñar endpoints que requieren demasiadas joins.
-
Mezclar cargas de consulta humana (dashboards) con workloads críticos.
El resultado es siempre el mismo: aumento de contención, bloqueos inesperados, latencias crecientes, saturación de CPU y degradación del servicio.
OLTP como primera línea de defensa
El OLTP no es un sistema para hacer análisis; es un sistema para proteger la verdad. Su objetivo es ser rápido, consistente y aburridamente fiable. Si un OLTP es emocionante, algo se ha hecho mal.
En los próximos apartados veremos precisamente cómo se complementa con OLAP, cómo se construye real-time sin romperlo y qué estrategias de particionado y consistencia evitan que estos sistemas colapsen cuando crecen.
OLAP: almacenes, motores columnar y paradigmas modernos
Si el OLTP es el músculo que ejecuta, el OLAP es el sistema nervioso que interpreta. Es el lugar donde los datos dejan de ser simples transacciones y se convierten en métricas, patrones, correlaciones y decisiones. Sin embargo, el OLAP moderno no tiene nada que ver con aquellos data warehouses monolíticos de los años 2000. La transición hacia arquitecturas columnar, cloud-native y orientadas a escaneo masivo ha transformado radicalmente las capacidades analíticas de las empresas.
Hoy, un motor OLAP no es solo un repositorio: es un “acelerador” capaz de procesar terabytes en segundos, impulsar exploración ad hoc, servir modelos semánticos consistentes y alimentar tanto dashboards como productos de datos. Y todo esto sin alterar la operativa del negocio, porque la clave de OLAP es la separación: se puede preguntar sin miedo a bloquear, escanear sin afectar a clientes, y experimentar sin romper sistemas críticos.
OLAP surgió para responder preguntas de negocio complejas sobre conjuntos masivos de datos históricos. No importa si una consulta tarda 5 segundos en lugar de 50 milisegundos; lo que importa es poder agregar millones de filas eficientemente.
Patrones de acceso característicos:
- Escaneos de tabla completos o de particiones enteras
- Agregaciones sobre millones/miles de millones de filas
- JOINs entre múltiples dimensiones (star schema, snowflake)
- Consultas ad-hoc impredecibles
- Latencia tolerable en el rango de segundos a minutos
Almacenes columnares: el corazón del OLAP moderno
Motores como BigQuery, Snowflake, Databricks SQL, Redshift o ClickHouse comparten un principio fundamental: almacenamiento columnar y ejecución vectorizada. La idea es simple: en OLAP casi todas las consultas son agregaciones o filtros sobre un subconjunto de columnas (ventas, fechas, categorías), por lo que almacenar los datos columna a columna y no fila a fila permite:
-
Leer solo las columnas necesarias.
-
Comprimir drásticamente la información (hasta ×20).
-
Maximizar el throughput en operaciones de escaneo.
-
Ejecutar cálculos en batches vectorizados sobre CPU SIMD.
Donde un motor OLTP tardaría segundos en escanear millones de filas, un motor columnar lo hace en milisegundos.
La consecuencia práctica para arquitectos:
si necesitas explorar, cruzar, agregar y filtrar grandes volúmenes, OLAP es el lugar correcto.
Intentarlo en OLTP no solo es ineficiente: es peligroso.
BigQuery, Snowflake, Databricks y ClickHouse: cuatro aproximaciones distintas
Aunque comparten esencia, cada plataforma sigue filosofías distintas:
-
BigQuery apuesta por una separación radical de compute/storage, escalado automático y precios basados en escaneo; brilla en analítica masiva y latencias razonables.
-
Snowflake destaca por su aislamiento computacional (virtual warehouses), su elasticidad y su manejo casi automático del clustering.
-
Databricks combina Lakehouse + SQL con fuerte orientación a workloads mixtos (ETL, ML y BI).
-
ClickHouse prioriza velocidad pura con compresión eficiente, ordenación de bloques y particionado por fechas.
Para un CIO, esto se traduce en trade-offs de coste, control, complejidad y experiencia del equipo. Pero todos ellos cumplen el mismo objetivo: responder preguntas complejas a gran escala.
Diseño físico: segmentación, clustering y micro-particiones
La magia de OLAP no ocurre solo en el motor; ocurre en cómo organizamos los datos:
-
Particionado por fecha: reduce escaneo innecesario en tablas muy grandes.
-
Clustering: ordena los datos según columnas con alta cardinalidad (tienda, cliente, categoría).
-
Micro-particiones (Snowflake): unidades pequeñas y automáticamente optimizadas.
-
Z-ordering (Databricks): ordenación multidimensional que reduce el volumen leído.
Cuando estas técnicas se aplican correctamente, un dashboard que antes tardaba 20 segundos puede bajar a menos de 2.
Cuando se aplican mal, un data warehouse que costaba 200 € al mes pasa a costar 5.000 € en unas semanas.
Patrones OLAP sólidos
Hay una serie de enfoques que funcionan consistentemente bien en organizaciones:
1. ELT (Extract, Load, Transform)
El foco está en cargar datos brutos primero y transformarlos en el data warehouse. Esto simplifica la ingesta y aprovecha la potencia de los motores columnares.
2. Modelos semánticos
No se trata solo de tablas, sino de definir significado: cómo se mide una venta, qué es un cliente activo, cómo se calcula una conversión.
Sin un modelo semántico, los departamentos terminan con métricas inconsistentes.
3. Data marts específicos
Un datamart para finanzas, otro para marketing, otro para operaciones.
No es fragmentar, es especializar la experiencia del usuario analítico.
4. Query pushdown
Empujar las transformaciones al motor OLAP en lugar de hacerlas en herramientas intermedias o BI.
5. Computación aislada
Snowflake y Databricks lo resuelven de forma nativa; BigQuery lo hace con mecanismos internos.
El objetivo: que un analista no pueda tumbar un pipeline crítico o viceversa.
Diseño de esquema orientado a consultas
La desnormalización es la norma. Los data warehouses típicamente implementan esquemas estrella o copo de nieve donde una tabla de hechos (facts) central contiene métricas numéricas, rodeada de tablas dimensionales (dimensions) que proporcionan contexto. La redundancia controlada acelera dramáticamente las consultas analíticas.
Ejemplo de consulta típica:
-- Consulta OLAP típica: análisis de ventas
SELECT
d.year, d.quarter, d.month,
p.category, p.subcategory,
c.segment, c.region,
SUM(f.revenue) as total_revenue,
SUM(f.units_sold) as total_units,
AVG(f.discount_pct) as avg_discount
FROM fact_sales f
JOIN dim_date d ON f.date_id = d.date_id
JOIN dim_product p ON f.product_id = p.product_id
JOIN dim_customer c ON f.customer_id = c.customer_id
WHERE d.year BETWEEN 2023 AND 2024
AND p.category IN ('Electronics', 'Home')
GROUP BY 1,2,3,4,5,6,7
HAVING SUM(f.revenue) > 100000
ORDER BY total_revenue DESC;
Esta consulta puede escanear cientos de millones de filas, pero gracias al almacenamiento columnar, compresión y particionado inteligente, se ejecuta en segundos.
Particionado en OLAP: temporal y por dimensión
Particionado temporal: El patrón dominante en OLAP. Los datos se organizan por fecha (día, mes, año) porque las consultas analíticas típicamente filtran por rangos temporales.
-- BigQuery particiona automáticamente por fecha de ingesta CREATE TABLE sales_events PARTITION BY DATE(event_timestamp) CLUSTER BY customer_id, product_category AS SELECT ...
Beneficios:
- Partition pruning: consultas solo escanean particiones relevantes
- Retención simplificada: borrar datos antiguos es trivial (DROP PARTITION)
- Coste optimizado: en sistemas como BigQuery, solo pagas por datos escaneados
Clustering adicional:
Dentro de cada partición, ordenar datos por columnas frecuentemente filtradas acelera aún más las consultas. BigQuery, Snowflake y Databricks soportan clustering automático o manual.
Anti-patrón OLAP: Particionar por demasiadas dimensiones (producto, región, fecha) crea excesivas particiones pequeñas, aumentando metadata overhead y complicando el query planning.
Patrones arquitectónicos probados
Patrón 1: Separación estricta con replicación asíncrona
Arquitectura:
[App] → [OLTP DB] → [CDC/ETL] → [OLAP Warehouse] → [BI Tools]
Cuándo usarlo:
- Requisitos de consistencia fuerte en operaciones
- Tolerancia a lag de minutos/horas en reportes
- Cargas OLTP y OLAP con patrones de acceso completamente distintos
Caso real:
Un marketplace de e-commerce con 50K transacciones/min usa PostgreSQL para pedidos (OLTP) y replica mediante Debezium+Kafka a Snowflake cada 5 minutos. El equipo de BI ejecuta consultas complejas sin impactar rendimiento transaccional. Coste mensual en Snowflake: $12K vs hipotético $45K si ejecutaran analítica directamente sobre OLTP.
Patrón 2: Réplicas de lectura para informes ligeros
Arquitectura:
[OLTP Primary]
↓ (replicación streaming)
[Read Replica] → [Reportes operacionales]
Cuándo usarlo:
- Reportes operacionales simples con baja latencia (< 1 min)
- Presupuesto limitado que no justifica warehouse completo
- Queries analíticos no extremadamente pesados
Limitaciones: Las réplicas de lectura comparten el esquema normalizado del OLTP, por lo que queries complejas siguen siendo lentas. Es una solución táctica, no estratégica.
Patrón recomendado: Usar materialized views en la réplica para pre-agregar datos críticos.
CREATE MATERIALIZED VIEW sales_summary_daily AS SELECT DATE(order_date) as date, product_category, COUNT(*) as orders, SUM(total_amount) as revenue FROM orders o JOIN order_items oi ON o.id = oi.order_id JOIN products p ON oi.product_id = p.id GROUP BY 1, 2; REFRESH MATERIALIZED VIEW CONCURRENTLY sales_summary_daily;
Patrón 3: HTAP (Hybrid Transactional/Analytical Processing)
Bases de datos emergentes:
- TiDB (PingCAP): MySQL-compatible con soporte HTAP
- SingleStore (antes MemSQL): rowstore + columnstore en un sistema
- Oracle Autonomous Database: dual-format storage
Arquitectura interna típica:
[Aplicación]↓[Motor HTAP]├─ Rowstore (OLTP optimizado)└─ Columnstore (OLAP optimizado)↑ (replicación interna continua)
Cuándo considerarlo:
- Necesidad de analítica operacional con latencia de segundos
- Casos de uso como fraud detection, recomendaciones en tiempo real
- Equipos pequeños que no pueden gestionar múltiples sistemas
Trade-offs:
- Mayor complejidad operacional (un sistema que hace dos cosas)
- Típicamente más caro que sistemas especializados
- Madurez menor que OLTP o OLAP puros
Caso de uso ideal:
Una fintech que necesita calcular límites de crédito en tiempo real basándose en transacciones recientes. HTAP permite query transaccional (¿cuál es el saldo?) y analítico (¿cuál ha sido el gasto promedio últimos 30 días?) en el mismo sistema con < 100ms.
Anti-patrones OLAP que generan caos y facturas altas
En consultoría, los problemas más comunes no vienen de la tecnología, sino del mal uso:
-
Cargar datos con demasiada granularidad sin necesidad real: guardar cada evento milimétrico de IoT o logs completos sin política de retención.
-
Falta de particionado en tablas enormes: millones de filas escaneadas para responder preguntas simples.
-
JOINs sobre datasets desalineados: fechas desincronizadas, claves inconsistentes o tablas sin ordenación coherente.
-
Metricas definidas “a ojo”: cada equipo usa sus fórmulas, lo que destruye la confianza en el DWH.
-
SLA irreales: dashboards que deben cargar en 0.5s cuando requieren escanear 300 millones de registros.
-
Skew: elegir una clave de sharding que resulta en distribución desequilibrada. Si el 80% del tráfico va al 20% de los shards, no has escalado, has movido el problema. Se ha de analizar la distribución de acceso antes de definir sharding
Anti-patrones en detalle
Anti-patrón 1: Analítica pesada directa sobre OLTP
El problema:
Ejecutar queries complejos con JOINs y agregaciones directamente sobre la base de datos transaccional.
Por qué es desastroso:
- Bloquea recursos (CPU, I/O, memoria) necesarios para transacciones
- Los queries largos pueden causar lock contention
- El percentil 99 de latencia transaccional se degrada dramáticamente
Síntomas observables:
- Timeouts en la aplicación durante horas de reportes
- CPU al 100% entre 9-10 AM cuando ejecutivos revisan dashboards
- Quejas de “la app está lenta por la mañana”
Solución: Separación arquitectónica inmediata. Incluso una réplica de lectura es mejor que nada.
Anti-patrón 2: Esquema normalizado en el data warehouse
El problema: Replicar el esquema OLTP normalizado directamente al warehouse y esperar buen rendimiento analítico.
Por qué falla: Los data warehouses columnares están optimizados para escanear columnas, no para JOINs complejos. Un query con 8 JOINs sobre tablas normalizadas será lenta independientemente del hardware.
Solución: Implementar un proceso de transformación (la "T" en ETL o ELT) que desnormalice a esquema estrella o copo de nieve. Herramientas como dbt hacen esto declarativo y mantenible.
-- Mal: replicar esquema normalizado SELECT o.id, c.name, c.email, p.title, p.price... FROM orders o JOIN customers c ON o.customer_id = c.id JOIN order_items oi ON o.id = oi.order_id JOIN products p ON oi.product_id = p.id -- 4 JOINs en cada query analítico -- Bien: fact table desnormalizada SELECT order_id, customer_name, customer_segment, product_title, product_category, order_amount, units_sold FROM fact_sales WHERE order_date >= '2024-01-01' -- Sin JOINs, escaneo columnar puro
Anti-patrón 3: Ignorar el skew en particionado
El problema: Particionar o shardear sin analizar la distribución real de datos y acceso.
Ejemplo concreto: Una plataforma B2B shardea por company_id usando módulo hash, pero el cliente más grande representa el 40% del tráfico. Ese shard está constantemente saturado mientras otros están ociosos.
Solución:
- Analizar la distribución de datos antes de decidir la estrategia
- Considerar sharding híbrido: clientes grandes en shards dedicados, pequeños agrupados
- Implementar monitoring de distribución de carga por shard
Anti-patrón 4: Transacciones cross-shard en OLTP
El problema: Diseñar transacciones que requieren atomicidad entre múltiples shards.
Por qué es problemático: Las transacciones distribuidas (2PC - two-phase commit) añaden latencia significativa y aumentan la probabilidad de fallos parciales.
Solución arquitectónica: Rediseñar fronteras transaccionales para alinearse con fronteras de sharding. Si un pedido debe ser atómico, asegúrate de que todos los datos del pedido vivan en el mismo shard.
El data warehouse columnar no es mágico; solo funciona si se diseña con intención.
Coste: la cara oculta del OLAP moderno
Los motores cloud son extremadamente potentes, pero también extremadamente fáciles de usar mal.
Tres errores frecuentes:
-
Dashboards “sin límite” que lanzan consultas completas cada pocos segundos.
-
Transformaciones ineficientes que reescriben tablas enteras en lugar de particiones.
-
Falta de gobernanza en SQL: queries duplicadas, mal optimizadas o conflictivas.
El resultado: costes crecientes sin mejora proporcional en valor.
La solución pasa por gobernanza del warehouse:
versionado de modelos, auditoría de consultas, políticas de time travel razonables, particiones bien definidas y controles de uso.
El propósito último del OLAP
Un OLAP no está para transaccionar ni para ser un espejo exacto del OLTP. Está para:
-
Analizar el pasado.
-
Entender el presente.
-
Anticipar el futuro.
-
Permitir decisiones sin riesgo operativo.
Y cada vez más, para alimentar productos de datos, modelos de machine learning y analítica casi en tiempo real.
Consistencia: del ACID al “good-enough consistency”
Si hay un concepto que separa clara y profundamente el mundo OLTP del mundo OLAP —más incluso que latencia o particionado— es la consistencia. No porque ambos trabajen con distintas verdades (no deberían), sino porque trabajan con distintos tiempos y expectativas de verdad. La consistencia no es solo una propiedad técnica: es un contrato social entre los sistemas y el negocio.
En OLTP, la consistencia es inmediata, estricta, obligatoria. Una transferencia bancaria no puede quedar “a medias”, un pedido no puede duplicarse, un login no puede aprobarse sin validar credenciales. Por eso los OLTP nacieron bajo los principios ACID, especialmente la “C” de consistencia y la “I” de aislamiento. Ambos protegen al sistema de estados ambiguos o colisiones entre transacciones concurrentes.
Consistencia fuerte en OLTP
Cuando confirmas una transacción, todos los lectores posteriores ven ese cambio inmediatamente. Esto es fundamental para operaciones de negocio críticas.
Mecanismos técnicos:
- Two-phase locking (2PL): Los bloqueos garantizan que transacciones concurrentes no interfieran
- Multi-version concurrency control (MVCC): PostgreSQL, Oracle y otros mantienen múltiples versiones de cada fila para permitir lecturas consistentes sin bloquear escrituras
- Write-ahead logging (WAL): Cada cambio se registra en un log antes de modificar datos en disco
El coste de la consistencia:
La consistencia fuerte limita inherentemente la escalabilidad horizontal. En sistemas distribuidos, el teorema CAP nos recuerda que ante particiones de red, debemos elegir entre consistencia y disponibilidad. Por eso bases de datos distribuidas como CockroachDB y Spanner implementan protocolos de consenso (RAFT, Paxos) que añaden latencia pero mantienen garantías.
Consistencia good-enough
Sin embargo, incluso en OLTP moderno, la promesa ACID se ha convertido en una coreografía compleja. Motores como PostgreSQL usan MVCC (Multi-Version Concurrency Control) para permitir lecturas sin bloquear escrituras. Otros, como Spanner, utilizan relojes GPS y TrueTime para garantizar que el orden de las transacciones coincide con el orden real del tiempo físico. Bases distribuidas como Yugabyte o CockroachDB recurren a Raft para lograr consenso entre réplicas. Todas estas técnicas existen porque la consistencia estricta cuesta: cuesta latencia, cuesta throughput, cuesta complejidad.
Y ahí aparece el concepto que define gran parte de la arquitectura de datos moderna: good-enough consistency.
No significa “baja calidad”, ni “aproximado”, ni “relajado”. Significa que cada sistema necesita el nivel de consistencia adecuado a su propósito. En analítica, una tabla que se actualiza cada 5 minutos puede ser perfecta. En operaciones, un retraso de 100 milisegundos puede ser inaceptable.
La consistencia en OLAP
El OLAP tradicional opera bajo snapshot isolation: el motor garantiza que cualquier query ve una imagen coherente del estado del dato en un punto fijo en el tiempo. Perfecto para análisis, inútil para transacciones. Así, OLAP puede ofrecer coherencia analítica sin sacrificar rendimiento: no se bloquea, no pelea con concurrencia, no compite con operaciones sensibles. Simplemente “mira el pasado reciente”.
Los sistemas analíticos pueden permitirse consistencia eventual porque la precisión al segundo raramente importa para decisiones estratégicas. Si un dashboard tarda 5 minutos en reflejar una venta, el negocio no sufre.
Patrones prácticos:
- ETL/ELT batch nocturno: El patrón clásico donde datos OLTP se replican al warehouse durante ventanas de mantenimiento
- Change Data Capture (CDC) continuo: Herramientas como Debezium capturan cambios del binlog/WAL y los propagan con minutos de retraso
- Materialización incremental: Herramientas como dbt construyen tablas agregadas que se actualizan solo con datos nuevos
Ejemplo arquitectónico:
Ventajas:
- Aísla cargas de trabajo (el tenant grande no afecta al pequeño)
- Permite escalar añadiendo shards
- Simplifica backups y recuperación por tenant
Desafíos:
- Consultas cross-shard son costosas y complejas
- Re-sharding es operacionalmente intensivo
- Requiere lógica de routing en la aplicación o mediante proxy
Los ecosistemas Hybrid Transactional/Analytical Processing
Pero el mundo moderno no se conforma con snapshots. Las empresas quieren “real-time”, o eso dicen. La realidad es que quieren consistencia operacional lo suficientemente rápida como para tomar decisiones inmediatas sin exigir bloqueo transaccional. Y aquí emerge el ecosistema HTAP (Hybrid Transactional/Analytical Processing).
Motores como TiDB, SingleStore, AlloyDB Omni, Rockset, Pinot o Druid prometen servir analítica inmediata sobre datos recién llegados. Lo consiguen separando almacenamiento primario (para OLTP) y vistas optimizadas in-memory (para OLAP), con replicaciones casi instantáneas o índices invertidos. Pero hay que decirlo claramente: HTAP no es un sustituto del OLTP+OLAP tradicional, sino una herramienta para casos concretos:
-
recomendaciones en tiempo real,
-
detección de fraude,
-
analítica operacional (número de pedidos al minuto),
-
observabilidad de sistemas,
-
IoT y telemetría.
En estos escenarios, la consistencia no es estrictamente ACID, pero es suficientemente próxima al tiempo real como para ser útil y segura.
Lo crítico para un arquitecto es no caer en la falsa promesa de que HTAP simplifica la arquitectura. En realidad, la hace más compleja: exige más observabilidad, más tuning, más gobernanza y más experiencia en ingeniería. Pero bien aplicada, permite lo que hace cinco años era impensable: analítica viva sin castigar al OLTP.
Latencia: el indicador que más se malinterpreta
De todos los conceptos que circulan en arquitectura de datos, ninguno genera tanta confusión como la latencia. Es habitual escuchar a negocio exigir “tiempo real”, a producto solicitar “actualización instantánea”, a analítica reclamar “datos vivos” y a ingeniería preguntarse cómo cumplir todo esto sin romper el OLTP. La realidad es que el término “real-time” se usa con tanta ligereza que ha perdido significado, y esa ambigüedad suele desembocar en decisiones arquitectónicas equivocadas.
Perfil de Latencia OLTP: compromisos y optimizaciones
La primera verdad incómoda es que no todos los milisegundos son iguales.
En OLTP, la latencia es existencial. Cada petición debe responder en 1–5 ms para mantener la experiencia del usuario y la salud del sistema. Una API de checkout, un endpoint de autenticación, un sistema de pagos… todos dependen de este margen estrechísimo. Aquí, latencia significa respuesta inmediata y está directamente ligada a la percepción de calidad.
Objetivos típicos:
- p50 (percentil 50): < 5ms
- p99 (percentil 99): < 20ms
- p99.9 (percentil 99.9): < 100ms
Por qué estos números importan: En aplicaciones web modernas, una petición puede generar de 10 a 50 queries en la base de datos. Si cada query es p99 = 50ms, una petición compleja puede tardar segundos, rompiendo la experiencia de usuario.
Optimizaciones clave:
- Índices estratégicos: Cada query debe tener un índice que soporte su patrón de acceso
- Connection pooling: Reutilizar conexiones elimina overhead de handshake
- Prepared statements: Parseo de query una sola vez, ejecución múltiple
- Read-through caching: Redis/Memcached delante de DB para datos calientes
python
El perfil de latencia OLAP
En OLAP, la latencia importa… pero de forma diferente. Lo relevante no es el milisegundo puntual, sino el throughput total. Un dashboard que tarda 3 segundos puede ser aceptable si analiza cientos de millones de registros; uno que tarda 15 segundos puede ser aceptable si permite explorar datos sin restricciones. Latencia OLAP no es latencia OLTP. Son métricas con propósitos distintos: en OLTP la latencia afecta a la operación; en OLAP afecta a la comodidad.
Objetivos típicos:
- Queries interactivos (dashboards): < 5 segundos
- Reportes complejos: < 30 segundos
- Jobs batch (ETL): minutos a horas (optimizar para throughput, no para latencia)
Técnicas de aceleración:
- Materialización agresiva: Pre-calcular agregaciones comunes
- Particionamiento temporal: Limitar escaneo a particiones relevantes
- Clustering y ordenación: Datos relacionados físicamente juntos
- Caching de resultados: Muchos dashboards se regeneran cada minuto cuando los datos cambian cada hora
Ejemplo: estrategia de materialización en dbt:
sql
La incómoda verdad del real time
La segunda verdad incómoda es que “tiempo real” rara vez significa tiempo real.
Podemos dividirlo en tres niveles:
-
Real-time estricto (<50 ms)
Solo aplicable a control industrial, algoritmos de alta frecuencia, detección de fraude ultra sensible.
Requiere sistemas especializados. -
Near-real-time (0.5–5 segundos)
Ideal para analítica operacional, métricas vivas, paneles de actividad, motores de recomendación. -
Real-time de negocio (30–180 segundos)
Suficiente para la mayoría de organizaciones, aunque casi nadie lo admite públicamente.
Perfecto para reporting operativo, seguimiento de ventas, monitorización de inventario, logística, etc.
La mayoría de compañías que “piden real-time” en realidad necesitan near-real-time o incluso real-time de negocio. Pero sin un lenguaje común sobre latencia, las expectativas se distorsionan.
La tercera verdad incómoda: bajar la latencia siempre tiene un coste.
Menos latencia implica:
-
más presión sobre el OLTP,
-
más infraestructura de streaming,
-
más pipelines continuos,
-
más motores HTAP o índices especializados,
-
más complejidad operacional.
Un CIO debe entender que cada salto de latencia exige un salto de inversión.
El trabajo de arquitectura consiste en encontrar el punto óptimo: lo suficientemente rápido para aportar valor, pero lo suficientemente estable para no desbordar la operativa.
La clave es esta:
No intentes optimizar para “real-time”. Optimiza para el “tiempo necesario para tomar decisiones”.
Ese es el verdadero KPI.
Explotación y analítica en tiempo real: arquitecturas, límites y riesgos
El término real-time es uno de los más seductores —y peligrosos— en el vocabulario del dato moderno. Pocas expresiones generan tanta presión en una organización: “Queremos ver todo en tiempo real”. “Necesitamos datos instantáneos”. “Hace falta saber ahora mismo qué está pasando”. Pero detrás de esta aspiración se esconde una realidad: la analítica en tiempo real no es gratis, no es trivial y no es universalmente necesaria.
La clave está en comprender qué significa realmente “tiempo real” para cada tipo de negocio y cómo construirlo sin comprometer el OLTP ni disparar la complejidad de la arquitectura. Lo que la mayoría de empresas necesita no es tiempo real técnico, sino una analítica operativa consistente, rápida y lo suficientemente fresca para tomar decisiones sin distorsionar la operativa.
El propósito real del real-time en las empresas
No todos los casos de uso tienen los mismos requisitos. Si se analizan decenas de organizaciones de retail, fintech, supply chain y SaaS, emergen patrones claros:
-
Detección de fraude: requiere latencias de milisegundos o segundos, no minutos.
-
Inventario omnicanal: necesita reflejar movimientos recientes para evitar roturas o sobreventa.
-
Recomendaciones personalizadas: requieren datos recientes de navegación o interacción.
-
Telemetría y observabilidad: la frescura condiciona la reacción a incidentes.
-
Pricing dinámico y optimización de demanda: funciona en ventanas de segundos a minutos.
-
Motores de riesgo, scoring y validación: requieren consistencia casi inmediata para no generar decisiones incorrectas.
En todos estos escenarios, OLTP no basta. Pero tampoco basta un OLAP clásico. Requieren una tercera capa: motores de analítica en tiempo real.
Arquitectura moderna para analítica en tiempo real
La arquitectura sólida —la que no sacrifica el OLTP— se basa en un patrón claro:
1. OLTP → 2. Captura de cambios (CDC) → 3. Streaming → 4. Motor analítico real-time → 5. OLAP batch
Este pipeline establece un equilibrio sostenible:
-
El OLTP permanece protegido: no recibe queries analíticas.
-
El CDC (Debezium, GoldenGate, StreamSets, Fivetran) convierte cada operación en un evento.
-
El bus de streaming (Kafka, Pulsar, Redpanda) desacopla cargas y escala sin fricción.
-
El motor real-time (Pinot, Druid, Rockset, StarRocks) materializa vistas frescas y consultables.
-
El OLAP batch (BigQuery, Snowflake, Databricks) sigue siendo el repositorio histórico.
Es la arquitectura que usan empresas de alto volumen como LinkedIn, Uber, Airbnb, Mercado Libre o Shopify para equilibrar operación y visibilidad inmediata.
Motores reales de analítica en tiempo real
Cada vez más CIOs se preguntan si necesitan un motor HTAP, un Lakehouse en streaming o un sistema especializado. La respuesta depende del caso de uso:
Apache Pinot
Diseñado por LinkedIn para analítica de producto. Velocidad extrema, ideal para métricas vivas de usuario. Especialmente útil en SaaS y plataformas digitales.
Apache Druid
Muy fuerte en agregación y queries sobre series temporales, popular en medios, telcos y observabilidad.
Rockset
Indexación completa (inverted + columnar + trie). Excelente para consultas complejas en tiempo real con ingesta constante.
StarRocks
Gran rendimiento en analítica operativa. Creciente adopción para near-real-time en retail y logística.
Elasticsearch / OpenSearch
No es OLAP, pero cumple muy bien en búsquedas complejas y analítica semirrápida basada en índices invertidos.
Cada motor tiene su filosofía: unos optimizan para latencia, otros para ingesta, otros para flexibilidad de consulta.
El gran error: hacer analítica real-time directamente sobre el OLTP
No importa la industria: retail, banca, e-commerce, logística, SaaS… siempre ocurre.
Los síntomas son universales:
-
El dashboard genera scans que bloquean transacciones.
-
El sistema OLTP empieza a experimentar contención.
-
Aumentan los tiempos de respuesta.
-
Los picos de tráfico tumban al sistema.
-
El equipo de datos se culpa, el de negocio exige más real-time y el ciclo se repite.
La causa raíz es conceptual: confundir dato fresco con dato operativo.
Real-time no significa “consultar la fuente”, sino “capturar el cambio y proyectarlo con rapidez”.
Cuando el real-time es un anti-patrón
La tecnología permite hacer real-time casi en cualquier parte. Pero eso no significa que debas hacerlo.
Tres casos donde real-time es dañino:
1. Métricas que no cambian lo suficiente
Si el dato relevante cambia cada hora, construir una arquitectura de segundos es desperdicio puro.
2. Procesos de negocio que requieren reconciliación
Finanzas, contabilidad, cierre contable, reporting regulatorio.
La inmediatez puede generar incoherencias o auditorías incorrectas.
3. Equipos sin madurez operativa
Real-time requiere:
-
ingeniería sólida,
-
controles de calidad continuos,
-
observabilidad avanzada,
-
pipelines resilientes.
Sin ello, el real-time se convierte en deuda técnica acelerada.
El valor real del real-time
Cuando está bien planteada, la analítica en tiempo real no compite con OLTP ni OLAP; los complementa:
-
Da visibilidad sin bloquear.
-
Permite actuar antes de que los problemas escalen.
-
Alimenta experiencias de usuario personalizadas.
-
Mejora la toma de decisiones operativas.
-
Reduce riesgos y pérdidas.
El objetivo no es tener un sistema más rápido, sino un negocio más informado.
Analítica en tiempo real: casos de uso y arquitecturas
La demanda de “analítica en tiempo real” ha crecido exponencialmente, pero como ya hemos visto este término engloba escenarios con requisitos muy distintos.
Espectro de “tiempo real”
1. Analítica operacional (sub-segundo a segundos):
- Ejemplos: detección de fraude, recomendaciones personalizadas, alertas operacionales
- Requisitos: latencia < 1 segundo, consistencia fuerte o eventual con lag mínimo
- Arquitectura: streaming + state management
2. Analítica near-real-time (minutos):
- Ejemplos: dashboards ejecutivos “live”, monitoreo de campañas
- Requisitos: latencia de minutos aceptable, consistencia eventual OK
- Arquitectura: CDC + micro-batch processing
3. Analítica fresh (horas):
- Ejemplos: reportes diarios actualizados cada hora
- Requisitos: datos “suficientemente frescos” para decisiones tácticas
- Arquitectura: ETL incremental
Arquitectura para analítica operacional verdadera
Stack típico:
[Aplicación] → [Kafka/Pulsar] → [Stream Processor] → [OLAP/Cache](Flink/Spark Streaming)
Componentes clave:
-
Event streaming platform (Kafka, Pulsar):
- Buffer entre productores y consumidores
- Permite múltiples consumidores del mismo stream
- Retención configurable para replay
-
Stream processor (Flink, Spark Structured Streaming, Kafka Streams):
- Agregaciones con ventanas temporales (tumbling, sliding, session)
- State management para cálculos con contexto
- Exactly-once semantics cuando se requiere precisión
-
Serving layer:
- Druid, ClickHouse, Pinot: bases analíticas sub-segundo
- Redis/DragonflyDB: cache de resultados pre-calculados
- PostgreSQL + TimescaleDB: híbrido para queries flexibles
Caso práctico: detección de fraude en pagos
Requisito: Identificar transacciones sospechosas en < 200ms para bloquearlas antes de procesarlas.
Arquitectura implementada:
[Payment Gateway] → Kafka → Flink
↓
Feature Store
(Redis + S3)
↓
ML Model Serving
(SageMaker/KServe)
↓
Decision (block/allow)
Patrón técnico:
- Cada transacción se publica a Kafka con latencia < 5ms
- Flink mantiene features agregados en ventanas (ej: "número de transacciones del usuario última hora")
- Features se enriquecen con datos históricos de Redis (ej: "país usual del usuario")
- Modelo ML ejecuta inferencia en < 50ms
- Decisión se retorna al gateway
Complejidad crítica: consistencia de features online/offline
El modelo se entrenó con features calculados en batch (offline) sobre datos históricos en el warehouse. Pero en producción, los features se calculan en streaming (online). Si la lógica de cálculo difiere aunque sea ligeramente, el modelo falla silenciosamente.
Solución: Feature Store centralizado
Herramientas como Feast, Tecton o Databricks Feature Store permiten:
- Definir features una sola vez
- Generar código para cálculo batch y streaming
- Garantizar consistencia online/offline
# Definición de feature en Feast from feast import FeatureView, Field from feast.types import Int64, Float64 user_transaction_features = FeatureView( name="user_transaction_stats", entities=["user"], schema=[ Field(name="transactions_last_hour", dtype=Int64), Field(name="total_amount_last_hour", dtype=Float64), Field(name="avg_transaction_amount_30d", dtype=Float64), ], online=True, # Servir desde Redis offline=True, # Disponible en warehouse para training source=kafka_source, # Streaming source )
Arquitectura para analítica near-real-time (minutos)
Para casos donde segundos no son críticos, una arquitectura más simple y económica sufre:
Patrón: CDC + Micro-batch:
[OLTP DB] → Debezium → Kafka → Materialized Views(ClickHouse/Druid)↓Dashboards
Ventajas:
- Menor complejidad operacional que streaming puro
- Suficiente para mayoría de dashboards ejecutivos
- Más económico en scale (batch aprovecha mejor recursos)
Ejemplo: dashboard de ventas “live”
Una cadena retail quiere que ejecutivos vean ventas actualizadas cada 5 minutos en lugar de esperar a ETL nocturno.
Implementación:
- Debezium captura cambios de tabla
ordersen PostgreSQL - Kafka buffers los eventos
- ClickHouse materialized view consume de Kafka cada minuto
- Grafana query ClickHouse para visualización
Latencia total: 2-5 minutos desde venta hasta dashboard
Coste: ~$800/mes (ClickHouse gestionado + Kafka)
Valor: Los ejecutivos pueden reaccionar a tendencias intra-día en lugar de next-day
Checklist operativo: decisiones arquitectónicas
Evaluar separación OLTP/OLAP
- ¿Las queries analíticas actuales impactan en la latencia transaccional? (revisar métricas p99)
- ¿El equipo de BI solicita frecuentemente queries que causan locks o timeouts?
- ¿Los schemas actuales están normalizados (OLTP) pero se usan para reportes complejos?
- ¿Existe un data warehouse separado? Si no, ¿cuál es el coste actual de computo en la DB primaria durante horas de reportes?
Acción: Si 2+ respuestas son “sí”, priorizar separación arquitectónica en roadmap Q1.
Diseñar estrategia de particionado
- Para OLTP: ¿Existe una clave natural de sharding (tenant_id, region_id)? ¿Distribución equilibrada?
- Para OLAP: ¿Las queries filtran consistentemente por tiempo? ¿Implementar particionado temporal?
- ¿El dataset excede 1TB? Si sí, particionado es obligatorio para rendimiento y coste
- ¿Se ha medido el skew de datos? ¿El 20% de las particiones recibe 80% del tráfico?
Acción: Analizar query patterns últimos 30 días, identificar columnas en WHERE clauses, diseñar particiones antes de implementar.
Establecer modelo de consistencia
- Para cada caso de uso crítico: ¿Qué lag de datos es aceptable? (segundos/minutos/horas)
- ¿Existen requisitos regulatorios de auditoría que exijan consistencia fuerte?
- ¿La aplicación puede manejar consistencia eventual? (ej: retry logic, idempotencia)
- ¿Se ha educado a stakeholders sobre trade-offs entre consistencia y latencia?
Acción: Documentar SLA de consistencia por caso de uso en el registro de decisiones arquitectónicas (ADR).
Analítica en tiempo real: justificar la complejidad
- ¿Existe un business case cuantificado para latencia sub-minuto? (ej: “reducir fraude $X/mes”)
- ¿El equipo tiene expertise en streaming (Kafka, Flink)? Si no, ¿presupuesto para hiring/training?
- ¿Se ha considerado alternativa near-real-time (minutos) que puede resolver 80% del valor con 20% del esfuerzo?
- ¿Infraestructura actual soporta streaming (ej: Kafka con retención, feature store)?
Acción: Si business case < $100K valor anual, considerar la arquitectura más simple primero. Iterar a streaming solo si se valida la necesidad.
Monitoreo y observabilidad
- ¿Se mide la latencia transaccional por percentiles (p50, p99, p99.9)?
- ¿Existen alertas cuando la latencia OLTP excede el SLA durante queries analíticos?
- ¿Se rastrea el query performance en OLAP (queries lentos, escaneo de datos, coste)?
- ¿Dashboard de salud que compare carga OLTP vs OLAP en tiempo real?
Acción: Implementar dashboards básicos de latencia y throughput en la primera semana. Expandir con query analysis en el mes 1.
Caso práctico: rediseño arquitectónico de una fintech
Contexto inicial
Empresa: Fintech de préstamos personales, 500K usuarios activos, 2M transacciones/mes
Problema:
- Base de datos PostgreSQL monolítica manejando OLTP y reportes
- Equipo de BI ejecuta queries complejos que causan picos de CPU
- La aplicación experimenta timeouts durante horas de pico de reportes (9-11 AM)
- p99 latencia transaccional degradada de 15ms a 300ms durante las ventanas analíticas
Métricas baseline:
- RDS PostgreSQL db.r5.4xlarge: $3,200/mes
- CPU promedio: 45%, picos de 95% durante reportes
- Quejas de clientes sobre lentitud: ~150/semana
Arquitectura propuesta
Fase 1 (Mes 1-2): Quick win con réplica de lectura
[App] → [RDS Primary (OLTP)]↓ (async replication)[Read Replica] → [Metabase (BI)]
Resultado:
- CPU en primary redujo a 30% promedio
- p99 latency recuperó a 18ms
- Quejas bajaron a ~40/semana
- Coste adicional: $3,200/mes (réplica)
Limitación identificada:
Las queries analíticas seguían tardando 20-60 segundos en la réplica debido al esquema normalizado y falta de índices analíticos.
Fase 2 (Mes 3-5): Implementar data warehouse con transformaciones
[RDS Primary] → Debezium CDC → Kafka → Snowflake
↓
dbt transformations
↓
Star schema
↓
Looker (BI)
Implementación:
- Deploy Debezium connector para capturar cambios de tablas críticas.
- Kafka managed (Confluent Cloud) como buffer
- Snowflake como warehouse con auto-scaling
- dbt models para transformar a esquema estrella:
- fact_loans: tabla central con métricas
- dim_customer: dimensión cliente desnormalizada
- dim_product: dimensión producto
- dim_date: dimensión temporal
-
Código dbt ejemplo:
-- models/marts/fact_loans.sql
{{ config(materialized='incremental', unique_key='loan_id') }}
SELECT
l.loan_id,
l.customer_id,
l.product_id,
l.application_date,
l.approval_date,
l.disbursement_date,
l.amount,
l.interest_rate,
l.term_months,
l.status,
c.segment as customer_segment,
c.credit_score_bucket,
c.region,
p.product_name,
p.product_category
FROM {{ source('postgres', 'loans') }} l
LEFT JOIN {{ ref('dim_customer') }} c ON l.customer_id = c.customer_id
LEFT JOIN {{ ref('dim_product') }} p ON l.product_id = p.product_id
{% if is_incremental() %}
WHERE l.updated_at > (SELECT MAX(updated_at) FROM {{ this }})
{% endif %}
Resultado Fase 2:
- Queries analíticos complejos: de 30-60s → 2-8s (7x mejora)
- Lag de datos: 3-5 minutos (aceptable para reportes ejecutivos)
- BI team ahora hace queries ad-hoc sin miedo a impactar en producción
- Coste incremental: Kafka $400/mes + Snowflake $2,800/mes + dbt Cloud $300/mes
Fase 3 (Mes 6-8): Analítica operacional para detección de fraude
Requisito nuevo: Detectar solicitudes de préstamo fraudulentas en < 10 segundos para intervención manual.
Arquitectura añadida:
[Kafka (ya existente)] → Flink Job → Redis (features) → Modelo ML → Alert System
Features calculados en tiempo real:
- Número de aplicaciones del mismo IP última hora
- Varianza en monto solicitado vs histórico usuario
- Velocidad de cambios en información personal
Resultado:
- Fraude detectado bajó tiempo promedio de detección de 48 horas → 8 segundos
- Ahorro estimado: $450K/año en préstamos fraudulentos
- Coste infraestructura streaming: $1,200/mes (Flink en EKS + Redis)
Balance económico final
Antes de rediseño:
- Coste mensual: $3,200 (RDS)
- Pérdida fraude estimada: $60K/mes
- Productividad BI limitada
Después de rediseño (todas las fases):
- Coste mensual: $11,100 (RDS primary $3,200 + réplica $3,200 + Kafka $400 + Snowflake $2,800 + Flink/Redis $1,200 + dbt $300)
- Pérdida fraude estimada: $22K/mes (reducción $38K/mes)
- ROI directo: $38K - $7,900 (coste incremental) = $30K/mes positivo
- ROI indirecto: BI team 3x más productivo, decisiones más ágiles, mejor experiencia cliente
Lecciones aprendidas:
- Empezar con quick wins (réplica lectura) genera momentum
- No saltar directo a arquitectura compleja; iterar según el valor demostrado
- Analítica en tiempo real justificada solo cuando el business case es claro ($450K/año justifica $14K/año coste)
- Change management es crítico: entrenar BI team en dbt y Looker llevó 2 meses
Criterios de selección de software
Al evaluar tecnologías para tu arquitectura OLTP/OLAP, considera estos factores:
Para bases de datos OLTP
Consistencia y durabilidad:
- ¿Soporta transacciones ACID completas?
- ¿Qué garantías ofrece en fallos de nodo? (RPO = 0 requiere replicación síncrona)
- ¿Compatibilidad con estándares (PostgreSQL wire protocol, MySQL)?
Escalabilidad:
- ¿Escala verticalmente hasta qué punto? (most RDBMS)
- ¿Soporta sharding nativo? (CockroachDB, Vitess, Citus)
- ¿Qué complejidad operacional introduce el escalado horizontal?
Ecosistema y operaciones:
- ¿Herramientas de backup/restore maduras?
- ¿Managed service disponible? (RDS, Cloud SQL, Azure Database)
- ¿Comunidad activa y documentación?
Alternativas a considerar:
- PostgreSQL: Gold standard para OLTP, extensible, open-source
- MySQL: Ampliamente adoptado, buen rendimiento para lecturas
- CockroachDB: Distribuido nativo, PostgreSQL-compatible, consistencia fuerte global
- Amazon Aurora: MySQL/PostgreSQL compatible, scalado automático, excelente managed service
Para bases de datos OLAP
Rendimiento de queries:
- ¿Almacenamiento columnar nativo?
- ¿Soporta particionado y clustering?
- ¿Vectorización de queries y compilación JIT?
Escalabilidad y coste:
- ¿Modelo de pricing? (storage + compute separados ideal)
- ¿Auto-scalado de recursos?
- ¿Coste por TB escaneado vs procesamiento por hora?
Integración y ecosistema:
- ¿Conectores nativos con herramientas BI populares?
- ¿Soporte para formatos open (Parquet, ORC)?
- ¿Integración con data lakes (S3, ADLS)?
Alternativas destacadas:
- Snowflake: Líder en warehouse gestionado, excelente separación storage/compute, SQL robusto
- BigQuery: Serverless total, pricing por datos escaneados, integración con ecosistema Google
- Databricks SQL: Lakehouse paradigm, excelente para equipos data science + BI
- ClickHouse: Open-source, ultra-rápido para analítica, requiere más gestión operativa
- Amazon Redshift: Maduro, buena integración AWS, pricing predecible
Para analítica en tiempo real
Latencia y throughput:
- ¿Latencia de ingesta? (ms vs segundos)
- ¿Throughput sostenible? (eventos/segundo)
- ¿Latencia de query en percentil 99?
Capacidades de streaming:
- ¿Soporta time-windowing nativo?
- ¿State management para agregaciones?
- ¿Exactly-once semantics?
Operación y costes:
- ¿Complejidad de despliegue y mantenimiento?
- ¿Servicio gestionado disponible y costo?
- ¿Monitoreo y debugging de queries en tiempo real?
Alternativas principales:
- Apache Druid: Sub-segundo queries, time-series nativo, bueno para dashboards real-time
- ClickHouse: Excelente para real-time analytics, requiere expertise
- Apache Pinot: Low-latency OLAP, usado por LinkedIn, Uber
- Rockset: Managed, real-time indexing, SQL familiar
Recursos y lecturas recomendadas
Libros fundamentales
- "Designing Data-Intensive Applications" (Martin Kleppmann): Capítulos 3, 5, 7 son esenciales para entender trade-offs OLTP/OLAP
- "The Data Warehouse Toolkit" (Ralph Kimball): El clásico sobre modelado dimensional
- "Database Internals" (Alex Petrov): Para entender cómo funcionan bases de datos por dentro
Herramientas y frameworks
- dbt (data build tool): https://www.getdbt.com - Transformaciones SQL versionadas
- Apache Kafka: https://kafka.apache.org - Event streaming platform
- Debezium: https://debezium.io - CDC open-source
- Great Expectations: https://greatexpectations.io - Data quality testing
Conclusión
La decisión entre arquitecturas OLTP y OLAP no es cuestión de elegir una u otra. Los requisitos modernos de analítica operacional, dashboards en tiempo real y ML inference requieren pensar en un espectro de soluciones híbridas. Sin embargo, los fundamentos permanecen: OLTP optimiza para transacciones precisas y rápidas; OLAP optimiza para análisis complejos sobre volúmenes masivos.
Principios para recordar:
- Separa cargas de trabajo: Ejecutar analítica pesada sobre OLTP es el anti-patrón más costoso y común
- El particionado multiplica la capacidad: Pero solo si la estrategia se alinea con patrones de acceso reales
- La consistencia tiene un precio: Elige el modelo más débil que satisfaga los requisitos de negocio
- "Tiempo real" no es gratis: Justifica la complejidad con business case cuantificado antes de invertir en streaming
- Itera arquitectónicamente: Empieza simple (réplica lectura), evoluciona según el valor demostrado (warehouse separado), añade complejidad solo cuando el ROI es claro (HTAP, streaming)
El rol del arquitecto de datos es navegar estos trade-offs con pragmatismo, construyendo sistemas que habilitan el negocio hoy mientras permanecen flexibles para el mañana. La arquitectura perfecta no existe; la arquitectura adecuada es la que balancea necesidades actuales, restricciones de recursos y capacidad organizacional de ejecutar.
En el próximo capítulo exploraremos las profundidades de bases de datos distribuidas, desentrañando los protocolos de consenso, particionado avanzado y trade-offs operacionales que permiten escalar OLTP y OLAP más allá de un solo nodo.
