Apache Kafka
Toda empresa moderna gira en torno a los datos. Precisamente por eso, a lo largo de los años han surgido varias tecnologías, plataformas y marcos de trabajo para apoyar la gestión avanzada de datos. Una de estas soluciones es Apache Kafka, una plataforma de streaming distribuido diseñada para el procesamiento de datos de alta velocidad y en tiempo real.
Hasta la fecha, Kafka ya ha visto una gran adopción en miles de empresas de todo el mundo. Lo analizamos en profundidad para entender qué tiene de especial y cómo pueden utilizarlo las distintas empresas.
¿Qué es Apache Kafka?
Kafka es una plataforma de streaming distribuida y de código abierto que permite almacenar, leer y analizar datos en tiempo real. Es una potente herramienta capaz de manejar miles de millones de eventos al día y seguir funcionando con rapidez, sobre todo gracias a su naturaleza distribuida.
Antes de que pasara a la comunidad y a la Fundación Apache en 2011, Kafka se creó originalmente en LinkedIn, para rastrear el comportamiento de sus usuarios y crear conexiones entre ellos. Por aquel entonces, pretendía resolver un problema real con el que los desarrolladores de LinkedIn luchaban: la ingesta de baja latencia de grandes datos de eventos. Había una clara necesidad de procesamiento en tiempo real, pero no había soluciones que pudieran realmente acomodarlo.
Qué son los procesos ETL
Los procesos ETL son imprescindibles para un buen manejo de datos que provienen de distintas fuentes. Cuyo objetivo es facilitar el almacenamiento de datos.
Ver artículoAsí es como nació Kafka. Desde entonces, ha recorrido un largo camino y ha evolucionado hasta convertirse en un completo sistema de mensajería distribuida de publicación-suscripción, que proporciona la columna vertebral para la construcción de aplicaciones robustas.
¿Cómo funciona Kafka?
Básicamente, una plataforma de streaming como Kafka tiene tres capacidades básicas: publicar y suscribirse a flujos de registros, almacenar estos flujos de registros de forma tolerante a fallos y procesarlos a medida que se producen.
Con Kafka específicamente, las aplicaciones (en este caso los productores) publican mensajes (registros) que llegan a un nodo Kafka (broker). Cada registro (que consta de una clave, un valor y una marca de tiempo) es procesado por los llamados consumidores, y almacenado en categorías llamadas temas que conforman los clusters de Kafka.
Sin embargo, como los temas pueden crecer en tamaño, se dividen en particiones más pequeñas para mejorar el rendimiento y la escalabilidad. Todos los mensajes dentro de cada partición se ordenan en la secuencia inmutable en la que llegaron y se añaden continuamente a un registro de confirmación estructurado.
Además, a los registros de las particiones se les asigna un número de identificación secuencial (offset) que identifica de forma exclusiva cada registro dentro de la partición. Los datos de las particiones también se replican en varios corredores para preservar toda la información en caso de que uno de ellos muera.
Otros posts que te gustarán
Lo que también es interesante es que a Kafka no le importa qué registros se están consumiendo. El clúster de Kafka persiste de forma duradera todos los registros publicados utilizando un periodo de retención configurable. Son los propios consumidores los que sondean Kafka en busca de nuevos mensajes y dicen qué registros quieren leer. Sin embargo, después del periodo establecido, el registro se descarta para liberar espacio.
En cuanto a las API, hay cinco componentes clave en Kafka:
- La API del Productor que permite a la aplicación publicar un flujo de registros en los temas (uno o varios, por ejemplo),
- La API del consumidor que permite a la aplicación suscribirse a temas y procesar el flujo de registros correspondiente,
- La API de flujos que facilita la transformación efectiva de los flujos de entrada en flujos de salida,
- La API del conector que permite construir y ejecutar productores o consumidores reutilizables que conectan temas de Kafka con aplicaciones o sistemas de datos existentes,
- La API de administración que permite gestionar e inspeccionar temas, corredores y otros objetos de Kafka.
La API del Productor que permite a la aplicación publicar un flujo de registros en los temas (uno o varios, por ejemplo),
La API del consumidor que permite a la aplicación suscribirse a temas y procesar el flujo de registros correspondiente,
La API de flujos que facilita la transformación efectiva de los flujos de entrada en flujos de salida,
La API del conector que permite construir y ejecutar productores o consumidores reutilizables que conectan temas de Kafka con aplicaciones o sistemas de datos existentes,
La API de administración que permite gestionar e inspeccionar temas, corredores y otros objetos de Kafka.
Como resultado, Kafka es capaz de ingerir y mover rápidamente grandes cantidades de datos, facilitando la comunicación entre varios elementos, incluso poco conectados, de los sistemas informáticos.
Ventajas y desventajas de Apache Kafka?
Hay algunas razones por las que Kafka parece estar creciendo en popularidad. En primer lugar, dada la enorme cantidad de datos que se producen y consumen a través de diferentes servicios, aplicaciones y dispositivos, muchas empresas pueden beneficiarse de la arquitectura basada en eventos hoy en día. Se dice que una plataforma de streaming distribuido con almacenamiento duradero como Kafka es la forma más limpia de lograr dicha arquitectura.
Kafka también resulta ser fiable y rápido, sobre todo gracias a la entrega de mensajes de baja latencia, la E/S secuencial, el principio de copia cero, así como una eficiente agrupación y compresión de datos. Todo esto hace que Kafka sea una alternativa adecuada a los brokers de mensajería tradicionales.
Sin embargo, por otro lado, Kafka es simplemente complicado. Para empezar, hay que planificar y calcular un número adecuado de brokers, temas y particiones. Por otra parte, el reequilibrio del clúster de Kafka también puede afectar al rendimiento tanto de los productores como de los consumidores (y, por lo tanto, pausar el procesamiento de los datos). Hablando de datos, es fácil que los registros antiguos se eliminen demasiado pronto (con alta producción y bajo consumo, por ejemplo) para ahorrar espacio en disco. Puede ser fácilmente una exageración si no se necesitan realmente las características de Kafka.
¿Para qué sirve Apache Kafka?
Según el equipo de desarrollo de Kafka, hay algunos casos de uso clave para los que está diseñado, entre ellos:
- para mensajes
- seguimiento de la actividad del sitio web
- agregación de registros
- métricas operativas
- procesamiento de flujos
Siempre que sea necesario crear aplicaciones de streaming en tiempo real que necesiten procesar o reaccionar a "trozos" de datos, o transferir datos de forma fiable entre sistemas o aplicaciones, Kafka acude al rescate.
Es una de las razones por las que Kafka funciona bien con las aplicaciones bancarias y financieras, donde las transacciones deben procesarse en un orden específico. Lo mismo ocurre con el transporte y la logística, así como con el comercio minorista, especialmente cuando hay sensores IoT implicados. En estos sectores, a menudo se necesita una supervisión constante, aplicaciones asíncronas y en tiempo real (por ejemplo, controles de inventario), análisis avanzados e integración de sistemas, por nombrar algunos.
De hecho, cualquier empresa que quiera aprovechar la analítica de datos y la integración de herramientas complejas (por ejemplo, entre aplicaciones de CRM, TPV y comercio electrónico) puede beneficiarse de Kafka. Es precisamente donde encaja bien en la ecuación.
¿Quién utiliza Apache Kafka?
No debería sorprender que Kafka siga siendo una parte fundamental de la infraestructura de LinkedIn. Se utiliza principalmente para el seguimiento de la actividad, el intercambio de mensajes y la recopilación de métricas, pero la lista de casos de uso no termina aquí. La mayor parte de la comunicación de datos entre los diferentes servicios del entorno de LinkedIn utiliza Kafka en cierta medida.
Por el momento, LinkedIn admite mantener más de 100 clusters de Kafka con más de 4.000 brokers, que sirven 100.000 temas y millones de particiones. El número total de mensajes gestionados por los despliegues de Kafka de LinkedIn, por otra parte, ya superó los 7 billones al día.
Aunque ningún otro servicio utiliza Kafka a la escala de LinkedIn, muchas otras aplicaciones, empresas y proyectos lo aprovechan. En Uber, por ejemplo, muchos procesos se modelan con Kafka Streams -incluyendo el emparejamiento de clientes y conductores y los cálculos de ETA. Netflix también adoptó la arquitectura Kafka multiclúster para el procesamiento de flujos y ahora maneja sin problemas billones de mensajes cada día.
En Future Mind, también tuvimos la oportunidad de implementar Kafka. Para Fleet Connect, un sistema de seguimiento de vehículos y gestión de flotas, controlamos la ubicación de cada vehículo (junto con algunos otros parámetros) gracias a dispositivos dedicados en su interior. Los datos recogidos por estos dispositivos llegan a IoT Gateway, que descodifica los mensajes y los envía a Kafka. A partir de ahí, acaban en IoT Collector, donde tienen lugar el procesamiento y el análisis de los datos.
Curiosamente, los rastreadores del interior de los vehículos envían los mensajes uno a uno y por orden de aparición, pero sólo después de que el anterior haya sido aceptado y almacenado correctamente, para que no perdamos ningún dato relevante. Por esta razón, sin embargo, tenemos que "asumir" todos estos mensajes rápidamente, para no sobrecargar los rastreadores y procesar los datos en tiempo real.
En este caso, el escalado horizontal con el uso de brokers clásicos, sistemas de mensajería y colas "tradicionales" no sería suficiente debido a la especificidad del proyecto y a la necesidad de analizar los datos en tiempo real. Sin embargo, con Kafka podemos dividir el flujo de entrada en particiones basadas en el ID del vehículo y utilizar múltiples brokers que garantizan una escalabilidad horizontal casi ilimitada, una copia de seguridad de los datos en caso de fallo, una alta velocidad operativa, continuidad y un procesamiento de datos en tiempo real en un orden específico.
¿Debo emplear kafka para mis proyectos?
1. Considere si realmente necesita Kafka si se cumplen algunos de los siguientes puntos:
- No es necesario procesar miles de mensajes por segundo
- No es necesario mantener el orden específico en el que se deben procesar los datos
- Una posible pérdida de algunos registros en el caso de la conmutación por error no sería muy problemática
2. Piensa en los diferentes componentes del sistema.
- ¿Cuántos brokers necesitas (es decir, cómo de distribuido debe estar el sistema), cuántas instancias de ZooKeeper, cuántos servidores y en qué lugares?
- Qué temas y particiones piensa tener - estos pueden ser cambiados después, pero el cambio en sí es bastante problemático
- Cuántos productores y consumidores diferentes utilizarán el sistema, y en cuántas instancias (dentro de un grupo de consumidores) se paralelizará cada uno de ellos
3. Piensa en toda la configuración, especialmente:
- ¿Cuál es la mejor opción para una clave de partición, y cuál es la estrategia de partición detrás de ella?
- ¿Cómo elegir la mejor estrategia para agrupar los mensajes (tanto en el caso de los productores como de los consumidores) para mantener el equilibrio entre la velocidad de procesamiento/entrega y los retrasos?
- ¿Cuál debería ser la política de reintentos y los tiempos de espera para los mensajes entregados por los productores a los brokers de Kafka?
4. Pruebe su configuración y compruebe si:
- Si se desactiva uno de los brokers, ¿los restantes se harían cargo de las particiones gestionadas por él (en otras palabras, se activaría el reequilibrio de particiones)?
- Si se desactiva una de las instancias consumidoras, ¿las restantes dentro del mismo grupo consumidor comenzarían a procesar los mensajes de las particiones consumidoras inactivas?
- ¿Puede manejar la política de reintentos y los desplazamientos de los compromisos, y no ha perdido ningún mensaje ni ha procesado ninguno duplicado por el camino?
5. Monitorizar Kafka con el uso de las herramientas disponibles y comprobar que:
- No tiene ninguna partición que no se utilice
- Ninguno de los consumidores tiene una marca de agua demasiado alta
- Todos los corredores están sanos
- Todos los corredores y consumidores están bien equilibrados