Welcome to Apache Kafka
En pleno proceso de aprendizaje, nada mejor que compartir conocimiento.
Introducción
Podría decir que el responsable de que esté escribiendo este artículo se llama Alexander Semeshchenko (el arquitecto de mí equipo) quien en una charla de 45 minutos sobre Kafka despertó mi interés. No le cuenten que, aquella tarde, poco entendí, pero sí que captó 100% mi atención.
A partir de ese momento quise saber más, pero como les pasará a muchos, no sabía ni por dónde empezar. La idea de este artículo (y de varios más que planeo escribir compartiendo mi aprendizaje) es ahorrarles un poco de tiempo a los que están en la misma situación que yo y compartirles los conceptos y recursos que me fueron útiles.
Primero lo primero. El patrón Publish/Subscribe
Antes de que profundicen sobre que es kafka y leas “ Publish and subscribe to streams of record” te va a ser muy útil entender previamente este patrón. No es necesario profundizar tanto, pero sí que el concepto esté claro. Acá y acá encontrarás dos lecturas de unos pocos minutos que te puede ser de utilidad pero alcanzaría con decirte que en este sistema un mensaje puede ser recibido y procesado por múltiples subscribers de manera concurrente.
Mucho gusto, soy Kafka.
Hoy la tendencia es desarrollar nuestro software imaginando que estamos rodeados por eventos. En función de lo anterior, puedo decirte entonces que kafka es un sistema de mensajes de tipo “publish/subscribe”. También se lo describe como un “distributed commit log”, queriendo decir con esto que esta diseñado para proveer un registro duradero de todas las “transacciones/eventos/mensajes” para que luego puedan reproducirse de manera consistente. Como leíste, es distribuído lo que proporciona protección sobre fallos y una interesante oportunidad para escalar de manera horizontal.
¿Por qué elegir Kafka?
- Múltiples producers.
- Múltiples consumers.
- Escalable.
- Retención/Almacenamiento en disco.
- Altamente performante.
El nombre
Tal vez vos no, pero yo me pregunté por qué le pusieron ‘Kafka’ y esperaba una súper explicación pero nada que ver, resulta que se le ocurrió a uno de sus creadores (Jay Kreps) quien pensó que si era un sistema para escribir usar el nombre del escritor (Franz Kafka) le daba un poco de sentido y que cuando lo pronunciaba “resultaba interesante”. ¿Vos también te quedaste decepcionado? jaja.
Lo que tenes que saber.
Lejos estoy de ser experto por lo que seguro hay cientos de conceptos que (sin querer) estoy omitiendo comentarte, pero hay un vocabulario base que debes manejar:
- Mensajes: Es la unidad mínima de kafka. Si tenes conocimientos sobre bases de datos relacionales podríamos hacer una analogía entre mensaje y registro o fila. Tengo que avisarte, que para kafka, un mensaje no es otra cosa más que un array de bytes, el contenido no tiene ningún formato o significado para kafka.
- Key: Los mensajes pueden tener una metadata extra que también es un array de bytes sin un significado particular. Se utilizan cuando los mensajes tienen que ser escritos de una manera más “controlada” dentro de una partición.
- Topics: Siguiendo con la analogía de bases relaciones, pensá en un tópico como si fuera una tabla o también podes verlo como una carpeta dentro de un file system. Podes pensar en un tópico como una colección ordenada de eventos que son persistidos durante un determinado tiempo. Es muy pero muy probable que cuando trabajes con kafka los tópicos estén particionados.
- Particiones: Se me hace difícil explicarte esto sin ser redundante, además, tengo que usar términos en inglés por que no encuentro forma de traducirlos. Si nos centramos en la definición de kafka como “commit log” pensemos que una partición es un “single log”. Los mensajes se agregan siempre al final de cada partición. Hay dos cosas interesantes o al menos que son importantes que sepas: primero, el orden cronológico se asegura dentro de una misma partición, pero no así entre ellas y en segundo lugar decirte que a través de las particiones es que kafka puede proveer redundancia y escalabilidad ya que una partición puede ser alojada en un server diferente permitiendo así que un tópico pueda escalar horizontalmente.
- Producers: En otros sistemas “publish/subscribe” seguramente se refieran al producer como “publisher” o “writer”. Los producers crean mensajes para un determinado tópico y por defecto no se interesan acerca de en qué partición se escribe el mensaje. Ojo, en algunas ocasiones el producer puede querer dirigir un mensaje a una partición determinada, esto lo realiza haciendo uno de las keys de las cuales hablamos unas líneas más arriba. Veremos esto en profundidad en próximos artículos.
- Consumers: simple, leen mensajes. Los podrás encontrar en otros sistemas “publish/subscribe” como “subscribers” o “readers”. Un consumer se subscribe a uno o mas tópicos y lee los mensajes en el orden en que estos fueron producidos. Los consumers son inteligentes, llevan un registro de los mensajes que ya han consumido haciendo un “tracking” del offset del mensaje. Lo vamos a hablar en otros artículos, pero “en la vida real” los consumer trabajan como parte de un “consumer group” que no es otra cosa más que uno o más consumidores que trabajan en conjunto para leer un tópico. El grupo asegura que cada partición sea consumida por un solo miembro del mismo.
- Offset: Es otro “pedacito” de la metadata, se trata de un valor de tipo integer que es incremental y que kafka añade a cada mensaje que es producido. Cada mensaje dentro de una partición tendrá un offset único. Almacenando el offset del último mensaje consumido en cada partición es como un consumidor podría detenerse y volver a iniciarse sin perder la posición de la que estaba leyendo.
- Brokers: ¡..Uff ! Podríamos pasar horas hablando (y lo haremos en siguientes artículos) sobre el broker ya que le toca trabajar y mucho. El broker recibe mensajes del producer le asigna un offset y lo almacena. También le presta servicio al consumer respondiendo cuando éste requiere mensajes de un tópico determinado. Cuando se encuentran formando parte de un cluster uno de los brokers asumirá el rol de “controller” quien será responsable de las tareas administrativas como por ejemplo asignar particiones, monitorear el estado de los demás miembros del cluster.
Referencias
- Gran parte del conocimiento adquirido fue gracias a este curso del genio de Stéphane Maarek . Ahora estoy por empezar el de Kafka streams también de su autoría. Son pagos y si el cambio monetario (como pasa en Argentina) no te favorece, tal vez lo veas complicado, pero vale la pena el esfuerzo.
- Te recomiendo también la página de confluent.io. Por si no sabías y para decirlo de una manera simple, algunos, varios, muchos de los que crearon Kafka (mientras estaban en LinkedIn) son los fundadores. Hay mucho material pare leer y aprender.
- Me resultó muy interesante así que no lo dejes de mirar éste video en el canal de youTube de la gente de confluent.
¿Qué sigue?
Espero que el artículo hayas sido de tu interés o al menos útil. Me gustaría poder escribir sobre mi experiencia instalando kafka de manera local y también lo básico que aprendí manipulando tópicos, producers, consumers a través del Kafka CLI. ¡GRACIAS!
¡¡ UPDATE !!
Ya tenes disponible la parte II, entrá e instalemos kafka.