Kafka data structures, Zookeeper Offsets

Kafka data structures, Zookeeper Offsets

Desde la versión 0.9 (current: 1.1.0), Kafka proporciona la capacidad de almacenar y distinguir los cambios sucedidos en los respectivos “topic” (offsets) directamente en Kafka en lugar de depender del Zookeeper. Los datos en Zookeeper, aunque son similares a un típico sistema de directorios, pueden tener datos asociados a los nodos. Estos datos pueden variar desde datos de configuración, detalles de estado, marcas de tiempo, etc… que ayudan a Zookeeper a hacer lo que mejor sabe hacer.

Apacke Kafka example

Offsets consumers

Los “offsets” en Kafka se almacenan como mensajes separados con un formato concreto: xx_consumer_offsets, donde cada consumidor envía un mensaje al topic con intervalos periódicos. El mensaje contiene, a parte de los metadatos relacionados y el “current offsets”, el grupo de consumidores, el número de partición, el topic asociado y otra información útil. Por ejemplo podríamos tener el siguiente formato: /consumers/{CONSUMER_GROUP_ID}/offsets/{TOPIC_NAME}/{PARTITION_NUMBER}

En caso que queramos leer, como consumidores, tales “offsets”, como: xx_consumer_offsets podemos hacerlo como en cualquier otro topic. Antes de hacerlo, debemos hacer que el topic sea visible para los consumidores, ya que este es un topic interno de Kafka y no es visible para los consumidores de forma predeterminada.

Stream Processing

Por lo general, estamos acostumbrados a trabajar con sistemas de colas, pero muchos de nuestros productos y/o servicios necesitan procesar grandes volúmenes de datos y, éstos, ser procesados en tiempo real. Los sitemas de colas tradicionales, en ningún caso, nos pueden dar ese tiempo real requerido. Es por eso que Kafka, puede procesar cualquier cosa que tome flujos continuos de datos, generando una entrada, generando un topic o tema y generando una salida que puede ser consumida al momento, inclusive, generando una transformación que publicará una salida prima (topic’). Aunque es posible hacer un procesamiento simple consultando directamente las API del productor de datos y/o del consumidor, para transformaciones complejas, Kafka proporciona una API de Streams completamente integrada. Esto nos permite crear aplicaciones que realizan un procesamiento no trivial que calcula agregaciones fuera de las secuencias o las une, como decíamos.

Esta función nos permite resolver problemas difíciles de uso diário como: manejar datos fuera de orden, procesar la entrada como cambios de código, realizar cálculos con estado, etc…

Multi-tenancy

Una gran solución que Kafka nos permite solucionar es utilizarlo como Multi-tenancy. Cierto es que Kafka se vuelve complicado en un entorno multi-tenant, donde por ejemplo, los usuarios pueden tener diferentes SLA por disponibilidad, durabilidad o latencia. A medida que crece el tráfico, se ha comprobado que la gestión de un enorme y monolítico clúster de Kafka en un entorno Cloud es problemático y difícil de escalar.

Como solución, por ejemplo, podemos convertir nuestro Cluster de Kafka a un modelo más jerárquico y multi-cluster donde los topic se asignen en clústeres compartidos o dedicados según los requisitos de SLA y se pueden migrar a través de clústeres. Los enrutadores de infraestructura conectan los clústeres de Kafka y brindan acceso jerárquico a los datos.

Autor: Joakim Vivas

comments powered by Disqus