Aprende Apache Kafka: conceptos básicos
Esta semana he estado trabajando con Kafka y como para mí es algo nuevo, quiero profundizar en los conceptos más importantes y compartir contigo estas ideas fundamentales. Destacar que aunque aquí comparto las ideas clave, para aprender a utilizar kafka te recomiendo dos cosas: primero crear un entorno de pruebas donde comprender y afianzar el conocimiento, y por otro lado profundizar en algunos conceptos leyendo libros.
Sobre Apache Kafka hay varios aspectos que quiero aprender:
- Conceptos básicos. Esto es aprender lo esencial: qué es kafka, cuál es la idea que hay detrás, qué principios sigue y qué debes conocer. Este es el punto que voy a tratar en este post.
- Arquitectura. Como ingeniero de plataforma / sre / devops / sysadmin hay que aprender los diferentes sistemas que hay que entender para operar un clúster en producción: kafka, kafka connect, zookeeper. Es cierto que hay ya servicios gestionados como AWS MSK o Confluence por si quieres valorarlos.
- Desarrollo. Hay que conocer las APIs que permiten publicar y consumir los mensajes, y entender cómo estos se estructuran.
Recuerda que todas las empresas se mueven en base a los datos y generan información continuamente. Por eso, saber conseguir la información necesaria, almacenarla y procesarla es importante si quieres tomar decisiones basadas en datos.
Introducción a Kafka
Kafka es un sistema de publicación/consumo de mensajes para distribuir eventos (mensajes en kafka) en tiempo real, y que se distribuyen en lo que se conoce como topics. Fue desarrollado por la empresa LinkedIn ya que les faltaba una pieza que les permitiese gestionar el continuo flujo de datos (eventos), independientemente del almacenamiento clásico de entidades. Posteriormente kafka fue donado a la fundación de apache.
Kafka es un servicio pensado para que escale horizontalmente y sea fiable y resistente a fallos. Algunos casos de uso populares pueden ser comunicación entre microservicios, aplicaciones basadas en procesar streaming de datos y pipelines de datos.
Un mensaje es la unidad de datos en Kafka. Se parece a lo que puede ser una fila (row) o un record de una base de datos tradicional. Un mensaje se representa como un array de bytes, por lo que no tiene ningún formato específico ni un significado para kafka. Los mensajes pueden tener un key que se utilizará para particionar estos datos. Los mensajes se escriben en batches para optimizar el coste, siendo el tradeoff entre latencia y rendimiento lo que vendrá definido por el tamaño de estos lotes.
Aunque los mensajes no tengan un formato específico para kafka ,se recomienda definir un esquema para que pueda reconocerse fácilmente. Esto se puede hacer mediante JSON o XML. También se recomienda utilizar Apache AVRO ya que tiene diferentes ventajas sobre estos datos.
Un topic almacena de forma persistente los datos en disco y de forma replicada. Un topic puede contener mucha o poca información, y puede retenerla de forma indefinida o de forma temporal (por ejemplo con una política de borrado por tiempo o tamaño). Cada topic contiene una serie de eventos que modelan lo que ocurre en nuestro sistema en tiempo real: por ejemplo un usuario añade un producto al carrito. Los topics sirven para que distintos sistemas se comuniquen entre sí, ya sea consumiendo o publicando eventos.
Los topics se dividen en particiones, en las cuales se escriben los mensajes. Las particiones se utilizan para mejorar la escalabilidad del sistema, repartiéndose en múltiples servidores, de forma que los mensajes se pueden escribir en varias particiones simultáneamente. Kafka garantiza el orden de mensajes dentro de una partición, pero no en un topic con varias particiones. Las particiones se pueden replicar para tener redundancia, de modo que si un broker falla otro pueda convertirse en el líder y recibir las escrituras.
Los productores (producers) escriben en los topics, y los mensajes se reparten entre particiones utilizando el partition key del mensaje. Los consumidores leen mensajes y mantienen la posición del último mensaje que han leído (offset). El offset es un entero que kafka añade a cada mensaje en una partición.
Un grupo de consumidores está formador por uno o más consumidores que, como mínimo consumen de una partición. Un consumidor puede consumir una o más particiones, pero nunca una partición tendrá varios consumidores, y almacenará el último offset que ha procesado.
Arquitectura
Un servidor de kafka se conoce como broker, y un conjunto de brokers forman un clúster de kafka, de forma que si un servidor falla, nuestra información no se pierda y nuestros sistemas sigan estando operativos.
En muchos sistemas tradicionales los cálculos se hacen en procesos batch durante la noche, pero a veces esto deja de ser insuficiente y lo que necesitas es tener información en tiempo real. Para ello, puedes tener dashboards que consumen la información de los topics de kafka.
En resumen, kafka es un sistema distribuido que permite la gestión, almacenamiento y procesamiento de mensajes en tiempo real de forma que otros sistemas se comuniquen entre sí en mediante topics, ya sea consumiendo o publicando mensajes, y permitiendo que tengamos información en tiempo real sobre lo que ocurre en nuestro sistema.
Además de esto kafka te permite realizar transformaciones, filtrados etc. y tiene varias APIs como son Kafka Connect y Kafka Streams.
Kafka Connect es una pieza muy importante ya que nos permite tener conectores ya implementados que integra los eventos de kafka con otros sistemas mediante una configuración declarativa. Se suelen dividir en dos categorías:
- Fuentes (sources): se integran con alguna herramienta ya existen y generan eventos de datos. Por ejemplo, los cambios en las entidades que se producen en una base de datos.
- Sumideros (sink): se integran con terceros para emitir la información que entra en un topic. Por ejemplo, escribir la información en almacenamiento persistente como lo es Amazon S3.
Mencionar que Kafka utiliza (y necesita) Apache Zookeeper para almacenar los metadatos del cluster y coordinar los brokers.
Si te ha resultado útil este artículo agradecería si te suscribes a mi newsletter. Recibirás contenido exclusivo de calidad y también me ayudarás enormemente. Cada suscripción apoya el trabajo que realizo y me permite conocer mejor los temas que te interesan, de forma que puedo mejorar los conocimientos que comparto contigo.