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!
· 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.