Searching...
miércoles, 18 de diciembre de 2019

¿Que API de Kafka debo usar en mi Caso de Uso?

El aprendizaje de Kafka es complicado. Aunque el núcleo de Kafka se mantenga bastante estable con el tiempo, los frameworks que envuelven a Kafka se mueven muy rápido.

Hace unos años era muy fácil razonar sobre Kafka: Productores y consumidores. Ahora también tenemos Kafka Connect, Kafka Streams y KSQL en la colección. ¿Reemplazan la API del consumidor o productor o las complementan?

¡Vamos a darle sentido a todo!


Se pueden identificar 5 tipos de cargas de trabajo en Apache Kafka y, cada una puede corresponder a una API específica:

· Kafka Producer API: aplicaciones que producen datos directamente (por ejemplo: clickstream, logs, IoT).

· Kafka Connect Source API: aplicaciones que enlazan entre un almacén de datos que no controlamos y Kafka (por ejemplo, CDC, Postgres, MongoDB, Twitter, REST API).

·  Kafka Streams API / KSQL: aplicaciones que desean consumir desde Kafka y producir de nuevo en Kafka, también llamado procesamiento de streaming. Usa KSQL si crees que puedes escribir tu trabajo en tiempo real como SQL, usa la API de Kafka Streams si crees que vas a necesitar escribir una lógica compleja para tu trabajo.

·  Kafka Consumer API: lee un flujo y realiza acciones en tiempo real sobre el mismo (por ejemplo, para enviar un correo electrónico ...).

·  Kafka Connect Sink API: lee un flujo y lo guarda en un almacén de destino (por ejemplo: Kafka a S3, Kafka a HDFS, Kafka a PostgreSQL, Kafka a MongoDB, etc.)

Es posible que quieras hacer las cosas de manera diferente, y es posible que consigas que funcionen. Por ejemplo, las APIs de Kafka Consumer y Kafka Connect Sink son bastante intercambiables, si estás dispuesto a escribir una gran cantidad de código personalizado para tus necesidades.

En general, las pautas anteriores deberían ayudarte a lograr los flujos de trabajo más eficientes con la menor cantidad de código y frustración.

Kafka Producer API

Ventajas

La API Kafka Producer es extremadamente simple de usar: envía datos, es asíncrona y recibes una devolución de llamada. Esto es perfectamente adecuado para aplicaciones que emitan directamente flujos de datos como logs, flujos de clics, IoT.

Es muy común usar este tipo de API en combinación con un Proxy.

Limitaciones

La API Kafka Producer se puede ampliar y desarrollar para hacer muchas más cosas, pero esto requerirá que los ingenieros escriban mucha lógica adicional. El error más grande que veo es que la gente intenta realizar ETL entre una base de datos y Kafka utilizando la API del productor. Aquí hay algunas cosas que no son fáciles de hacer:

·   ¿Cómo rastrear los offsets de origen? (es decir, cómo reanudar adecuadamente tu productor si se detuvo)
·   ¿Cómo distribuir la carga de tu ETL entre muchos productores?

Esto lo haremos mucho mejor usando la API Kafka Connect Source.

Kafka Connect Source API

Ventajas

La API Kafka Connect Source es un framework completo construido sobre la API del productor que fue construido para que los desarrolladores obtuvieran una API más agradable para:

1) distribución de tareas del productor para procesamiento paralelo.

2) mecanismo fácil para reanudar a los productores. El obsequio final es una gran variedad de conectores disponibles que se pueden aprovechar hoy en día para incorporar datos de la mayoría de las fuentes, sin escribir una sola línea de código.

Limitaciones

Si no tienes la oportunidad de encontrar un conector de origen disponible para tu fuente, debido a que estás utilizando un sistema muy exclusivo en tu entorno, tendrás que escribir tu propio conector de origen.

Kafka Consumer API

Ventajas

La API Kafka Consumer es muy simple, funciona utilizando Grupos de consumidores para que tus topics se puedan consumir en paralelo. Aunque debes tener cuidado con algunas cosas, como la gestión de offsets y los commits, así como los reajustes y las restricciones de idempotencia, son realmente fáciles de escribir. Para cualquier tipo de carga de trabajo sin estado, serán perfectos. ¡Piensa, por ejemplo, en las notificaciones!

Limitaciones

Cuando se realiza algún tipo de ETL, los repectores Kafka Connect (Sinks) son más adecuados, ya que evitarán que escribas una lógica complicada contra una fuente de datos externa.

Kafka Connect Sink API

Ventajas

De manera similar a la API Kafka Connect Source, la API Kafka Connect Sink nos permite aprovechar el ecosistema de conectores Kafka existentes para realizar nuestra ETL de streaming sin escribir una sola línea de código. Kafka Connect Sink API está construida sobre la API del consumidor, pero no se ve tan diferente de ella.

Limitaciones

Si el receptor de datos en el que está escribiendo no tiene un conector disponible (todavía), tendrás que escribir un Kafka Connect Sink (o un consumidor, si lo prefieres), y el proceso de depuración puede ser un poco más complicado.

Kafka Streams API

Ventajas

Si quieres introducirte al mundo del procesamiento de streaming, es decir, leer datos de Kafka en tiempo real y, después de procesarlos, volver a escribirlos en Kafka, lo más probable es que te tires de los pelos si utilizas la API Kafka Consumer encadenada con la API Kafka Producer. Afortunadamente, el proyecto Kafka viene con la API Kafka Streams (disponible para Java y Scala), que nos permite escribir un DSL de alto nivel (parecido a un tipo de programación funcional de Apache Spark) o el API de bajo nivel (más parecido a Apache Storm). La API de Kafka Streams requiere que codifiques, pero oculta completamente la complejidad de mantener productores y consumidores, lo que te permite concentrarte en la lógica de tus procesadores de flujo. ¡También viene con joins, agregaciones y capacidades de procesamiento exactly-once!

Limitaciones

Tendrás que escribir algo de código y podría volverse bastante complicado. Hasta hace poco, era difícil probar las aplicaciones Kafka Streams, pero ahora esto se puede lograr usando la biblioteca test-utils. Finalmente, aunque Kafka Streams parezca simple, en realidad es muy pesado en el backend y creará almacenes de estado, probablemente respaldados por topics Kafka. Esto significa que, según lo complicada que sea tu topología, tu clúster Kafka puede tener que comenzar a procesar muchos más mensajes, aunque como beneficio adicional tendrás aplicaciones "sin estado" y totalmente resistentes.

KSQL

Ventajas

KSQL no es directamente parte de la API de Kafka, sino un contenedor sobre Kafka Streams. Todavía vale la pena mencionarlo aquí. Si bien Kafka Streams te permite escribir algunas topologías complejas, requiere un conocimiento sustancial de programación y puede ser más difícil de leer, especialmente para los recién llegados. KSQL quiere abstraer esa complejidad ofreciendo una semántica SQL (no ANSI) que se aproxime más a tu conocimiento actual. Tengo que admitir que es extremadamente tentador de usar y hace que los procesadores de flujo sean muy fáciles de escribir. Recuerda que esto no es SQL en batch sino SQL en streaming, por lo que aparecerán algunas advertencias.

Limitaciones

Si quieres tener transformaciones complejas, explotar arrays o necesitas una función que todavía no esté disponible, a veces tendrá que volver a usar Kafka Streams. La biblioteca se está desarrollando muy rápido, por lo que espero que los espacios en blanco se llenen rápidamente.

Conclusión

Espero que este artículo sea útil para ayudarte a comprender qué API de Kafka será adecuada para tu caso de uso y por qué. Si quieres aprender Kafka (... y Kafka Connect, Streams y más) te recomiendo los cursos en https://kafka-tutorials.com.

¡Feliz aprendizaje!

0 comentarios:

Publicar un comentario

Gracias por participar en esta página.

 
Back to top!