Travailler avec Kafka en Java : bibliothèques, configuration et exemples de code
\n\nApache Kafka est une plateforme distribuée de streaming de données largement utilisée pour construire des systèmes de messagerie à forte charge, la collecte de logs, le traitement d'événements en temps réel et l'intégration de microservices. Dans l'écosystème Java, Kafka occupe une place particulière grâce à la bibliothèque officielle Kafka Clients et à de nombreux outils supplémentaires. Dans cet article, nous allons détailler comment travailler avec Kafka en Java, quelles bibliothèques utiliser, et fournir des exemples de code pratiques.
\n\nBibliothèques principales pour travailler avec Kafka en Java
\n\nPour intégrer des applications Java avec Apache Kafka, il existe plusieurs bibliothèques clés :
\n\n- \n
- Kafka Clients — la bibliothèque officielle d'Apache, fournissant une API pour les producteurs (Producer) et les consommateurs (Consumer). C'est le moyen le plus simple et le plus fiable d'interagir avec les brokers. \n
- Spring Kafka — une extension pour Spring Framework qui simplifie la configuration et l'utilisation de Kafka via des annotations et des modèles (KafkaTemplate, @KafkaListener). \n
- Kafka Streams — une bibliothèque pour construire des applications de streaming (stream processing) en Java, sans nécessiter Spark ou Flink. Elle permet le filtrage, l'agrégation et la jointure de flux. \n
- Akka Streams Kafka (Alpakka) — une bibliothèque réactive pour travailler avec Kafka basée sur Akka Streams, adaptée aux applications asynchrones et non bloquantes. \n
Dans ce guide, nous nous concentrerons sur la bibliothèque officielle Kafka Clients, car elle constitue la base de tous les autres outils.
\n\nAjout des dépendances (Maven)
\n\nPour commencer, ajoutez la dépendance suivante dans votre pom.xml :
<dependency>\n <groupId>org.apache.kafka</groupId>\n <artifactId>kafka-clients</artifactId>\n <version>3.7.0</version>\n</dependency>\n\nSi vous utilisez Gradle, ajoutez :
\n\nimplementation 'org.apache.kafka:kafka-clients:3.7.0'\n\nConfiguration du producteur (Producer)
\n\nLe producteur envoie des messages aux topics Kafka. Voici un exemple simple de création et d'envoi d'un message.
\n\nimport org.apache.kafka.clients.producer.*;\nimport java.util.Properties;\n\npublic class SimpleProducer {\n public static void main(String[] args) {\n // Configuration des propriétés du producteur\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"); // Attente de confirmation de toutes les répliques\n props.put("retries", 3); // Nombre de tentatives en cas d'erreur\n\n // Création du producteur\n Producer<String, String> producer = new KafkaProducer<>(props);\n\n // Envoi du message\n ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key1", "Bonjour, Kafka depuis Java !");\n producer.send(record, (metadata, exception) -> {\n if (exception == null) {\n System.out.println("Message envoyé au topic : " + metadata.topic() +\n ", partition : " + metadata.partition() +\n ", offset : " + metadata.offset());\n } else {\n System.err.println("Erreur d'envoi : " + exception.getMessage());\n }\n });\n\n // Fermeture du producteur\n producer.close();\n }\n}\n\nDans cet exemple, nous définissons l'adresse du broker (localhost:9092), les sérialiseurs pour la clé et la valeur (dans ce