Appearance
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.
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.
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:
Topic | Identificar del esquema |
---|---|
nautilus.event.application.configuration | nautilus.event.application.configuration |
nautilus.event_tenant1234 | nautilus.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 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 Productor
Ejemplo 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 Consumidor
Grupos 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.