Apache Kafka: Introducción

Última actualización: 04/10/2020

Aprende los aspectos clave del sistema de mensajería para Big Data. En este artículo encontrarás una introducción a Apache Kafka y a algunos de sus componentes básicos y arquitectura.

¿Qué es Apache Kafka?

¿Qué es Apache Kafka?

Apache Kafka originalmente consistía en un sistema de intermediación de mensajes basado en el modelo publicador/subscriptor en el que varios productores y subscriptores pueden leer y escribir. Con el tiempo y la evolución del producto se ha convertido en toda una plataforma de streaming de eventos distribuida. Además también podemos considerarla una herramienta complementaria a las bases de datos, proporcionando garantías ACID.

Apache Kafka surgió en LinkedIn como cola de mensajería para interconectar varios sistemas de forma escalable. En el año 2011 el proyecto entró en la incubadora de la Apache Software Foundation, en la que se graduó como top-level project en el año 2012. Apache Kafka es código abierto, y se distribuye con licencia Apache 2.0.

Kafka proporciona la plataforma para publicar y suscribirse a flujos de eventos y permite almacenar estos eventos de una forma tolerante a fallos, escalable, persistente y con capacidad de replicación.

Además de almacenar estos eventos, la funcionalidad se extiende con la capacidad de procesarlos en tiempo real, a medida que se reciben de múltiples fuentes de datos. Kafka se integra con numerosas tecnologías, de esta forma, permite construir flujos de datos en tiempo real entre distintos sistemas y aplicaciones de manera desacoplada.

Debido a su arquitectura, consigue obtener una baja latencia, escalabilidad horizontal y absorber los picos de carga que pueden ocurrir en el sistema.

Componentes básicos de Apache Kafka

Esquema de APIs en Kafka
Esquema de APIs en Apache Kafka

Los componentes básicos de Apache Kafka se explican a continuación. Además de estos componentes, existen numerosos conectores a fuentes externas de datos: HDFS, JDBC, S3, FTP, Elasticsearch, etc.

Kafka Connect se trata de un framework que proporciona la capacidad de conectar Kafka con sistemas externos para mover datos hacia o desde nuestro clúster. Para usar un conector y agregar datos a Kafka se puede usar un modelo Pull, por ejemplo con JDBC o bien un modelo push como en las herramientas de CDC (Change Data Capture).

Topics

Los Topics en Kafka son las categorías en las que se clasifican los mensajes. Así, podemos entender cada topic como si fuera un flujo de datos.

Particiones

Cada topic está dividido en particiones, que permiten a Kafka distribuir los datos en los nodos conectados. Es la unidad de paralelismo para dotar a Kafka de escalabilidad horizontal. A cada mensaje que se quiere escribir en un topic, se le asigna una clave de partición. Por otro lado, en el caso de que no se le asigne ninguna clave de partición, se asigna de forma aleatoria.

Cada partición tiene un offset asociado. El offset es un identificador incremental asignado a cada mensaje. Con este mecanismo, se puede identificar un mensaje con el nombre del topic que lo contiene, la partición y el offset.

Esquema de particiones en Kafka
Esquema de particiones en Kafka

También es interesante mencionar el concepto de compactación de logs en Kafka. Mediante este mecanismo, periódicamente podemos eliminar los registros con clave null y de esta forma limpiar la partición de datos innecesarios, quedándonos únicamente con el último registro para cada clave.

Replicación

Una réplica en Kafka consiste en realizar una copia de una partición disponible en otro broker. Este mecanismo de replicación permite a Kafka ser tolerante a fallos y asegura que no hay pérdida de datos.

Cuando existen varias réplicas disponibles, una de ellas es elegida como líder, y el resto como seguidores. Las réplicas que siguen al líder y están sincronizadas se marcan como ISR (In Sync Replica). Para que un topic se encuentre en un estado sano, el valor de ISR debe ser igual al factor de replicación.

Productores

Se denominan productores a los clientes conectados a Kafka encargados de publicar mensajes en un broker. Son los responsables de serializar, particionar, comprimir y repartir la carga entre los brokers en función de las particiones.

Consumidores

Los consumidores de Kafka son los clientes conectados suscritos a los topics que consumen los mensajes. Cada consumidor tiene asociado un grupo de consumidores. Kafka garantiza que cada mensaje sólo es leído por un consumidor de cada grupo.

Esquema de productores y consumidores
Esquema de productores y consumidores

Schema Registry Kafka

Schema Registry permite registrar esquemas de datos en formato AVRO o JSON para Kafka sobre un repositorio centralizado. Permite asegurar que los datos se insertan en el topic correspondiente con un esquema concreto para cumplir la especificación y el entendimiento entre productores y consumidores.

Sirve una API REST para acceder al histórico versionado de los esquemas. Además, también proporciona los serializadores de datos necesarios para los clientes de Kafka.

Schema Registry tiene una interfaz de usuario (UI) que permite registrar nuevos esquemas, visualizarlos y comparar sus versiones de una forma sencilla.

Zookeeper en Apache Kafka

Apache Zookeeper es un servicio que ayuda a gestionar sistemas distribuidos como, por ejemplo, Apache Kafka. Ofrece a sistemas externos capacidades de almacenamiento clave-valor, sincronización y registro de nombres, entre otros.

Zookeeper proporciona a Kafka la alta disponibilidad, y Kafka no puede funcionar sin Zookeeper. Entre los nodos de Zookeeper, se elige uno como líder. El resto de nodos del clúster se denominan seguidores, y uno de ellos es elegido como nuevo líder en el caso de que el líder actual tenga un fallo. Generalmente, los clústers de Zookeeper se despliegan con 3 ó 5 nodos.

Zookeeper logo

Para gestionar un clúster de Kafka, Zookeeper almacena información del estado del clúster: detalles de los topics como el nombre, las particiones, las réplicas y los grupos de consumidores.

En el momento en el que Zookeeper detecta que uno de los brokers de Kafka está caído, realiza las siguientes acciones:

  1. Elige un nuevo broker para tomar el lugar del broker caído.
  2. Actualiza los metadatos para la distribución de carga de los productores y los consumidores para que no exista pérdida de servicio.

Tras estas acciones, se pueden volver a escribir y leer mensajes con normalidad.

Apache Kafka como base de datos

Si estamos dudando sobre si es posible reemplazar una base de datos con Apache Kafka, debemos tener en cuenta que cada base de datos del mercado tiene unas características diferentes. Para cada caso de uso se debe elegir la base de datos adecuada que cumpla con nuestros requisitos. Debemos plantear preguntas como cuánto tiempo almacenar los datos, qué estructura deben tener o qué tipo de consultas y con qué frecuencia se van a realizar.

Aunque Kafka se puede usar como una base de datos y proporciona garantías ACID, funciona de forma diferente a otras bases de datos. Puede proporcionar una base de almacenamiento persistente para los eventos y consultas pero no reemplaza a otras bases de datos, y debemos tratarla como una herramienta complementaria. La pregunta que debemos hacernos es: ¿necesitamos otro almacenamiento de datos adicional a Kafka en nuestro sistema?

Kafka no proporciona un lenguaje de consulta similar a otras bases de datos, sino que sirve toda una API de consumidores y productores de mensajes con mucha más funcionalidad. Las aplicaciones clientes son sistemas distribuidos que consultan, procesan y almacenan flujos de datos.

Un concepto que debemos evaluar al crear aplicaciones de Kafka es que pueden contener el estado o ser aplicaciones sin estado. Esta decisión es fundamental al crear microservicios, ya que podemos mantener el estado de la aplicación directamente en Kafka, lo que puede resultar una mejor opción o más sencilla que gestionar el estado en la aplicación.

Siguientes Pasos con Apache Kafka

Otros brókers de mensajería populares:

Con este tutorial, podrás levantar un pequeño clúster de Apache Kafka y aprender los comandos básicos

En esta entrada aprenderás sobre Kafka Streams y KSQL

Si quieres aprender Apache Kafka a fondo y convertirte en experto, no dudes en invertir en tu formación a largo plazo:

Además, a continuación te dejo tres libros recomendados de Apache Kafka:

Preguntas frecuentes de Apache Kafka – FAQ

¿Para qué se usa Apache Kafka?

Apache Kafka se usa como sistema de intermediación de mensajes entre aplicaciones. Varios suscriptores y publicadores externos pueden leer los mensajes almacenados en Kafka y de esta forma abstraer la complejidad asociada al tratamiento de mensajes de la aplicación.

¿Es Apache Kafka una base de datos?

Kafka es un sistema distribuido que trata los datos como un flujo continuo. Aunque cada vez se agrega mayor funcionalidad sobre este sistema no es una base de datos corriente ni tiene los mismos usos ni aplicaciones. Podemos considerar Kafka como una herramienta que puede complementar a una base de datos.

¿Qué es un bróker de Kafka?

Un bróker de Kafka es un nodo con Kafka instalado que forma parte del clúster. Permite a los suscriptores leer mensajes y se comunica con los demás brókers. Para sincronizarse también puede usar Apache Zookeeper.

¿Qué ventajas tiene Apache Kafka?

Apache Kafka permite desacoplar aplicaciones entre sí que necesiten comunicarse mediante paso de mensajes en tiempo real. Es un sistema escalable y con baja latencia, lo que hace una solución ideal para tratar grandes cantidades de datos en sistemas Big Data.

¿Es Kafka un sistema asíncrono?

Kafka permite implementar a las aplicaciones un sistema de comunicación asíncrono con el patrón publicador-subscriptor. Los productores de mensajes no deben esperar a que se consuman para continuar sus operaciones.


¡No te pierdas el vídeo-resumen en 1 minuto!


¡Echa un ojo a mi lista de reproducción de Big Data en Youtube!

Si te ayuda el contenido del blog, por favor considera unirte a la lista de correo para reconocer el trabajo!

Deja una respuesta