Saltar al contenido
Pipelines datos tiempo real: Kafka vs Flink vs Spark en 2026

Pipelines datos tiempo real: Kafka vs Flink vs Spark en 2026

A
abemon
| | Actualizado el 16 de abril de 2026 | 28 min de lectura
Compartir

La pregunta que nadie hace: realmente necesitas tiempo real?

Antes de hablar de Kafka, Flink o cualquier otra herramienta, hay una conversacion que la mayoria de los equipos se saltan: definir que 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 resolvia su problema perfectamente.

La distincion que usamos internamente es la siguiente:

  • Batch: procesamiento por lotes, tipicamente cada hora o cada dia. Valido para reporting, ETL clasico, 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, sincronizacion entre sistemas, alertas de negocio.
  • Real-time estricto: latencia sub-segundo. Deteccion de fraude, pricing dinamico, sistemas de trading, actualizacion de inventario en eventos de alta demanda.

En nuestra experiencia con clientes de logistica, hospitality y retail, la mayoria 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 mas sencillo de operar que un pipeline de Kafka Streams con exactly-once semantics.

La recomendacion es directa: empieza por el nivel de latencia mas alto que tu negocio tolere. Escala hacia abajo solo cuando tengas datos que demuestren que lo necesitas.

Benchmarks de stack: latencia vs coste (desde produccion)

La tabla siguiente resume mediciones tomadas en tres despliegues de produccion 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 computo, almacenamiento EBS y transferencia de datos entre zonas. La “complejidad operativa” es una estimacion aproximada en puntos FTE, es decir, la fraccion de una jornada completa de SRE que un equipo maduro deberia presupuestar para mantener el stack en estado estable.

StackCaso de usoLatencia p50Latencia p99Throughput / nodo$/TB procesado (media 1a)Complejidad operativa
Kafka + Flink (auto-gestionado)ETL de alto throughput, joins stateful80 ms350 ms250k eventos/s$42Alta (5-7 pts FTE ops)
Kafka + Spark Structured StreamingBatch + stream mixto, pipelines BI120 ms600 ms180k eventos/s$48Media-alta
Kinesis + LambdaCargas intermitentes, baja carga ops200 ms1 800 ms100k eventos/s$115Baja (gestionado)
Pulsar + Flink (auto-gestionado)Multi-tenant, geo-distribuido90 ms410 ms220k eventos/s$38Muy alta
MSK + ksqlDBPrototipado rapido, transformaciones SQL sencillas250 ms900 ms80k eventos/s$95Baja-media

Varios puntos merecen explicacion. 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 topologia de brokers, y el mercado de profesionales con experiencia real en Pulsar es significativamente mas reducido que el de Kafka. El $38/TB solo sale bien si no estan pagando medio FTE para mantener el cluster.

Kinesis + Lambda tiene el peor coste por TB porque el modelo de cobro por invocacion de Lambda se acumula rapidamente a escala, y el limite de 1 MB/s por shard de escritura implica mas shards de los previstos en cuanto el trafico aumenta. Si se procesan mas de 50 GB/dia de forma sostenida, conviene reevaluar.

La columna de MSK + ksqlDB refleja que ksqlDB esta construido sobre Kafka Streams; cada consulta ksqlDB es, en el fondo, una aplicacion Kafka Streams. A pequena escala esto funciona bien. A gran escala habra que ajustar directamente el paralelismo y la compactacion de state stores, lo que erosiona la ventaja de la interfaz SQL.

Marco de decision: cuando gana cada stack

Esta combinacion es la eleccion correcta cuando el throughput supera 100k eventos/s de forma sostenida, los SLOs de latencia estan por debajo de 500 ms p99 y la carga incluye logica stateful: sesionizacion, joins entre multiples streams, deteccion de patrones en ventanas de tiempo. Tambien tiene sentido cuando se necesita control total sobre la asignacion de recursos — por ejemplo, fijar Flink task managers a tipos de nodo especificos 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 pequeno) y el ajuste de la JVM para pausas de GC. Con ese nivel de competencia, Kafka + Flink auto-gestionado es el camino mas 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 economico.

La arquitectura tipica combina Kafka con Confluent Schema Registry para control de esquemas, Flink con backend RocksDB para estado keyed grande, y ClickHouse como sink analitico para queries OLAP sub-segundo.

Kafka + Spark Structured Streaming

Es la eleccion pragmatica 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 mas 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 tamano 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 garantias exactly-once deben abarcar varios sistemas externos.

A tener en cuenta: el servicio de shuffle de Spark anade varianza de latencia. Los joins que requieren redistribucion de datos entre ejecutores son mas 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 opcion adecuada cuando la organizacion esta comprometida con AWS, la carga operativa es la restriccion principal y el patron de trafico es intermitente mas que sostenido. Lambda escala a cero entre rafagas y absorbe picos sin capacidad pre-aprovisionada. El modelo de shards es facil de comprender para equipos sin experiencia en streaming.

Los limites 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 computo. En ese punto, conviene evaluar MSK o incluso Kafka auto-gestionado. Kinesis no es eficiente en coste por encima de ~10 GB/dia de ingest sostenido.

Los arranques en frio de Lambda anade varianza de latencia. Una funcion que procesa registros Kinesis en 80 ms en caliente puede tardar 800 ms en frio. Para procesamiento con requisitos de latencia, configurar concurrencia provisionada o usar Lambda con Kinesis enhanced fan-out.

Esta combinacion 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 (fragil operativamente a escala). El modelo multi-tenant de Pulsar con namespaces y cuotas por tenant es una ventaja arquitectonica 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 economicamente viable retener meses o anos de historial de eventos. Para casos de uso que necesitan reproducir streams historicos junto con eventos actuales — por ejemplo, pipelines de reentrenamiento de modelos que necesitan 90 dias de historial — el tiered storage de Pulsar es mas ergonomico que la alternativa de Kafka (Confluent Tiered Storage o una solucion personalizada).

La advertencia es real: el modelo operativo es sustancialmente mas complejo. Pulsar separa el enrutamiento de mensajes (brokers) del almacenamiento (Apache BookKeeper). Ambas capas requieren ajuste y monitorizacion. Los operadores con experiencia real en Pulsar son escasos. No subestimar el coste de la curva de aprendizaje.

Lo que desplegamos en produccion en abemon

Nuestra recomendacion 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 detras de MSK frente a Kafka auto-gestionado es directo: para clientes que procesan menos de 500 GB/dia, 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 quorum y requiere recuperacion manual puede consumir 8-12 horas de ingenieria. Con un coste de ingenieria 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% mas de coste de infraestructura a cambio de la previsibilidad operativa de MSK. Revisamos esta decision cuando se supera el umbral de 1 TB/dia, donde la economia 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 via Helm y la posibilidad de co-ubicar pipelines con otras cargas Kubernetes (servicios de inferencia, backends de API) sin gestion separada de clusters. Ejecutamos Flink en modo sesion para desarrollo y en modo aplicacion para produccion — cada job de produccion tiene su propio JobManager, lo que elimina el radio de explosion de un job problemático que tire abajo infraestructura compartida. Backends de estado: heap para pipelines con estado keyed pequeno (menos de 2 GB), RocksDB para todo lo demas.

OpenTelemetry es la capa de observabilidad que estandarizamos en todos los componentes del pipeline. Metricas JMX de Kafka, metricas de Flink, metricas de negocio personalizadas (eventos procesados por transaccion, tasa de reconciliacion) — todo fluye por el colector OTel hacia Prometheus y se visualiza en Grafana. Esto da a los clientes un panel unico en lugar de cuatro sistemas de monitorizacion separados. Para clientes con Datadog o New Relic existentes, el exportador OTel enruta a su plataforma habitual con friccion minima.

Una decision arquitectonica que hemos revisado recientemente: la ubicacion del Schema Registry. Inicialmente desplegabamos 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 autenticacion via IAM sin gestion adicional de tokens y elimina un servicio mas que operar. La contrapartida es dependencia del proveedor y opciones de formato de serializacion mas limitadas (Avro y JSON Schema, sin Protobuf a principios de 2026). Vale la pena para la mayoria de los clientes; no vale si la portabilidad es un requisito duro.

Los pipelines que construimos encajan de forma natural con nuestro trabajo de reconciliacion 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 produccion (y lo que ensenyan)

Todo stack de streaming falla en produccion tarde o temprano. Estos son seis patrones de fallo que hemos observado directamente en despliegues de clientes, con la leccion operativa que cada uno produjo.

Spike de consumer lag sin auto-scaling. El consumer group Kafka de un cliente se quedo 8 horas atrasado durante un pico de trafico. La logica de procesamiento era correcta, pero no habia auto-scaling basado en lag configurado — solo metricas de CPU y memoria controlaban el horizontal pod autoscaler. Cuando la CPU subio, el backlog ya tenia horas de profundidad y la recuperacion llevo seis horas de servicio degradado. Leccion: la tasa de crecimiento del consumer lag es la metrica 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 recoleccion de heap completa. El coordinador de consumer group de Kafka expiro el consumidor, disparo un rebalanceo y la particion fue reasignada en mitad del procesamiento. El consumidor reanudo, reproceso el mismo batch y el sink de destino recibio registros duplicados — para los que ese sink no estaba disenado de forma idempotente. Leccion: max.poll.interval.ms debe configurarse por encima de la duracion 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 drasticamente el tiempo maximo de pausa, y reducir el tamano del batch de poll para limitar el tiempo de procesamiento por poll.

Overhead de exactly-once que no merecia la pena. Un diseno 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 anadia 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 semanticamente identico (sin duplicados visibles para los consumidores), 22% mas de throughput y latencia p99 por debajo de 200 ms. Leccion: la coordinacion exactly-once es costosa; at-least-once mas un sink idempotente consigue el mismo comportamiento observable para la mayoria 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 anadieron un nuevo campo requerido sin valor por defecto. El schema registry rechazo el cambio bajo las reglas de compatibilidad backward, asi que cambiaron el modo de compatibilidad del subject a NONE temporalmente “solo para probar” y olvidaron revertirlo. Un consumidor desplegado dos dias despues con el schema antiguo empezo a deserializar registros con campos ausentes, substituyo nulos y escribio valores nulos en una columna PostgreSQL con restriccion NOT NULL. El consumidor empezo 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. Leccion: nunca cambiar el modo de compatibilidad del schema en produccion sin una revision explicita. Configurar alertas de DLQ a 10k registros (o 5 minutos de tasa normal de ingest en DLQ), no en numeros grandes arbitrarios.

Almacenamiento de checkpoints como cuello de botella. Un job Flink con backend RocksDB hacia checkpoint en S3 cada 60 segundos. El estado crecio hasta 120 GB a medida que el equipo anadia operadores nuevos sin revisar el tiempo de vida del estado. La duracion del checkpoint paso de 8 segundos a 4 minutos, lo que superaba el intervalo de checkpoint — Flink empezo a encolar checkpoints y finalmente fallo el job cuando se alcanzo el numero maximo de checkpoints concurrentes. El job tuvo que reiniciarse desde el ultimo checkpoint completo, perdiendo 4 minutos de procesamiento. Leccion: monitorizar la duracion de checkpoint de Flink como metrica de primer nivel y alertar cuando supere el 50% del intervalo de checkpoint. Implementar TTL de estado en todo estado keyed para acotar el tamano 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 instantaneas completas.

Particion de red provocando duplicacion de topics internos. Durante un evento de eviccion de nodo Kubernetes, una aplicacion Kafka Streams fue reiniciada en mitad de su ejecucion. Los topics internos de reparticion de la aplicacion — que Kafka Streams crea automaticamente con una convencion de nombres basada en hash — fueron recreados con un numero diferente de particiones porque la configuracion de la aplicacion habia cambiado entre despliegues (un cambio en el numero de stream threads). Los topics antiguos no se limpiaron. Durante seis horas, dos conjuntos de topics de reparticion coexistieron con datos distintos, y los resultados de agregacion eran parcialmente correctos — el peor tipo de fallo de calidad de datos, porque supera las comprobaciones basicas de sanidad. Leccion: tratar la configuracion de topics internos de Kafka Streams como estado de infraestructura. Versionarla, validarla antes del despliegue y construir automatizacion de limpieza para topics internos huerfanos.

Arquitecturas y herramientas que funcionan en produccion

Una vez confirmado que necesitas streaming real, el stack se articula en tres capas: ingestion, procesamiento y entrega.

Ingestion

Apache Kafka sigue siendo el estandar de facto para ingestion 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 produccion requiere conocimiento profundo de ZooKeeper (o KRaft en versiones recientes), particionamiento, replicacion 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 mas bajas. Para equipos que empiezan de cero, es una opcion que merece consideracion. En proyectos recientes con clientes de retail, hemos migrado de Kafka a Redpanda reduciendo costes de infraestructura un 40% sin cambios en el codigo de los productores y consumidores.

Change Data Capture (CDC) con Debezium es el patron que mas impacto tiene en la practica. En lugar de instrumentar cada aplicacion 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 gestion de almacenes con plataformas de ecommerce sin modificar ninguna de las aplicaciones existentes.

Procesamiento

Apache Flink es la herramienta mas 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 logica de negocio compleja, no tiene rival real.

Spark Structured Streaming es la opcion pragmatica cuando el equipo ya conoce Spark. El modelo de micro-batches es conceptualmente mas simple y cubre la mayoria de los casos de near-real-time. Si tu latencia objetivo es de segundos, no de milisegundos, Spark Structured Streaming es una eleccion solida.

Para pipelines mas 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 analiticas como ClickHouse o Apache Druid para queries OLAP en tiempo real. Elasticsearch para busqueda. Redis para caches calientes. Data warehouses como BigQuery o Snowflake via micro-batches. La clave es que el pipeline de entrega sea idempotente: si un mensaje se procesa dos veces, el resultado debe ser identico.

Calidad de datos en streaming

La calidad de datos en batch ya es dificil. En streaming es significativamente mas 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 recomendacion: usa Avro o Protobuf como formato de serializacion, registra todos los schemas, y establece reglas de compatibilidad (backward compatible como minimo). JSON sin schema es aceptable solo para prototipos. El control de calidad de datos en streaming es una extension natural de la gobernanza de datos que toda organizacion deberia 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 politicas de manejo de eventos tardios. Flink lo maneja nativamente con event time y watermarks. Ignorar este problema produce metricas incorrectas que nadie detecta hasta que alguien revisa manualmente. Para un caso concreto de como la tolerancia de latencia se aplica en contextos financieros, vease nuestra guia de reconciliacion de pagos en tiempo real.

Exactly-once semantics es el santo grial del streaming. En la practica, 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 mayoria de los sistemas se disenan para at-least-once con idempotencia en el consumidor. Es mas simple, mas 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 metricas criticas son:

  • Consumer lag: la diferencia entre el ultimo evento producido y el ultimo consumido. Es el indicador mas importante de la salud del pipeline. Un lag creciente significa que el consumidor no puede mantener el ritmo de produccion. 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 investigacion inmediata.
  • Dead letter queues (DLQ): los eventos que no se pueden procesar se envian a una cola separada para investigacion posterior. Monitorizar el tamano de la DLQ y tener procesos para reprocesar eventos corregidos.

Grafana con Prometheus es la combinacion habitual para dashboards y alertas. Burrow es una herramienta especifica para monitorizar consumer lag en Kafka. Si usas Flink, su dashboard nativo proporciona visibilidad sobre backpressure, checkpoints y throughput por operador.

Otro patron que aplicamos sistematicamente es la generacion de eventos sinteticos de control. Un productor envia 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 metrica individual captura.

Guia de implementacion practica

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 produccion-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 analitico. Este es tu primer pipeline util.

Semana 5-6: Observabilidad. Instrumenta metricas de lag, throughput y errores. Configura alertas. Establece la DLQ. Sin este paso, no tienes un pipeline de produccion; tienes un prototipo con suerte.

Semana 7-8: Hardening. Schema registry, tests de integracion, runbooks para incidentes comunes (consumer lag alto, broker caido, schema incompatible), y documentacion de arquitectura.

Esta secuencia deliberadamente no empieza con Flink ni con procesamiento complejo. La mayoria de los equipos obtienen valor enorme con CDC + consumidores simples antes de necesitar un framework de procesamiento de streams. Anade complejidad solo cuando el caso de uso lo demande, no antes.

En abemon hemos aplicado esta progresion con clientes que iban de batch nocturno a near-real-time en dos meses, sin reescribir sus aplicaciones existentes. Para una inmersion mas profunda en Kafka y Flink aplicados a operaciones logisticas, consulta nuestra guia de implementacion Kafka-Flink. Si tu equipo necesita acompanamiento en el diseno y la operacion de estos pipelines, nuestro servicio de ingenieria de datos cubre desde la evaluacion inicial hasta la operacion en produccion. La clave no es la tecnologia; es la disciplina de medir primero, implementar despues y operar siempre.

Fuentes

  1. Documentacion de Confluent Platform — Confluent
  2. Documentacion de Apache Flink — Apache Flink
  3. Guia de programacion Spark Structured Streaming — Apache Spark
  4. Preguntas frecuentes Amazon Kinesis Data Streams — AWS
  5. Precios Amazon MSK — AWS
  6. Documentacion de Apache Pulsar — Apache Pulsar
  7. Rendimiento y escalabilidad de Google Dataflow — Google Cloud
  8. Datadog State of Stream Processing 2024 — Datadog

Preguntas frecuentes

Kafka vs Pulsar vs Kinesis en 2026: cual elegir?
Kafka (o Redpanda) es la opcion 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 eleccion correcta solo cuando el stack es 100% AWS y se quiere cero carga operativa; el limite de retencion de 7 dias y 1 MB/s por shard se queda corto antes de lo esperado.
Cuando usar Flink en lugar de Spark Structured Streaming?
Usa Flink cuando necesites procesamiento en event-time con baja latencia (sub-segundo), logica stateful compleja (deteccion de patrones, session windows) o garantias exactly-once entre sistemas. Spark Structured Streaming es la eleccion pragmatica 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 inflexion es cuando el SLO baja de 1 segundo o la logica de ventanas implica joins entre multiples streams.
Que 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 segun la ventana de batch. Presupuesta 50-150 ms adicionales por cada consulta de enriquecimiento externo (Redis, Postgres) en el hot path.
Como dimensiono un cluster Kafka para un throughput determinado?
Formula de partida: (eventos/s pico x tamano medio evento x factor de replicacion) / 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. Anade 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 saturacion de I/O de disco y ancho de banda de red antes que CPU.
ksqlDB esta listo para produccion en 2026?
Si, 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 compactacion de estado. Usalo cuando la simplicidad compense; recurre a Flink cuando la logica se complica.
Cual 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 integracion con CloudWatch. Para equipos sin experiencia especifica en Kafka, MSK suele amortizarse en horas de incidencias evitadas. Para equipos con madurez operativa, Redpanda auto-gestionado en Kubernetes reduce mas los costes.
Como 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 mayoria de bases de datos no soportan de forma nativa. El patron practico: usa checkpointing de Flink con productores Kafka exactly-once, y disena todas las escrituras al sink como upserts idempotentes con una clave derivada de un ID de evento deterministico. Esto da exactly-once efectivo a nivel de aplicacion sin la sobrecarga de transacciones distribuidas. Para sinks en PostgreSQL, ON CONFLICT DO UPDATE con una clave primaria estable derivada del evento es la implementacion estandar.
Que stack de monitorizacion funciona mejor para pipelines de streaming?
Prometheus + Grafana es la base para metricas del broker (JMX exporter para Kafka, metricas nativas para Redpanda), consumer lag (Burrow para Kafka, nativo para Redpanda) y metricas de jobs Flink (via Flink Prometheus reporter). Anade alertas sobre: tasa de crecimiento del consumer lag (no solo valor absoluto), tasa de eventos en DLQ, duracion de checkpoints (Flink) y latencia sintetica extremo a extremo. El patron canario sintetico, un evento conocido inyectado cada 60 segundos y verificado en el sink, detecta fallos sistemicos que ninguna metrica individual captura.

Fuentes

  1. ConfluentDocumentacion de Confluent Platform
  2. Apache FlinkDocumentacion de Apache Flink
  3. Apache SparkGuia de programacion Spark Structured Streaming
  4. AWSPreguntas frecuentes Amazon Kinesis Data Streams
  5. AWSPrecios Amazon MSK
  6. Apache PulsarDocumentacion de Apache Pulsar
  7. Google CloudRendimiento y escalabilidad de Google Dataflow
  8. DatadogDatadog State of Stream Processing 2024

Sobre el autor

A

abemon engineering

Equipo de ingenieria

Equipo multidisciplinar de ingenieria, datos e IA con sede en Canarias. Construimos, desplegamos y operamos soluciones de software a medida para empresas de cualquier escala.

Síguenos: LinkedIn GitHub