De vez en cuando, aunque no utilices una tecnología en tu día a día, conviene experimentar con ella para aprender cómo funciona, y más si hablamos de tecnologías que cada vez tienen un uso más extendido, como puede ser lo relacionado con el Big Data.
En esta ocasión me he pusto a jugar con Apache Kafka. Como no quiero entrar mucho en detalle, ya que existen muchos artículos donde se puede profundizar más en esta tecnología, daré una breve introducción y comentaré unos pocos conceptos básicos para entender qué es Apache Kafka.
Tal y como se define en la propia web, «Apache Kafka es una plataforma de código abierto para la transimisión de eventos distribuidos, empleada para la canalización de datos de alto rendimiento, análisis de la transmisión, integración de datos y aplicaciones de misión crítica«.
Al permitir gestionar de una manera eficiente millones de datos por segundo, es ideal para ser utilizada con el Big Data.
Sus principales características son:
- Permite publicar y suscribirse a flujos de datos, es decir, vamos a poder escribir y leer flujos de datos.
- Permite almacenar ese flujo de datos de forma duradera y fiable durante el tiempo que se desee.
- Permite procesar ese flujo de datos en el mismo momento en el que ocurren (es decir, procesar los datos en tiempo real) o de manera retrospectiva
Kafka funciona como un sistema distribuido que consiste en una serie de servidores y clientes comunicándose entre ellos con un alto rendimiento. Kafka puede formar un cluster de uno o más servidores, cada uno de ellos llamado broker, pudiendo procesar y almacenar una gran cantidad de streams, los cuales pueden estar distribuidos o incluso replicados entre los distintos brokers. Los clientes no son más que aplicaciones o microservicos que leen, escriben y procesan estos flujos de eventos de forma paralela, permitiendo también mantener un sistema tolerante a fallos ante una caida de alguno de los sistemas.
Siguiendo con los conceptos básicos, nos vamos a encontrar con la siguiente terminología:
- Evento: Un evento no es más que el registro de un hecho que ocurre en un momento determinado. Cada evento está compuesto por una key que identifica el evento en cuestión, un value que contiene la información del evento en sí y un timestamp que nos indica el momento preciso en el que ocurrió el evento (opcionalmente puede contener unas cabeceras con metadatos)
- Productores y Consumidores. Los productores son los que publican (escriben) los eventos en Kafka, mientras que los consumidores son aquellos elementos que se suscriben a estos eventos para poder leerlos y procesarlos.
- Los eventos se organizan y almacenan en los llamados Topics. Para entenderlo de forma sencilla, podemos imaginar estos topics como carpetas en un sistema y cada evento como un fichero dentro de la carpeta. Cada topic puede tener 0-n productores publicando eventos y de 0-n consumidores suscritos y leyendo estos eventos.
- Además, cada topic puede estar dividido en particiones, cada una de las cuales está localizada en un broker diferente, lo cual nos permite distribuir el flujo de eventos en distintos brokers.
Por otro lado, para poder tener un sistema distribuido, de alta disponibilidad y tolerante a fallos, podemos tener cada partición replicada en uno o más brokers. Cada broker es el responsable de su partición y se encarga de replicar los datos en el resto de brokers, además de ser el que procesa los eventos. En caso de que un broker caiga, otro broker con una réplica de la partición tomaría el control de esa partición y actuaría como el broker maestro de esa partición.
En la siguiente entrada, veremos cómo desplegar Apache Kafka en un contenedor Docker y crearemos una pequeña aplicación con Spring Boot para producir y consumir eventos.