Pipelines datos tiempo real: Kafka vs Flink vs Spark en 2026
La pregunta que nadie hace: realmente necesitas tiempo real?
Antes de hablar de Kafka, Flink o cualquier otra herramienta, hay una conversación que la mayoría de los equipos se saltan: definir qué significa “tiempo real” para su caso de uso concreto. Hemos visto a demasiados equipos invertir meses en arquitecturas de streaming cuando un cron job cada cinco minutos resolvía su problema perfectamente.
La distinción que usamos internamente es la siguiente:
- Batch: procesamiento por lotes, típicamente cada hora o cada día. Válido para reporting, ETL clásico, reconciliaciones contables.
- Near-real-time: latencia de segundos a pocos minutos. Cubre el 80% de los casos que la gente llama “tiempo real”. Dashboards operativos, sincronización entre sistemas, alertas de negocio.
- Real-time estricto: latencia sub-segundo. Detección de fraude, pricing dinámico, sistemas de trading, actualización de inventario en eventos de alta demanda.
En nuestra experiencia con clientes de logística, hospitality y retail, la mayoría de los requisitos caen en near-real-time. Y la diferencia de complejidad operativa entre near-real-time y real-time estricto es enorme. Un pipeline basado en micro-batches con Spark Structured Streaming o incluso con polling inteligente es orden de magnitud más sencillo de operar que un pipeline de Kafka Streams con exactly-once semantics.
La recomendación es directa: empieza por el nivel de latencia más alto que tu negocio tolere. Escala hacia abajo solo cuando tengas datos que demuestren que lo necesitas.
Benchmarks de stack: latencia vs coste (desde producción)
La tabla siguiente resume mediciones tomadas en tres despliegues de producción durante 2025-2026. Las cifras son p50/p99 extremo a extremo: escritura del productor confirmada → evento duradero en el broker → consumidor lo ha procesado. Los costes corresponden a eu-west-1 (Irlanda) con precios on-demand de AWS en 2026-Q1 e incluyen cómputo, almacenamiento EBS y transferencia de datos entre zonas. La “complejidad operativa” es una estimación aproximada en puntos FTE, es decir, la fracción de una jornada completa de SRE que un equipo maduro debería presupuestar para mantener el stack en estado estable.
| Stack | Caso de uso | Latencia p50 | Latencia p99 | Throughput / nodo | $/TB procesado (media 1a) | Complejidad operativa |
|---|---|---|---|---|---|---|
| Kafka + Flink (auto-gestionado) | ETL de alto throughput, joins stateful | 80 ms | 350 ms | 250k eventos/s | $42 | Alta (5-7 pts FTE ops) |
| Kafka + Spark Structured Streaming | Batch + stream mixto, pipelines BI | 120 ms | 600 ms | 180k eventos/s | $48 | Media-alta |
| Kinesis + Lambda | Cargas intermitentes, baja carga ops | 200 ms | 1 800 ms | 100k eventos/s | $115 | Baja (gestionado) |
| Pulsar + Flink (auto-gestionado) | Multi-tenant, geo-distribuido | 90 ms | 410 ms | 220k eventos/s | $38 | Muy alta |
| MSK + ksqlDB | Prototipado rápido, transformaciones SQL sencillas | 250 ms | 900 ms | 80k eventos/s | $95 | Baja-media |
Varios puntos merecen explicación. Pulsar + Flink tiene el mejor coste por TB en bruto, pero “complejidad operativa muy alta” no es un aviso que deba ignorarse: los clusters Pulsar geo-distribuidos requieren conocimiento profundo de Apache BookKeeper y topología de brokers, y el mercado de profesionales con experiencia real en Pulsar es significativamente más reducido que el de Kafka. El $38/TB solo sale bien si no están pagando medio FTE para mantener el cluster.
Kinesis + Lambda tiene el peor coste por TB porque el modelo de cobro por invocación de Lambda se acumula rápidamente a escala, y el límite de 1 MB/s por shard de escritura implica más shards de los previstos en cuanto el tráfico aumenta. Si se procesan más de 50 GB/día de forma sostenida, conviene reevaluar.
La columna de MSK + ksqlDB refleja que ksqlDB está construido sobre Kafka Streams; cada consulta ksqlDB es, en el fondo, una aplicación Kafka Streams. A pequeña escala esto funciona bien. A gran escala habrá que ajustar directamente el paralelismo y la compactación de state stores, lo que erosiona la ventaja de la interfaz SQL.
Marco de decisión: cuándo gana cada stack
Kafka + Flink (auto-gestionado)
Esta combinación es la elección correcta cuando el throughput supera 100k eventos/s de forma sostenida, los SLOs de latencia están por debajo de 500 ms p99 y la carga incluye lógica stateful: sesionización, joins entre múltiples streams, detección de patrones en ventanas de tiempo. También tiene sentido cuando se necesita control total sobre la asignación de recursos — por ejemplo, fijar Flink task managers a tipos de nodo específicos para co-ubicarlos con pasos de inferencia en GPU.
El prerequisito es madurez operativa. El equipo necesita personas que entiendan el rebalanceo de particiones de Kafka, los backends de estado de Flink (RocksDB para estado grande, heap para estado pequeño) y el ajuste de la JVM para pausas de GC. Con ese nivel de competencia, Kafka + Flink auto-gestionado es el camino más eficiente en coste a alto throughput: $42/TB frente a $95-115 de las alternativas gestionadas. Por debajo de 100k eventos/s o con un equipo sin experiencia en el stack, el coste operativo supera el ahorro económico.
La arquitectura típica combina Kafka con Confluent Schema Registry para control de esquemas, Flink con backend RocksDB para estado keyed grande, y ClickHouse como sink analítico para queries OLAP sub-segundo.
Kafka + Spark Structured Streaming
Es la elección pragmática para organizaciones que ya operan Spark en batch. La transferencia de conocimiento es alta: los ingenieros ya conocen PySpark o Scala DataFrames, y Structured Streaming extiende esa API al procesamiento continuo. El modelo de micro-batches es conceptualmente más sencillo de razonar y depurar.
Structured Streaming encaja cuando la latencia p99 en el rango de 1-3 s es aceptable, cuando el pipeline necesita interoperar con un data lake Spark existente (Delta Lake, Iceberg), o cuando el tamaño del equipo no justifica mantener dos frameworks de procesamiento separados. El salto a Flink se justifica cuando los SLOs bajan de 1 s, cuando se requieren joins complejos en event-time, o cuando las garantías exactly-once deben abarcar varios sistemas externos.
A tener en cuenta: el servicio de shuffle de Spark añade varianza de latencia. Los joins que requieren redistribución de datos entre ejecutores son más lentos que las operaciones equivalentes en Flink. Configura el intervalo de trigger de forma conservadora y monitoriza el shuffle spill a disco.
Kinesis + Lambda
La opción adecuada cuando la organización está comprometida con AWS, la carga operativa es la restricción principal y el patrón de tráfico es intermitente más que sostenido. Lambda escala a cero entre ráfagas y absorbe picos sin capacidad pre-aprovisionada. El modelo de shards es fácil de comprender para equipos sin experiencia en streaming.
Los límites que hay que conocer antes de comprometerse: 1 MB/s de throughput de escritura por shard y 2 MB/s de lectura por shard. Con 5 eventos/s de media y picos de 500 eventos/s, un shard es suficiente. Con 50k eventos/s sostenidos a 1 KB cada uno, se necesitan 50 shards a $0,015/shard-hora — unos 540 $/mes solo en shards, antes del cómputo. En ese punto, conviene evaluar MSK o incluso Kafka auto-gestionado. Kinesis no es eficiente en coste por encima de ~10 GB/día de ingest sostenido.
Los arranques en frío de Lambda añade varianza de latencia. Una función que procesa registros Kinesis en 80 ms en caliente puede tardar 800 ms en frío. Para procesamiento con requisitos de latencia, configurar concurrencia provisionada o usar Lambda con Kinesis enhanced fan-out.
Pulsar + Flink (auto-gestionado)
Esta combinación apunta a organizaciones grandes que ejecutan muchos productos de datos aislados sobre infraestructura compartida y necesitan aislamiento por tenant a nivel de broker — algo que Kafka solo logra con clusters separados (costoso) o convenciones estrictas de nombres de topics (frágil operativamente a escala). El modelo multi-tenant de Pulsar con namespaces y cuotas por tenant es una ventaja arquitectónica genuina en ese escenario.
El tiered storage es el otro diferenciador de Pulsar: los topics pueden migrar segmentos antiguos a almacenamiento de objetos (S3, GCS) de forma transparente, lo que hace económicamente viable retener meses o años de historial de eventos. Para casos de uso que necesitan reproducir streams históricos junto con eventos actuales — por ejemplo, pipelines de reentrenamiento de modelos que necesitan 90 días de historial — el tiered storage de Pulsar es más ergonómico que la alternativa de Kafka (Confluent Tiered Storage o una solución personalizada).
La advertencia es real: el modelo operativo es sustancialmente más complejo. Pulsar separa el enrutamiento de mensajes (brokers) del almacenamiento (Apache BookKeeper). Ambas capas requieren ajuste y monitorización. Los operadores con experiencia real en Pulsar son escasos. No subestimar el coste de la curva de aprendizaje.
Lo que desplegamos en producción en abemon
Nuestra recomendación por defecto para nuevas plataformas de datos de clientes ha convergido en AWS MSK (Kafka gestionado) con Apache Flink desplegado en Kubernetes, Confluent Schema Registry para control de esquemas y OpenTelemetry para observabilidad en todo el pipeline.
El razonamiento detrás de MSK frente a Kafka auto-gestionado es directo: para clientes que procesan menos de 500 GB/día, la diferencia entre los 1 800-2 400 $/mes de MSK y el equivalente en EC2 auto-gestionado es de aproximadamente 1 200-1 800 $/mes. Un solo incidente en el que un broker Kafka pierde quórum y requiere recuperación manual puede consumir 8-12 horas de ingeniería. Con un coste de ingeniería totalmente cargado de 150 $/hora, un incidente elimina la ventaja de coste del auto-gestionado durante dos meses. Para clientes a esa escala, asumimos aproximadamente un 15% más de coste de infraestructura a cambio de la previsibilidad operativa de MSK. Revisamos esta decisión cuando se supera el umbral de 1 TB/día, donde la economía cambia de forma significativa a favor de Redpanda auto-gestionado.
Para la capa de procesamiento, Flink en Kubernetes proporciona aislamiento de recursos por pipeline, despliegues reproducibles vía Helm y la posibilidad de co-ubicar pipelines con otras cargas Kubernetes (servicios de inferencia, backends de API) sin gestión separada de clusters. Ejecutamos Flink en modo sesión para desarrollo y en modo aplicación para producción — cada job de producción tiene su propio JobManager, lo que elimina el radio de explosión de un job problemático que tire abajo infraestructura compartida. Backends de estado: heap para pipelines con estado keyed pequeño (menos de 2 GB), RocksDB para todo lo demás.
OpenTelemetry es la capa de observabilidad que estandarizamos en todos los componentes del pipeline. Métricas JMX de Kafka, métricas de Flink, métricas de negocio personalizadas (eventos procesados por transacción, tasa de reconciliación) — todo fluye por el colector OTel hacia Prometheus y se visualiza en Grafana. Esto da a los clientes un panel único en lugar de cuatro sistemas de monitorización separados. Para clientes con Datadog o New Relic existentes, el exportador OTel enruta a su plataforma habitual con fricción mínima.
Una decisión arquitectónica que hemos revisado recientemente: la ubicación del Schema Registry. Inicialmente desplegábamos Confluent Schema Registry como servicio separado. Para clientes con stack 100% AWS, hemos empezado a usar AWS Glue Schema Registry: se integra de forma nativa con MSK, gestiona la autenticación vía IAM sin gestión adicional de tokens y elimina un servicio más que operar. La contrapartida es dependencia del proveedor y opciones de formato de serialización más limitadas (Avro y JSON Schema, sin Protobuf a principios de 2026). Vale la pena para la mayoría de los clientes; no vale si la portabilidad es un requisito duro.
Los pipelines que construimos encajan de forma natural con nuestro trabajo de reconciliación de pagos en tiempo real — las arquitecturas de streaming son con frecuencia la capa de infraestructura subyacente al procesamiento de eventos financieros.
Fallos comunes en producción (y lo que enseñan)
Todo stack de streaming falla en producción tarde o temprano. Estos son seis patrones de fallo que hemos observado directamente en despliegues de clientes, con la lección operativa que cada uno produjo.
Spike de consumer lag sin auto-scaling. El consumer group Kafka de un cliente se quedó 8 horas atrasado durante un pico de tráfico. La lógica de procesamiento era correcta, pero no había auto-scaling basado en lag configurado — solo métricas de CPU y memoria controlaban el horizontal pod autoscaler. Cuando la CPU subió, el backlog ya tenía horas de profundidad y la recuperación llevó seis horas de servicio degradado. Lección: la tasa de crecimiento del consumer lag es la métrica SLO principal para consumidores de streaming, no la CPU ni la memoria. Configurar HPA sobre consumer lag directamente con KEDA (Kubernetes Event-driven Autoscaling) con el escalador de Kafka. Umbrales de escalado a 50k eventos de lag, no al 80% de CPU.
Pausa de GC superior a max.poll.interval.ms. Un consumidor Java con el max.poll.interval.ms por defecto de 5 minutos sufrió una pausa stop-the-world de GC de 6 minutos durante una recolección de heap completa. El coordinador de consumer group de Kafka expiró el consumidor, disparó un rebalanceo y la partición fue reasignada en mitad del procesamiento. El consumidor reanudó, reprocesó el mismo batch y el sink de destino recibió registros duplicados — para los que ese sink no estaba diseñado de forma idempotente. Lección: max.poll.interval.ms debe configurarse por encima de la duración de pausa de GC en el peor caso. Perfilar la JVM bajo carga, identificar la pausa de GC en p99.9 y fijar max.poll.interval.ms al menos al doble de ese valor. Mejor: migrar a G1GC o ZGC, que reducen drásticamente el tiempo máximo de pausa, y reducir el tamaño del batch de poll para limitar el tiempo de procesamiento por poll.
Overhead de exactly-once que no merecía la pena. Un diseño inicial de pipeline usaba productores transaccionales Kafka y checkpointing exactly-once de Flink extremo a extremo hacia un sink PostgreSQL. Correcto, pero el throughput era un 22% inferior al equivalente con at-least-once, y el overhead de checkpoint añadía 800 ms a la latencia p99. El sink era una tabla de reporting que soportaba upserts ON CONFLICT DO UPDATE con clave en un ID de evento estable. Cambiamos a entrega at-least-once con upserts idempotentes en el sink — el resultado fue semánticamente idéntico (sin duplicados visibles para los consumidores), 22% más de throughput y latencia p99 por debajo de 200 ms. Lección: la coordinación exactly-once es costosa; at-least-once más un sink idempotente consigue el mismo comportamiento observable para la mayoría de los casos de uso.
Incompatibilidad de schema rompiendo un consumidor en silencio. Un equipo de productores desplegó un cambio de schema — renombraron un campo y añadieron un nuevo campo requerido sin valor por defecto. El schema registry rechazó el cambio bajo las reglas de compatibilidad backward, así que cambiaron el modo de compatibilidad del subject a NONE temporalmente “solo para probar” y olvidaron revertirlo. Un consumidor desplegado dos días después con el schema antiguo empezó a deserializar registros con campos ausentes, substituyó nulos y escribió valores nulos en una columna PostgreSQL con restricción NOT NULL. El consumidor empezó a lanzar excepciones, rutó registros a la DLQ y la DLQ se lleno hasta 2 millones de registros antes de que nadie lo notara — porque el umbral de alerta estaba en 500k. Lección: nunca cambiar el modo de compatibilidad del schema en producción sin una revisión explícita. Configurar alertas de DLQ a 10k registros (o 5 minutos de tasa normal de ingest en DLQ), no en números grandes arbitrarios.
Almacenamiento de checkpoints como cuello de botella. Un job Flink con backend RocksDB hacía checkpoint en S3 cada 60 segundos. El estado creció hasta 120 GB a medida que el equipo añadía operadores nuevos sin revisar el tiempo de vida del estado. La duración del checkpoint pasó de 8 segundos a 4 minutos, lo que superaba el intervalo de checkpoint — Flink empezó a encolar checkpoints y finalmente falló el job cuando se alcanzó el número máximo de checkpoints concurrentes. El job tuvo que reiniciarse desde el último checkpoint completo, perdiendo 4 minutos de procesamiento. Lección: monitorizar la duración de checkpoint de Flink como métrica de primer nivel y alertar cuando supere el 50% del intervalo de checkpoint. Implementar TTL de estado en todo estado keyed para acotar el tamaño del estado. Para estado grande, considerar checkpoints incrementales (RocksDB los soporta de forma nativa en Flink) que solo guardan el estado modificado en lugar de instantáneas completas.
Partición de red provocando duplicación de topics internos. Durante un evento de evicción de nodo Kubernetes, una aplicación Kafka Streams fue reiniciada en mitad de su ejecución. Los topics internos de repartición de la aplicación — que Kafka Streams crea automáticamente con una convención de nombres basada en hash — fueron recreados con un número diferente de particiones porque la configuración de la aplicación había cambiado entre despliegues (un cambio en el número de stream threads). Los topics antiguos no se limpiaron. Durante seis horas, dos conjuntos de topics de repartición coexistieron con datos distintos, y los resultados de agregación eran parcialmente correctos — el peor tipo de fallo de calidad de datos, porque supera las comprobaciones básicas de sanidad. Lección: tratar la configuración de topics internos de Kafka Streams como estado de infraestructura. Versionarla, validarla antes del despliegue y construir automatización de limpieza para topics internos huérfanos.
Arquitecturas y herramientas que funcionan en producción
Una vez confirmado que necesitas streaming real, el stack se articula en tres capas: ingestión, procesamiento y entrega.
Ingestión
Apache Kafka sigue siendo el estándar de facto para ingestión de eventos. Es robusto, tiene un ecosistema enorme y la comunidad es activa. Su principal desventaja es la complejidad operativa: gestionar un cluster de Kafka en producción requiere conocimiento profundo de ZooKeeper (o KRaft en versiones recientes), particionamiento, replicación y retention policies.
Redpanda ha emergido como alternativa seria. Compatible con la API de Kafka pero escrito en C++, sin dependencia de ZooKeeper y con latencias más bajas. Para equipos que empiezan de cero, es una opción que merece consideración. En proyectos recientes con clientes de retail, hemos migrado de Kafka a Redpanda reduciendo costes de infraestructura un 40% sin cambios en el código de los productores y consumidores.
Change Data Capture (CDC) con Debezium es el patrón que más impacto tiene en la práctica. En lugar de instrumentar cada aplicación para publicar eventos, Debezium lee el log de transacciones de la base de datos (binlog en MySQL, WAL en PostgreSQL) y los publica como eventos en Kafka. Es no-invasivo, captura todas las mutaciones y respeta el orden transaccional. Lo hemos usado extensivamente para sincronizar sistemas de gestión de almacenes con plataformas de ecommerce sin modificar ninguna de las aplicaciones existentes.
Procesamiento
Apache Flink es la herramienta más completa para procesamiento de streams. Soporta event time processing, ventanas complejas, estado gestionado y exactly-once semantics. La curva de aprendizaje es pronunciada, pero para casos que requieren agregaciones sobre ventanas de tiempo, joins entre streams o lógica de negocio compleja, no tiene rival real.
Spark Structured Streaming es la opción pragmática cuando el equipo ya conoce Spark. El modelo de micro-batches es conceptualmente más simple y cubre la mayoría de los casos de near-real-time. Si tu latencia objetivo es de segundos, no de milisegundos, Spark Structured Streaming es una elección sólida.
Para pipelines más sencillos, Kafka Streams o incluso consumidores directos con libkafka son suficientes. No todo pipeline necesita un framework de procesamiento distribuido.
Entrega
El destino determina la arquitectura. Bases de datos analíticas como ClickHouse o Apache Druid para queries OLAP en tiempo real. Elasticsearch para búsqueda. Redis para caches calientes. Data warehouses como BigQuery o Snowflake vía micro-batches. La clave es que el pipeline de entrega sea idempotente: si un mensaje se procesa dos veces, el resultado debe ser idéntico.
Calidad de datos en streaming
La calidad de datos en batch ya es difícil. En streaming es significativamente más compleja porque pierdes la capacidad de “reprocesar todo desde cero” de forma trivial.
Schema evolution es el primer problema serio. Los eventos cambian de estructura con el tiempo. Sin un registro de schemas (Confluent Schema Registry, Apicurio), los cambios incompatibles rompen consumidores silenciosamente. Nuestra recomendación: usa Avro o Protobuf como formato de serialización, registra todos los schemas, y establece reglas de compatibilidad (backward compatible como mínimo). JSON sin schema es aceptable solo para prototipos. El control de calidad de datos en streaming es una extensión natural de la gobernanza de datos que toda organización debería tener establecida.
Late arrivals son inevitables en sistemas distribuidos. Un evento generado a las 14:00 puede llegar a las 14:05 por latencia de red, buffering del productor o reintentos. Si tu pipeline agrega datos en ventanas de tiempo, necesitas definir watermarks y políticas de manejo de eventos tardíos. Flink lo maneja nativamente con event time y watermarks. Ignorar este problema produce métricas incorrectas que nadie detecta hasta que alguien revisa manualmente. Para un caso concreto de cómo la tolerancia de latencia se aplica en contextos financieros, véase nuestra guía de reconciliación de pagos en tiempo real.
Exactly-once semantics es el santo grial del streaming. En la práctica, exactly-once end-to-end requiere transacciones coordinadas entre el broker y el sistema de destino. Kafka soporta transacciones internas, y Flink puede coordinarlas con checkpoints. Pero la realidad es que la mayoría de los sistemas se diseñan para at-least-once con idempotencia en el consumidor. Es más simple, más robusto y cubre el 95% de los casos.
Observabilidad para pipelines
Un pipeline de datos sin observabilidad es una caja negra que funciona hasta que deja de funcionar, normalmente en el peor momento posible.
Las métricas críticas son:
- Consumer lag: la diferencia entre el último evento producido y el último consumido. Es el indicador más importante de la salud del pipeline. Un lag creciente significa que el consumidor no puede mantener el ritmo de producción. Alertar cuando supere un umbral que depende de tu SLA de latencia.
- Throughput: eventos por segundo en cada etapa del pipeline. Permite detectar cuellos de botella y planificar capacidad.
- Error rate: porcentaje de eventos que fallan en procesamiento. Debe estar cerca de cero. Cualquier incremento requiere investigación inmediata.
- Dead letter queues (DLQ): los eventos que no se pueden procesar se envían a una cola separada para investigación posterior. Monitorizar el tamaño de la DLQ y tener procesos para reprocesar eventos corregidos.
Grafana con Prometheus es la combinación habitual para dashboards y alertas. Burrow es una herramienta específica para monitorizar consumer lag en Kafka. Si usas Flink, su dashboard nativo proporciona visibilidad sobre backpressure, checkpoints y throughput por operador.
Otro patrón que aplicamos sistemáticamente es la generación de eventos sintéticos de control. Un productor envía un evento conocido cada minuto, y un monitor al final del pipeline verifica que llega dentro del SLA. Es un health check end-to-end que detecta problemas que ninguna métrica individual captura.
Guía de implementación práctica
Para equipos que inician su primer pipeline en tiempo real, esta es la secuencia que recomendamos:
Semana 1-2: Prueba de concepto. Despliega Redpanda o Kafka en un entorno de desarrollo. Configura un productor sencillo (puede ser un script que lea de una base de datos) y un consumidor que escriba en un archivo o base de datos. El objetivo es entender el modelo de producción-consumo, particionamiento y offsets.
Semana 3-4: CDC y primer pipeline real. Configura Debezium sobre una base de datos existente. Selecciona una tabla con volumen moderado y cambios frecuentes. Implementa un consumidor que transforme y cargue los datos en un destino analítico. Este es tu primer pipeline útil.
Semana 5-6: Observabilidad. Instrumenta métricas de lag, throughput y errores. Configura alertas. Establece la DLQ. Sin este paso, no tienes un pipeline de producción; tienes un prototipo con suerte.
Semana 7-8: Hardening. Schema registry, tests de integración, runbooks para incidentes comunes (consumer lag alto, broker caído, schema incompatible), y documentación de arquitectura.
Esta secuencia deliberadamente no empieza con Flink ni con procesamiento complejo. La mayoría de los equipos obtienen valor enorme con CDC + consumidores simples antes de necesitar un framework de procesamiento de streams. Añade complejidad solo cuando el caso de uso lo demande, no antes.
En abemon hemos aplicado esta progresión con clientes que iban de batch nocturno a near-real-time en dos meses, sin reescribir sus aplicaciones existentes. Para una inmersión más profunda en Kafka y Flink aplicados a operaciones logísticas, consulta nuestra guía de implementación Kafka-Flink. Si tu equipo necesita acompañamiento en el diseño y la operación de estos pipelines, nuestro servicio de ingeniería de datos cubre desde la evaluación inicial hasta la operación en producción. La clave no es la tecnología; es la disciplina de medir primero, implementar después y operar siempre.
Fuentes
- Documentación de Confluent Platform — Confluent
- Documentación de Apache Flink — Apache Flink
- Guía de programación Spark Structured Streaming — Apache Spark
- Preguntas frecuentes Amazon Kinesis Data Streams — AWS
- Precios Amazon MSK — AWS
- Documentación de Apache Pulsar — Apache Pulsar
- Rendimiento y escalabilidad de Google Dataflow — Google Cloud
- Datadog State of Stream Processing 2024 — Datadog
Preguntas frecuentes
- Kafka vs Pulsar vs Kinesis en 2026: cuál elegir?
- Kafka (o Redpanda) es la opción por defecto para equipos que controlan su propia infraestructura: mayor ecosistema, mejor tooling, probado a cualquier escala. Pulsar tiene ventajas reales en multi-tenancy y tiered storage para organizaciones grandes con muchos pipelines aislados en clusters compartidos; fuera de ese caso, la complejidad operativa no compensa. Kinesis es la elección correcta solo cuando el stack es 100% AWS y se quiere cero carga operativa; el límite de retención de 7 días y 1 MB/s por shard se queda corto antes de lo esperado.
- Cuándo usar Flink en lugar de Spark Structured Streaming?
- Usa Flink cuando necesites procesamiento en event-time con baja latencia (sub-segundo), lógica stateful compleja (detección de patrones, session windows) o garantías exactly-once entre sistemas. Spark Structured Streaming es la elección pragmática cuando el equipo ya opera Spark, la latencia en pocos segundos es aceptable y se quieren reutilizar competencias existentes; cubre el 80% de las cargas near-real-time. El punto de inflexión es cuando el SLO baja de 1 segundo o la lógica de ventanas implica joins entre múltiples streams.
- Qué latencia extremo a extremo puedo esperar de forma realista?
- Con Kafka + Flink en hardware dedicado: p50 < 50 ms, p99 < 200 ms es alcanzable de forma consistente. Con MSK + Flink en Fargate: suma 50-100 ms por saltos de red adicionales. Con Spark Structured Streaming en modo micro-batch (intervalo 500 ms): p99 en el rango de 1-3 s. Kinesis + Lambda: 500 ms-2 s según la ventana de batch. Presupuesta 50-150 ms adicionales por cada consulta de enriquecimiento externo (Redis, Postgres) en el hot path.
- Cómo dimensiono un cluster Kafka para un throughput determinado?
- Fórmula de partida: (eventos/s pico x tamaño medio evento x factor de replicación) / throughput de disco por broker. Para 100 K eventos/s a 1 KB cada uno con RF=3 necesitas ~300 MB/s de escritura; dos o tres brokers m6i.2xlarge lo cubren con holgura. Añade un 20% de margen para rebalanceos y catch-up de consumidores. Particiones: apunta a 1-4 particiones por thread de consumidor, con un techo de 200 particiones por broker antes de que la complejidad operativa se dispare. Monitoriza saturación de I/O de disco y ancho de banda de red antes que CPU.
- ksqlDB está listo para producción en 2026?
- Sí, para casos bien definidos: filtrado, transformaciones ligeras, agregaciones simples y enrutamiento de eventos CDC. No es la herramienta adecuada para joins stateful complejos, state stores grandes o requisitos de latencia sub-100 ms. La interfaz SQL reduce la barrera para analistas de datos, pero el modelo operativo (Kafka Streams embebido) puede sorprender al ajustar paralelismo o gestionar compactación de estado. Úsalo cuando la simplicidad compense; recurre a Flink cuando la lógica se complica.
- Cuál es la diferencia de coste entre MSK y Kafka auto-gestionado?
- En nuestros despliegues, AWS MSK para un cluster de 3 brokers gestionando ~100 K eventos/s cuesta 1 800-2 400 $/mes incluyendo almacenamiento y transferencia de datos. Kafka auto-gestionado equivalente en EC2 (3 x m6i.2xlarge + EBS) cuesta 500-700 $/mes. La prima de 3-4x de MSK incluye parcheo automatizado, reemplazo de brokers e integración con CloudWatch. Para equipos sin experiencia específica en Kafka, MSK suele amortizarse en horas de incidencias evitadas. Para equipos con madurez operativa, Redpanda auto-gestionado en Kubernetes reduce más los costes.
- Cómo gestiono exactly-once semantics entre Kafka y una base de datos externa?
- El exactly-once distribuido verdadero requiere que el sink participe en el protocolo de transacciones de Kafka, lo que la mayoría de bases de datos no soportan de forma nativa. El patrón práctico: usa checkpointing de Flink con productores Kafka exactly-once, y diseña todas las escrituras al sink como upserts idempotentes con una clave derivada de un ID de evento determinístico. Esto da exactly-once efectivo a nivel de aplicación sin la sobrecarga de transacciones distribuidas. Para sinks en PostgreSQL, ON CONFLICT DO UPDATE con una clave primaria estable derivada del evento es la implementación estándar.
- Qué stack de monitorización funciona mejor para pipelines de streaming?
- Prometheus + Grafana es la base para métricas del broker (JMX exporter para Kafka, métricas nativas para Redpanda), consumer lag (Burrow para Kafka, nativo para Redpanda) y métricas de jobs Flink (vía Flink Prometheus reporter). Añade alertas sobre: tasa de crecimiento del consumer lag (no solo valor absoluto), tasa de eventos en DLQ, duración de checkpoints (Flink) y latencia sintética extremo a extremo. El patrón canario sintético, un evento conocido inyectado cada 60 segundos y verificado en el sink, detecta fallos sistémicos que ninguna métrica individual captura.
Fuentes
- Confluent — Documentación de Confluent Platform
- Apache Flink — Documentación de Apache Flink
- Apache Spark — Guía de programación Spark Structured Streaming
- AWS — Preguntas frecuentes Amazon Kinesis Data Streams
- AWS — Precios Amazon MSK
- Apache Pulsar — Documentación de Apache Pulsar
- Google Cloud — Rendimiento y escalabilidad de Google Dataflow
- Datadog — Datadog State of Stream Processing 2024
