En este post explicaremos el ecosistema de Apache Kafka, si aún no tienes configurado tu cluster te recomendamos leer el post Primeros pasos con Apache Kafka en Español !.
Antes de empezar veamos la siguiente imagen que representa el ecosistema básico de Kafka.
En el diagrama anterior tenemos los siguientes componentes:
- Una fuente de datos: esta puede ser un api, base de datos, motor de búsqueda, etc.
- Producer API: Es un api que permite colocar mensajes en lugares llamados topics dentro de un cluster de Kafka.
- Kafka / Zookeeper : Más adelante explicaremos más a detalle como funcionan estos dos componentes en el ecosistema pero por ahora consideremos que serán quienes almacenarán los mensajes en lugares llamados topics.
- Consumer API: Es un api que permite leer mensajes desde los topics de kafka.
- Target system: Sistema destino que recibirá la información que se está procesando.
Una vez que entendemos como funciona el ecosistema básico de Kafka ahora veamos el Kafka Extended API:
Veamos punto por punto:
- Fuente de datos: Del mismo modo que en el ecosistema básico tendremos una fuente de datos a procesar.
- Kafka connect source: Sabemos que existe un producer API, pero, al darse cuenta que existen muchas fuentes de datos similares, se decidió crear este proyecto, el cual define un conjunto de conectores a fuentes de datos comunes para que solo lo configures en tu cluster y este lea la información y la mande a algún topic de kafka.
- Kafka connect sink: Del mismo modo que en el punto anterior existen sistemas de destino comunes, para esto se creó este proyecto que de igual modo contiene conectores los cuales envían información a esos sistemas destino.
- Kafka streams: La mayoría de las veces no solo necesitas leer información y escribirla en un sistema destino, sino que deseas realizar algunas transformaciones a los datos, kafka steams permite realizar esas operaciones.
- Target systems: Del mismo modo que en el ecosistema básico tendremos sistemas destino que recibirán la información que procesamos.
Conceptos básicos
A continuación presentaremos los conceptos básicos que debes entender antes de continuar utilizando Apache Kafka:
- Topic : Un topic es un flujo de datos del mismo contexto al cuál se le asigna un nombre, en un cluster de Kafka es posible crear multiples topics del mismo modo que en una base de datos es posible crear muchas tablas.
- Partition : Un topic es dividido en particiones, las cuales son ordenadas, de este modo podemos ver una partición como parte de un topic.
- Message: Un mensaje es información que colocamos en un topic.
- Offset: Cada mensaje colocado dentro de una partición recibe un id incremental al que se le conoce como offset.
Si tratamos de visualizar lo anterior se verá del siguiente modo:
Puntos importantes:
- Un offset solo tiene significado dentro de una partición, si vemos la imagen anterior podemos ver que podemos tener el offset 0 en las 3 particiones, pero esto no significa que el valor dentro de las 3 particiones es el mismo.
- El orden está garantizado pero solo dentro de la misma partición no en las otras particiones.
- A diferencia de otros brokers los mensajes que se entregan en Kafka se almacenarán por un periodo de tiempo, por default este periodo es de 2 semanas.
- Una vez que la información se almacena en una partición esta no se puede cambiar.
- Puedes tener las particiones que quieras en un topic de Kafka.
- Tu no colocas los mensajes en una partición en específico, tu lo haces en topics, la asignación de particiones sobre los mensajes se hace de manera aleatoria a menos que tengas una llave.
- Entre más particiones tengas puedes tener más paralelismo, esto significa que puedes tener más consumers leyendo al mismo tiempo.
En el siguiente post explicaremos como funcionan los brokers, la replicación de los datos, el envío y recepción de mensajes con Java, etc.
Si te gusta el contenido y quieres enterarte cuando realicemos un post nuevo síguenos en nuestras redes sociales https://twitter.com/geeks_mx y https://www.facebook.com/geeksJavaMexico/.
Autor: Alejandro Agapito Bautista
Twitter: @raidentrance
Contacto:raidentrance@gmail.com