# Apache Kafka

Apache Kafka es un proyecto de intermediación de mensajes de código abierto desarrollado por LinkedIn y donado a la Apache Software Foundation escrito en Java y Scala. El proyecto tiene como objetivo proporcionar una plataforma unificada, de alto rendimiento y de baja latencia para la manipulación en tiempo real de fuentes de datos. Puede verse como una cola de mensajes, bajo el patrón publicación-suscripción, masivamente escalable concebida como un registro de transacciones distribuidas, lo que la vuelve atractiva para las infraestructuras de aplicaciones empresariales.
El diseño tiene gran influencia de los registros de transacción.

## Historia

Apache Kafka fue originalmente desarrollado por la empresa Linkedin, la cual lo publicó como software libre a principios de 2011. En octubre de 2012 superó la etapa de incubación de la fundación Apache. En noviembre de 2014, varios ingenieros que trabajaron en el proyecto Kafka de Linkedin crearon una nueva empresa llamada Confluent enfocada en Kafka.

### Empresas que utilizan Kafka

La siguiente es una lista de empresas conocidas que utilizan o han utilizado Kafka:
* Cisco Sistemas
* Daumkakao
* Walmart
* Netflix
* Adidas
* PayPal
* Spotify
* Uber
* Spotify
* Oracle
* Twitter
* Trivago
* LinkedIn
* Shopify
* Betfair
* Microsoft Azure

### Rendimiento de Kafka

Debido a su capacidad de escalar masivamente y a su uso en estructuras a nivel de aplicaciones empresariales, el seguimiento del rendimiento de Kafka se ha convertido en un tema cada vez más importante. Actualmente existen varias plataformas de código abierto, como Burrow de Linkedin, y plataformas de pago como Datadog, que permiten hacer el seguimiento del desempeño de Kafka.

## Arquitectura

Kafka almacena mensajes de clave-valor que provienen de un número arbitrario de procesos llamados "productores". Los datos pueden dividirse en diferentes "particiones" dentro de diferentes "temas". Dentro de una partición, los mensajes se ordenan estrictamente por sus posiciones (la posición de un mensaje dentro de una partición), y se indexan y almacenan junto con una marca de tiempo. Otros procesos denominados "consumidores" pueden leer los mensajes de las particiones. Para el procesamiento de flujos, Kafka ofrece la API de flujos (Streams) que permite escribir aplicaciones Java que consumen datos de Kafka y escriben los resultados de vuelta a Kafka. Apache Kafka también funciona con sistemas de procesamiento de flujos externos como Apache Apex, Apache Beam, Apache Flink, Apache Spark, Apache Storm y Apache NiFi.
Kafka se ejecuta en un clúster de uno o más servidores (llamados brokers) y las particiones de todos los temas se distribuyen entre los distintos nodos del clúster. Además, las particiones se replican en varios brokers. Esta arquitectura permite a Kafka entregar flujos masivos de mensajes de forma tolerante a fallos y le ha permitido sustituir algunos de los sistemas de mensajería convencionales como Java Message Service (JMS), Advanced Message Queuing Protocol (AMQP), etc.
Desde la versión 0.11.0.0, Kafka ofrece escrituras transaccionales, que proporcionan un procesamiento de flujos de una sola vez utilizando la API de flujos (streams).
Kafka soporta dos tipos de temas: Regulares y compactados. Los temas regulares pueden configurarse con un tiempo de retención o un límite de espacio. Si hay registros que son más antiguos que el tiempo de retención especificado o si se supera el límite de espacio para una partición, Kafka puede eliminar los datos más antiguos para liberar espacio de almacenamiento. Por defecto, los temas se configuran con un tiempo de retención de 7 días, pero también es posible almacenar los datos indefinidamente.
En el caso de los temas compactados, los registros no caducan en función de los límites de tiempo o espacio. En su lugar, Kafka trata los mensajes posteriores como actualizaciones de mensajes más antiguos que tengan la misma clave y garantiza que nunca se borrará el último mensaje de una clave. Sin embargo, los usuarios pueden eliminar los mensajes por completo escribiendo un mensaje denominado tombstone con valor nulo para una clave específica.

## Interfaces de Kafka

Hay cinco interfaces principales en Kafka:
* Producer API: Permite a una aplicación publicar flujos de registros.
* Consumer API: Permite a una aplicación suscribirse a temas y procesar flujos de registros.
* Connector API: Interfaz de importación/exportación para la conexión con sistemas de terceros.
* Streams API: Biblioteca Java para el procesamiento de flujos de datos, convirtiendo los flujos de entrada en salida y produciendo el resultado.
* Admin API: Se utiliza para gestionar los temas de Kafka, los brokers y otros objetos de Kafka.
Las interfaces de consumidor y productor se basan en el protocolo de mensajes Kafka y están desacopladas de la funcionalidad principal de Kafka. El protocolo de mensajes real de Kafka es un protocolo binario y, por lo tanto, permite que los clientes consumidores y productores se desarrollen en cualquier lenguaje de programación. Por lo tanto, Kafka no está vinculado al ecosistema JVM. En la Wiki de Apache Kafka se mantiene una lista de clientes no-Java disponibles.

### API de conexión

Kafka Connect (o Connect API) proporciona una interfaz para cargar/exportar datos desde/a sistemas de terceros. Está disponible desde la versión 0.9.0.0 y se basa en la API de consumidores y productores. La API de Connect define la interfaz de programación que debe implementarse para construir un conector personalizado. Ya existen muchos conectores comerciales y de código abierto que pueden utilizarse. Sin embargo, Apache Kafka por sí mismo no proporciona ningún conector listo para la producción.

### API de Streams

Kafka Streams (o Streams API) es una biblioteca Java para el procesamiento de flujos y está disponible a partir de la versión 0.10.0.0. La biblioteca permite desarrollar programas de procesamiento de flujos con estado que son escalables, flexibles y tolerantes a fallos.

## Operador Kafka para Kubernetes

En agosto de 2019, se publicó un gestor para construir una plataforma Kafka nativa de la nube con Kubernetes.
Permite automatizar el despliegue de pods de los componentes del ecosistema Kafka (ZooKeeper, Kafka Connect, KSQL, Rest Proxy), monitorizar los SLA a través de Confluent Control Center o Prometheus, escalar Kafka de forma flexible, y gestionar las interrupciones y automatizar las actualizaciones continuas.

## Compatibilidad de versiones

Hasta la versión 0.9.x, los brokers de Kafka sólo son compatibles con los clientes más antiguos.
A partir de la versión 0.10.0.0 de Kafka, los brokers son compatibles con versiones de clientes más recientes, aunque éstos sólo podrán utilizar las características que el broker soporte.
Para la API de Streams, la compatibilidad total comienza con la versión 0.10.1.0, por tanto una aplicación de Kafka Streams 0.10.1.0 no es compatible con versiones de brokers anteriores a 0.10.0.