Trabajo con Kafka en Java: bibliotecas, configuración y ejemplos de código
\n\nApache Kafka es una plataforma distribuida para transmisión de datos en flujo, ampliamente utilizada para construir sistemas de mensajería de alta carga, recolección de registros, procesamiento de eventos en tiempo real e integración de microservicios. En el ecosistema Java, Kafka ocupa un lugar especial gracias a la biblioteca oficial Kafka Clients y a múltiples herramientas adicionales. En este artículo, analizaremos en detalle cómo trabajar con Kafka en Java, qué bibliotecas usar y proporcionaremos ejemplos prácticos de código.
\n\nBibliotecas principales para trabajar con Kafka en Java
\n\nPara integrar aplicaciones Java con Apache Kafka, existen varias bibliotecas clave:
\n\n- \n
- Kafka Clients — biblioteca oficial de Apache que proporciona API para productores (Producer) y consumidores (Consumer). Es la forma mínima y más confiable de interactuar con los brokers. \n
- Spring Kafka — extensión para Spring Framework que simplifica la configuración y el uso de Kafka mediante anotaciones y plantillas (KafkaTemplate, @KafkaListener). \n
- Kafka Streams — biblioteca para construir aplicaciones de procesamiento de flujos (stream processing) en Java, sin necesidad de Spark o Flink. Permite realizar filtrado, agregación y unión de flujos. \n
- Akka Streams Kafka (Alpakka) — biblioteca reactiva para trabajar con Kafka basada en Akka Streams, adecuada para aplicaciones asíncronas y no bloqueantes. \n
En esta guía, nos centraremos en la biblioteca oficial Kafka Clients, ya que es la base de todas las demás herramientas.
\n\nAdición de dependencias (Maven)
\n\nPara comenzar, agregue la siguiente dependencia en su pom.xml:
<dependency>\n <groupId>org.apache.kafka</groupId>\n <artifactId>kafka-clients</artifactId>\n <version>3.7.0</version>\n</dependency>\n\nSi usa Gradle, agregue:
\n\nimplementation 'org.apache.kafka:kafka-clients:3.7.0'\n\nConfiguración del productor (Producer)
\n\nEl productor envía mensajes a los tópicos de Kafka. Veamos un ejemplo simple de creación y envío de un mensaje.
\n\nimport org.apache.kafka.clients.producer.*;\nimport java.util.Properties;\n\npublic class SimpleProducer {\n public static void main(String[] args) {\n // Configuración de propiedades del productor\n Properties props = new Properties();\n props.put("bootstrap.servers", "localhost:9092");\n props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");\n props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");\n props.put("acks", "all"); // Esperar confirmación de todas las réplicas\n props.put("retries", 3); // Número de reintentos en caso de error\n\n // Creación del productor\n Producer<String, String> producer = new KafkaProducer<>(props);\n\n // Envío del mensaje\n ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key1", "¡Hola, Kafka desde Java!");\n producer.send(record, (metadata, exception) -> {\n if (exception == null) {\n System.out.println("Mensaje enviado al tópico: " + metadata.topic() +\n ", partición: " + metadata.partition() +\n ", offset: " + metadata.offset());\n } else {\n System.err.println("Error de envío: " + exception.getMessage());\n }\n });\n\n // Cierre del productor\n producer.close();\n }\n}\n\nEn este ejemplo, configuramos la dirección del broker (localhost:9092), los serializadores para la clave y el valor (en este