Skip to content

Introducción a Kafka

¿Qué es Kafka?

Apache Kafka es un sistema de trasmisión de eventos distribuido y de código abierto basado en el patrón de mensajería de Publish/Subscribe. Es escalable, posee alta velocidad de transmisión, alta disponibilidad y permite el almacenamiento de mensajes para evitar perdidas de información.

Se utiliza principalmente como flujo de comunicación de datos entre diferentes sistemas.

¿Por qué usamos Kafka?

Tradicionalmente, la trasmisión de datos entre sistemas siempre se ha llevado a cabo mediante una conexión directa entre ellos. No hay problema con pocos sistemas, pero conforme van creciendo en número se producen comunicaciones realmente complejas y costosas de mantener.

Sistema sin Kafka

Para simplificar este proceso de comunicación, surgió Apache Kafka. Kafka permite desacoplar los flujos de datos entre los distintos sistemas y simplifica estas conexiones.

Sistema con Kafka

Conceptos básicos de Kafka

Mensajes y Batches

La unidad básica de Kafka son los mensajes. Para Kafka, un mensaje es tan sólo un array de bytes. Para mejorar el rendimiento y los recursos, los mensajes se pueden agrupar en batches (grupos de mensajes).

Schemas

Los esquemas proporcionan un formato definido al contenido de los mensajes ya que para kafka no tiene formato alguno. El formato a seguir para los esquemas es Apache Avro que es un sistema de serialización de datos. Avro provee de un formato de serialización compacto, el esquema está separado del contenido del mensaje, así, no hay que generar nuevo código cuando los esquemas cambian.

Schema Registry

Todos los esquemas se guardan en un Schema Registry. Ahí se versionan y están disponibles para ser accedidos por los clientes de Kafka.

Los identificadores de los esquemas serán el nombre del topic donde se vayan a enviar, si el topic es multitenant el identificador del esquema será la parte del nombre del topic sin incluir el tenant, es decir, todo lo que vaya precedido por el caracter "_".

Ejemplos:

TopicIdentificar del esquema
nautilus.event.application.configurationnautilus.event.application.configuration
nautilus.event_tenant1234nautilus.event

Topics y Particiones

Los topics en Kafka son una forma de poder categorizar mensajes y equivalen a las colas donde se publican y consumen los datos. Estos a su vez están divididos en particiones con el propósito de ser escalables y permitir la redundancia de datos. Kafka publica mensajes dentro de estas particiones y les asigna un identificador llamado offset.

Los mensajes se reparten de una manera aleatoria entre las diferentes particiones de un mismo topic. Si se quiere asegurar que los mensajes estén ordenados, se debe utilizar una key al realizar el envío. De esta manera, el uso de esta clave asegurará que los mensajes acaben en la misma partición y por tanto puedan ser consumidos en el mismo orden de envío.

Ejemplo particionesEjemplo de Topic con 3 particiones

Producers y consumers

En Kafka hay dos tipos de clientes los Productores y los Consumidores.

Producers

Los productores son los encargados de generar nuevos mensajes a Kafka. Al productor no le importa en qué partición acabará el mensaje, va rotando entre todas las particiones de igual manera, a no ser que se especifique una clave junto al mensaje, lo que hará que el mensaje sea mandado a la misma partición que los demás mensajes con la clave compartida.

Ejemplo de ProductorEjemplo de Productor

Ejemplo de producción por claveEjemplo de producción por clave

Consumers

Los consumidores son los encargados de recibir los mensajes de Kafka. Un consumidor puede suscribirme a uno o más topics y leerá los mensajes en el orden que se producieron. Un consumidor sabe qué mensajes han sido consumidos haciendo un seguimiento del offset de los mensajes, que es un número entero incremental el cual Kafka añade a los mensajes en cuanto son producidos. Cada mensaje en una partición tiene un offset único. El offset, al ser guardado, permite al consumidor poder parar de consumir y continuar sin perderse.

Los consumidores pueden agruparse en grupos de consumidores para leer del mismo topic. Un grupo asegura que cada partición será leída sólo por un consumidor. Kafka a su vez gestiona la adición o la eliminación de consumidores de un grupo, rebalanceando las particiones entre los mismos.

Importante: Si el número de consumidores excede el número de particiones del topic, habrán consumidores que no esten consumiendo de una partición ya que cada partición es asignada sólo a un único consumidor.

Ejemplo de ConsumidorEjemplo de Consumidor

Grupos de ConsumidoresGrupos de Consumidores

Brokers

Los brokers son los servidores de Kafka encargados de recibir los mensajes publicados por los productores, asignarles un offset y guardarlos en disco. Además, sirven las peticiones que hacen los consumidores para leer mensajes.