Kafka y Confluent Platform

Apache Kafka es una plataforma de streaming de eventos que se ha convertido en pocos años en una de las opciones más interesantes para integrar aplicaciones en tiempo real. Gracias a Apache Kafka, es posible construir aplicaciones productoras que publican eventos, así como aplicaciones consumidoras que reaccionan a dichos eventos. Estos eventos se almacenan de manera persistente de tal manera que ante un problema en las aplicaciones consumidoras, estas pueden volver a leer los mensajes de nuevo.

Introducción

Apache Kafka se ha convertido en la herramienta estándar para hacer streaming de eventos en tiempo real. Es una herramienta open source que nació como un proyecto de Linkedin y que es capaz de capturar todo lo que está pasando en una compañía y convertirlo en flujos de información en tiempo real a los que otros procesos se pueden suscribir para procesarlos. Es una solución muy versátil en un contexto de integración de aplicaciones, ya que puede utilizarse por un lado como un sustituto para sistemas tradicionales de mensajería, pero también como una alternativa a las herramientas ETL que se utilizan para sincronizar datos de diferentes sistemas y bases de datos.

Existen multitud de casos de uso que se pueden implementar con Kafka, como por ejemplo detección de fraude, sensorización en vehículos, visión 360 grados de clientes, descarga de datos del mainframe, juegos online, etc.

Confluent

Confluent es una empresa que fue fundada en 2014 por tres antiguos empleados de Linkedin (Jay Kreps, Neha Narkhede y Jun Rao) que habían participado desde 2010 en el desarrollo de Kafka mientras todavía trabajaban en Linkedin.

Confluent ofrece dos productos:

  • Confluent Platform: se trata de una distribución Enterprise de Kafka que ofrece capacidades a nivel de operaciones, gestión, seguridad, etc. Se puede instalar on-premises o en cualquier nube.
  • Confluent Cloud: es una versión gestionada de Kafka operada por la propia Confluent.

Algunas de las funcionalidades de Confluent Platform son:

  • Confluent Control Center: permite monitorizar la salud de los clusters de Kafka, gestionar topics, monitorizar data streams, etc.
  • Confluent CLI: es un command line que permite efectuar operaciones como gestión de secretos, gestión de roles y accesos, etc.
  • Confluent Operator: permite automatizar el despliegue de la plataforma en Kubernetes.
  • Confluent Hub: es un marketplace donde la propia Confluent - pero también otros partners - ofrecen conectores que se pueden utilizar tanto para cargar información en Kafka (sources) como para enviar información procesada en Kafka a sistemas terceros (sinks).

Arquitectura de Kafka

Los principales componentes de la arquitectura de Kafka son:

  • Productores: publican mensajes en Kafka enviándolos a los Brokers. Los productores se pueden escribir en cualquier lenguaje (Java, Python, .NET)
  • Broker: reciben los mensajes y los persisten en almacenamiento local durante un determinado tiempo de retención, que por defecto es una semana pero que es configurable, tanto de manera global como por topic. Un cluster de Kafka puede estar formado por muchos Brokers. Los mensajes una vez recibidos y persistidos por el Broker no pueden ser eliminados de manera independiente, sino que persisten en función del tiempo especificado en la política de retención.
  • Consumidores: están constantemente escuchando mensajes nuevos de uno o varios topics. Mantienen un registro del offset del último mensaje leído. Kafka no mantiene un registro de los consumidores que tiene un topic o qué consumidores han leído un mensaje.
  • Zookeeper: gestiona el cluster de Kafka, detecta errores, almacena secretos, mantiene la configuración, etc.

Zookeeper de Kafka

Topics, particiones y segmentos

Los topics son representaciones lógicas de los mensajes; puede haber un número ilimitado de topics. Los mensajes de un topic se distribuyen en diferentes particiones, siguiendo diferentes estrategias (round robin, en función de un hash de la clave del mensaje, etc.). Las particiones son útiles cuando los consumidores necesitan que se garantice el orden de entrega.

Topics, particiones y segmentos en Kafka

Los Brokers se ocupan de mantener de manera redundante diferentes particiones de cada topic de tal manera que ante un fallo en ese Broker, los restantes elementos del cluster puedan continuar dando servicio usando la copia que tienen de las pariciones. Por cada partición de cada topic, existe un Broker que ejerce como líder, y los demás Brokers actúan como followers.

Particiones en Kafka

Los consumidores se pueden agrupar en Grupos de Consumidores. Una partición de un topic solo puede ser leída como mucho por un Consumidor, pero un Consumidor puede leer varias particiones. A medida que se agregan o se eliminar consumidores de un Grupo, se lanzan operaciones de balanceo, ya sea para pasarle a un consumidor la tarea de leer en una nueva partición (cuando se eliminar un consumidor del grupo) o para quitarle la tarea de leer de una partición (cuando se agrega un consumidor a un grupo).

Añadir grupos en Kafka

Kafka Connect

Es un framework con el que se pueden escribir conectores. Los conectores se utilizan tanto para ingestar mensajes en Kafka (sources) como para enviar información hacia otros sistemas (sinks).

Kafka Connect

Confluent REST Proxy

Se trata de un interfaz RESTful que permite interactuar con un cluster de Kafka. Se puede utilizar tanto por aplicaciones que están fuera del firewall como por aplicaciones que no tienen posibilidad de interactuar con Kafka directamente.

Confluent REST Proxy

Confluent Schema Registry

Es una herramienta que permite comprobar que los mensajes que se publican en un topic cumplen con un esquema definido previamente. Gestiona cambios en el esquema y evita que se introduzcan cambios que no sean retrocompatibles.

Confluent Schema Registry

Kafka Streams y KSQL / ksqlDB

La librería Kafka Streams está construida en un nivel superior que el de los productores y consumidores. Es una librería más potente y expresiva que los clientes Kafka tradicionales. Con Kafka Streams, la entrada y la salida se almacena en clusters de Kafka.

Confluent KSQL proporciona un nivel de abstracción superior, permitiendo escribir aplicaciones que procesan un flujo de datos usando SQL.

El siguiente diagrama muestra las diferentes opciones para interactuar con un cluster de Kafka:

Kafka Streams y KSQL / ksqlDB

Conclusión

Kakfa se ha convertido rápidamente en pocos años en una de las alternativas más atractivas para construir soluciones de procesado de eventos en tiempo real. Su arquitectura es altamente escalable y tolerante a fallos, lo cual convierte a Kafka en una opción muy interesante en entornos distribuidos. Confluent proporciona una plataforma Enterprise que amplía la potencia de Kafka dotándola de capacidades adicionales como conectores, esquemas, un proxy REST, un Control Center, etc.