Votre progression

Continuez pour débloquer la suite !
0 / 0 étapes complétées 0
%

Syllabus

  1. Description

  2. Objectifs

  3. Validations de compétences

  4. Public cible

    Aucun public cible spécifié pour ce module.

  5. Besoins techniques

  6. Prérequis

    • Aucun prérequis
  7. Niveau

  8. Historique du module

    Aucune action enregistrée
  1. Introduction à Apache Kafka

    Introduction à Apache Kafka

    1. Historique et origines

      Apache Kafka a été créé en 2010 par LinkedIn pour résoudre les problèmes de gestion des données en temps réel. Son développement a été initié par Jay Kreps, Neha Narkhede et Jun Rao. Le projet a été open-sourcé en 2011 et est devenu un projet de la Fondation Apache en 2012.

      Kafka a été conçu pour répondre aux besoins spécifiques de LinkedIn en matière de traitement de données en temps réel, notamment pour la collecte de logs, les métriques, et les flux de données utilisateur.

    2. Qu'est-ce que Kafka ?

      Apache Kafka est une plateforme distribuée de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d'enregistrement en temps réel. Elle est conçue pour gérer des flux de données provenant de plusieurs sources et les fournir à plusieurs utilisateurs simultanément.

      Kafka est une solution Open Source de diffusion de données en continu, capable de publier, stocker, traiter et souscrire à des flux d'enregistrement en temps réel.

      Architecture de base

      graph LR
          P[Producteurs] -->|publient| T[Topics]
          T --> B[(Brokers
      partitions)] B --> C[Consommateurs] B --> C

      Schéma : les producteurs publient dans des topics, les brokers les stockent dans leurs partitions, les consommateurs les lisent.

      L'architecture de Kafka est composée de quatre composants principaux :

      • Producteurs : Envoient des données dans les topics
      • Topics : Stockent les données dans des partitions
      • Brokers : Gèrent le stockage et la distribution des données
      • Consommateurs : Reçoivent et traitent les données
    3. Cas d'utilisation courants

      • Systèmes de log en temps réel : Collecte et analyse des logs d'applications et de serveurs
      • Événements utilisateur : Suivi des actions des utilisateurs dans les applications web et mobiles
      • Monitoring et métriques : Collecte et analyse des données de performance
      • Intégration de données : Synchronisation entre différents systèmes et bases de données
      • Applications IoT : Gestion des données provenant de capteurs et dispositifs connectés
      • Plateformes e-commerce : Gestion des événements de panier, commandes et recommandations
    4. Architecture de base

      L'architecture de Kafka repose sur plusieurs composants clés :

      • Brokers : Les nœuds du cluster qui stockent et gèrent les données
      • Topics : Les canaux de communication entre producteurs et consommateurs
      • Partitions : Les unités de stockage dans les topics qui permettent la parallélisation
      • Producteurs : Les applications qui envoient des données
      • Consommateurs : Les applications qui lisent les données
  2. Architecture

    Architecture de base

    1. Vue d'ensemble

      graph TB
          subgraph Producteurs
              P1[App A]
              P2[App B]
          end
          subgraph Cluster
              B1[(Broker 1)]
              B2[(Broker 2)]
              B3[(Broker 3)]
          end
          subgraph Consommateurs
              C1[Traitement 1]
              C2[Traitement 2]
          end
          P1 --> B1
          P2 --> B2
          B1 --> C1
          B2 --> C2
          B3 --> C1
      

      Vue d'ensemble : plusieurs producteurs alimentent un cluster de brokers, réparti vers les consommateurs.

      Kafka est conçu comme une plateforme distribuée, composée de plusieurs composants interconnectés qui travaillent ensemble pour gérer les flux de données.

    2. Les composants principaux

      Architecture détaillée

      graph LR
          P[Producteurs] -->|append| L[Partition leader]
          L --> F1[Réplique 1]
          L --> F2[Réplique 2]
          Z[Zookeeper / KRaft] -.coordination.-> L
      

      Composants : un topic est découpé en partitions, chaque partition est répliquée sur plusieurs brokers, un coordinateur (Zookeeper ou KRaft) maintient l'état du cluster.

      L'architecture de Kafka est composée de plusieurs composants interconnectés :

      • Broker : Serveur qui stocke et gère les données
      • Partitions : Unités de stockage qui divisent les topics
      • Producteurs : Applications qui envoient des données
      • Consommateurs : Applications qui reçoivent et traitent les données
      • Zookeeper : Service de coordination et de configuration

      Réplication

      graph LR
          L[(Partition 0 - leader)] --> R1[(Réplique 1)]
          L --> R2[(Réplique 2)]
          R1 -.réplication.-> L
          R2 -.réplication.-> L
      

      Réplication : le leader reçoit les écritures et les réplique aux followers ; en cas de panne, un follower est élu leader.

      La réplication est un mécanisme essentiel de Kafka qui assure la durabilité et la tolérance aux pannes. Chaque partition est répliquée sur plusieurs brokers, avec un broker leader et plusieurs brokers followers.

      Groupes de consommateurs

      graph LR
          T[(Topic - 3 partitions)] --> G1[Groupe A]
          T --> G2[Groupe B]
          G1 --> C1[Consommateur 1]
          G1 --> C2[Consommateur 2]
          G2 --> C3[Consommateur 3]
      

      Groupes de consommateurs : chaque partition est assignée à un seul consommateur d'un groupe ; deux groupes différents relisent donc chacun la totalité du topic.

      Les groupes de consommateurs permettent de répartir la charge de traitement entre plusieurs consommateurs. Chaque partition est assignée à un seul consommateur par groupe, garantissant ainsi une consommation exclusive des messages.

      Brokers

      • Serveurs qui stockent et gèrent les données
      • Chaque broker peut gérer plusieurs topics et partitions
      • Peuvent être répliqués pour la haute disponibilité

      Topics

      • Canaux de communication logiques
      • Organisés en partitions pour le parallélisme
      • Peuvent être répliqués pour la durabilité

      Partitions

      • Unités de stockage dans les topics
      • Chaque partition est un flux ordonné de messages
      • Permettent le parallélisme de la consommation

      Producteurs

      • Applications qui envoient des données
      • Peuvent spécifier la partition cible
      • Supportent différents modes de confirmation

      Consommateurs

      • Applications qui lisent les données
      • S'abonnent à un ou plusieurs topics
      • Peuvent faire partie de groupes de consommateurs

      Zookeeper (pour les versions < 3.0)

      • Gestionnaire de configuration et de coordination
      • Coordonne les brokers et les topics
      • Stocke les informations de cluster
    3. Modèle de données

      Topics et Partitions

      graph LR
          TP[Topic commandes] --> P0[Partition 0]
          TP --> P1[Partition 1]
          TP --> P2[Partition 2]
          P0 --> M0[Messages 0-99]
          P1 --> M1[Messages 100-199]
          P2 --> M2[Messages 200-299]
      

      Topics et partitions : un topic est un découpage ordonné de partitions ; chaque partition est ordonnée mais il n'y a pas d'ordre global entre partitions.

      • Chaque topic est divisé en plusieurs partitions
      • Les messages sont distribués entre les partitions
      • Les partitions permettent le parallélisme

      Messages et Offsets

      • Les messages sont immuables
      • Chaque message a un offset unique
      • Les offsets permettent le suivi de la progression

      Organisation des données

      • Les messages sont stockés par ordre d'arrivée
      • Les offsets garantissent l'ordre des messages
      • Les données sont conservées pendant une période configurable
    4. Groupes de consommateurs

      Principe de base

      • Les consommateurs appartiennent à des groupes
      • Chaque groupe peut avoir plusieurs consommateurs
      • Les messages sont distribués entre les consommateurs d'un groupe

      Répartition des partitions

      • Les partitions sont réparties entre les consommateurs
      • Un seul consommateur par partition dans un groupe
      • La répartition est gérée automatiquement

      Scénarios

      • Si moins de consommateurs que de partitions : certains consommateurs lisent plusieurs partitions
      • Si plus de consommateurs que de partitions : certains consommateurs restent inactifs
      • Les groupes différents peuvent lire les mêmes messages
    5. Scalabilité et haute disponibilité

      Scalabilité horizontale

      • Ajout de nouveaux brokers
      • Augmentation du nombre de partitions
      • Équilibrage automatique des charges

      Réplication

      • Chaque partition peut être répliquée
      • Un leader par partition
      • Les followers répliquent les données

      Tolérance aux pannes

      • Les leaders peuvent changer
      • Les données sont conservées
      • Les consommateurs peuvent continuer à travailler
  3. Fonctionnalités

    Les fonctionnalités clés de Kafka

    1. Pub / Sub (Publication/Subscription)

      Kafka utilise le modèle pub/sub, où les producteurs envoient des messages dans un topic et les consommateurs peuvent s'abonner à ce topic pour recevoir les messages. Cela permet une communication asynchrone et découplée entre les applications.

      Avantages

      • Découplage des producteurs et consommateurs
      • Flexibilité dans l'ajout de nouveaux consommateurs
      • Communication asynchrone

      Exemples d'implémentation

      Caractéristiques avancées

      • Configuration avancée : Paramètres de performance et de fiabilité
      • Opérations asynchrones : Gestion des callbacks et des Futures
      • Transformation des données : Fonctions personnalisées et filtrage
      • Gestion des erreurs : Try et gestion des exceptions
      • Optimisations : Batch processing et mémoire tampon

      Exemple d'utilisation

      Voici un exemple d'utilisation simple :

      // Producteur
      Properties props = new Properties();
      props.put("bootstrap.servers", "localhost:9092");
      props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
      props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
      
      Producer<String, String> producer = new KafkaProducer<>(props);
      String logMessage = "[ERROR] " + new Date() + " - Une erreur s'est produite";
      ProducerRecord<String, String> record = new ProducerRecord<>("logs-topic", "server-1", logMessage);
      producer.send(record);
      
      // Consommateur
      Properties props = new Properties();
      props.put("bootstrap.servers", "localhost:9092");
      props.put("group.id", "my-group");
      props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
      props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
      
      KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
      consumer.subscribe(Collections.singletonList("logs-topic"));
      
      while (true) {
          ConsumerRecords<String, String> records = consumer.poll(100);
          for (ConsumerRecord<String, String> record : records) {
              System.out.println(record.value());
          }
          consumer.commitSync();
      }
      
    2. Durabilité

      Kafka offre une haute durabilité grâce à la réplication des partitions sur plusieurs brokers. Tu peux configurer le nombre de réplicas pour chaque topic. Un des réplicas est désigné comme le leader (pour les opérations de lecture et d'écriture), et les autres sont des followers qui répliquent les données du leader. Les messages sont stockés sur disque et peuvent être archivés pour garantir la persistance des données, même en cas de redémarrage des brokers.

      Configuration

      • replication.factor : Nombre de réplicas par partition
      • min.insync.replicas : Nombre minimum de réplicas qui doivent confirmer l'écriture
      • log.retention.hours : Durée de rétention des messages

      Exemple de configuration

      // Création d'un topic avec réplication
      kafka-topics.sh --create --topic my-topic --partitions 3 --replication-factor 3 --bootstrap-server localhost:9092
    3. Tolérance aux pannes

      Kafka est conçu pour être tolérant aux pannes. En cas d'arrêt d'un broker, les partitions qu'il héberge (et qui sont leaders) sont reprises par l'un des brokers contenant une réplique à jour (un follower devient le nouveau leader). Les consommateurs et producteurs continuent à interagir avec les partitions restantes sans interruption significative.

      Stratégies de récupération

      • Élection automatique du nouveau leader
      • Redistribution des partitions
      • Reprise automatique des consommateurs

      Best practices

      • Utiliser un facteur de réplication ≥ 3 en production
      • Surveiller les métriques de latence
      • Configurer des alertes pour les pannes de brokers
    4. Scalabilité

      Kafka scale horizontalement en ajoutant simplement de nouveaux brokers au cluster. De plus, la division des topics en partitions permet de distribuer la charge de travail entre plusieurs brokers et consommateurs au sein d'un même groupe, atteignant ainsi un haut débit de traitement. Le nombre de partitions peut être ajusté (avec précaution) pour répondre à l'évolution de la demande.

      Stratégies de scalabilité

      • Ajout de brokers
      • Augmentation du nombre de partitions
      • Configuration optimale des groupes de consommateurs

      Exemple de monitoring

      // Métriques importantes à surveiller
      - broker:messages-in-per-sec
      - broker:bytes-in-per-sec
      - broker:bytes-out-per-sec
      - consumer:lag
    5. Temps de réponse faible

      Kafka est conçu pour offrir des temps de réponse très courts (faible latence), ce qui en fait un outil idéal pour les applications réactives et les processus en temps quasi-réel.

      Optimisations de latence

      • Configuration des timeouts
      • Optimisation des batch sizes
      • Configuration du nombre de threads

      Exemple de configuration

      // Configuration pour la latence
      Properties props = new Properties();
      props.put("linger.ms", "1");
      props.put("batch.size", "16384");
      props.put("compression.type", "gzip");
    6. Sérialisation et Desérialisation

      Kafka est agnostique au format des données. Cependant, pour une interopérabilité et une évolution des schémas efficaces, l'utilisation de formats de sérialisation structurés comme Avro, Protocol Buffers ou JSON Schema est fortement recommandée. Kafka utilise des Serializers pour convertir les objets en flux d'octets avant l'envoi et des Deserializers pour effectuer l'opération inverse à la réception.

      Exemples de sérialisation

      // Avro
      public class User {
          private String name;
          private int age;
          // getters et setters
      }
      
      // Configuration
      Properties props = new Properties();
      props.put("key.serializer", "io.confluent.kafka.serializers.KafkaAvroSerializer");
      props.put("value.serializer", "io.confluent.kafka.serializers.KafkaAvroSerializer");
      
    7. Garanties de livraison

      Kafka offre différentes garanties de livraison configurables :

      • At most once (au plus une fois) : Les messages peuvent être perdus mais ne sont jamais redélivrés.
      • At least once (au moins une fois) : Les messages peuvent être redélivrés, mais ne sont jamais perdus. C'est la configuration par défaut et la plus courante.
      • Exactly once (exactement une fois) : Chaque message est délivré une seule fois aux consommateurs. Ceci est plus complexe à configurer et peut impacter le débit, mais est crucial pour certains cas d'utilisation (transactions financières, par exemple).

      Configuration

      // Configuration pour exactly-once
      Properties props = new Properties();
      props.put("enable.idempotence", "true");
      props.put("transactional.id", "my-transaction-id");
      
  4. Exemples concrets

    Architecture d'exemple : Traitement des logs en temps réel

    Dans une application web, les logs sont générés par le serveur et doivent être stockés et analysés en temps réel. Kafka peut être utilisé pour :

    • Décharger les logs depuis le serveur web (en tant que producteurs).
    • Stocker les logs dans un topic Kafka.
    • Analyser en temps réel via un outil comme Apache Flink ou Spark Streaming (en tant que consommateurs). Ces outils peuvent lire les logs depuis Kafka, effectuer des agrégations, détecter des anomalies et alerter si nécessaire.

    Topologie d'exemple : Événements e-commerce

    Dans une plateforme de e-commerce, les événements tels que les clics, les ajouts au panier et les commandes sont générés. Kafka peut être utilisé pour :

    • Envoyer les événements à travers différents systèmes (comme un système de panier, un système de paiement, un système de recommandation, etc.) en publiant chaque type d'événement dans un topic dédié ou en utilisant un format d'événement unifié.
    • Générer des rapports en temps réel sur le trafic, les ventes et le comportement des utilisateurs en consommant les flux d'événements.
    • Déclencher des offres promos personnalisées basées sur les comportements des utilisateurs en analysant les flux d'événements en temps réel avec Kafka Streams ou d'autres moteurs de traitement de flux.

    Code d'exemple : Configuration de base en Java

    // Configuration du producteur
    Properties props = new Properties();
    props.put("bootstrap.servers", "localhost:9092");
    props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
    
    try (Producer<String, String> producer = new KafkaProducer<>(props)) {
        ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "log-id-1", "message-1");
        producer.send(record);
        System.out.println("Message envoyé !");
    } catch (Exception e) {
        e.printStackTrace();
    }
    
    // Configuration du consommateur
    Properties consumerProps = new Properties();
    consumerProps.put("bootstrap.servers", "localhost:9092");
    consumerProps.put("group.id", "my-group");
    consumerProps.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    consumerProps.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
    consumerProps.put("auto.offset.reset", "latest"); // ou "earliest" pour lire depuis le début
    
    try (KafkaConsumer<String, String> consumer = new KafkaConsumer<>(consumerProps)) {
        consumer.subscribe(Collections.singletonList("my-topic"));
        
        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
            for (ConsumerRecord<String, String> record : records) {
                System.out.printf("Offset = %d, Key = %s, Value = %s%n", 
                    record.offset(), record.key(), record.value());
            }
        }
    }
  5. Implémentation pratique

    Implémentation pratique de Kafka

    1. Installation et configuration

      Prérequis

      • Java 8 ou supérieur : Kafka nécessite Java 8 ou une version plus récente
      • Zookeeper (versions < 3.0) : Gestionnaire de configuration et de coordination
      • Ports disponibles :
        • 9092 : Port par défaut pour Kafka
        • 2181 : Port par défaut pour Zookeeper
      • Espace disque : Au moins 100GB recommandé pour le stockage des données
      • Mémoire RAM : Minimum 8GB recommandé pour chaque broker

      Installation

      # Télécharger la dernière version stable
      wget https://downloads.apache.org/kafka/3.4.0/kafka_2.13-3.4.0.tgz
      
      # Décompresser
      mkdir kafka && tar -xzf kafka_2.13-3.4.0.tgz -C kafka --strip-components 1
      
      # Démarrer Zookeeper (pour les versions < 3.0)
      bin/zookeeper-server-start.sh config/zookeeper.properties
      
      # Démarrer Kafka
      bin/kafka-server-start.sh config/server.properties

      Configuration

      Les fichiers de configuration principaux sont :

      • server.properties : Configuration du broker
      • zookeeper.properties : Configuration de Zookeeper

      Exemple de configuration

      Exemple complet de configuration

      Paramètres importants

      • broker.id : Identifiant unique du broker
      • log.dirs : Répertoire de stockage des données
      • num.partitions : Nombre de partitions par défaut
      • replica.fetch.max.bytes : Taille maximale des requêtes de réplication
    2. Administration

      Commandes utiles

      # Créer un topic
      bin/kafka-topics.sh --create --topic my-topic --partitions 3 --replication-factor 1 --bootstrap-server localhost:9092
      
      # Lister les topics
      bin/kafka-topics.sh --list --bootstrap-server localhost:9092
      
      # Voir les détails d'un topic
      bin/kafka-topics.sh --describe --topic my-topic --bootstrap-server localhost:9092
      
      # Produire des messages
      bin/kafka-console-producer.sh --broker-list localhost:9092 --topic my-topic
      
      # Consommer des messages
      bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic my-topic --group my-group --from-beginning

      Monitoring

      Kafka expose des métriques JMX qui peuvent être surveillées avec des outils comme Prometheus et Grafana.

      Métriques importantes

      • Broker metrics :
        • messages-in-per-sec
        • bytes-in-per-sec
        • bytes-out-per-sec
      • Consumer metrics :
        • lag
        • records-consumed-rate
        • records-lag-max

      Alertes recommandées

      • Latence élevée des requêtes
      • Partitions non répliquées
      • Brokers hors ligne
      • Retard de consommation
    3. Meilleures pratiques

      Configuration des topics

      • Utiliser des topics dédiés pour différents types de données
      • Configurer correctement le nombre de partitions en fonction du débit attendu
      • Utiliser des groupes de consommateurs distincts pour des usages différents
      • Surveiller les métriques de latence et de débit
      • Mettre en place une stratégie de rétention des données adaptée

      Performance

      • Optimiser la taille des batches
      • Utiliser la compression
      • Configurer correctement les timeouts
      • Optimiser le nombre de threads

      Sécurité

      • Activer SSL/TLS pour la communication
      • Utiliser les ACLs pour contrôler l'accès
      • Configurer l'authentification
      • Protéger les données sensibles
    4. Scalabilité

      Ajout de brokers

      # Ajouter un nouveau broker
      bin/kafka-server-start.sh config/server.properties

      Rebalancement des partitions

      # Créer un fichier de configuration
      bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --generate --topics-to-move-json-file topics-to-move.json --broker-list "0,1,2" --broker-list "0,1,2,3"
      
      # Appliquer le rebalancement
      bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --execute --reassignment-json-file reassign.json

      Monitoring du rebalancement

      bin/kafka-reassign-partitions.sh --zookeeper localhost:2181 --verify --reassignment-json-file reassign.json

      Meilleures pratiques

      • Planifier le rebalancement pendant les heures creuses
      • Surveiller les métriques pendant le rebalancement
      • Tester le rebalancement sur un environnement de test
      • Documenter les changements
    1. Télécharger la dernière version stable depuis le site officiel Apache Kafka.

          
          # Décompression de l'archive
          $ tar -xzf kafka_2.13-3.4.0.tgz
          $ cd kafka_2.13-3.4.0
      
          # Démarrage de Zookeeper (pour les versions < 3.0)
          $ bin/zookeeper-server-start.sh config/zookeeper.properties
      
          # Démarrage de Kafka
          $ bin/kafka-server-start.sh config/server.properties
          
      
    2. Configuration

      Les fichiers de configuration principaux sont :

      • server.properties : Configuration du broker
      • zookeeper.properties : Configuration de Zookeeper
    3. Administration

      1. Commandes utiles

            
            # Créer un topic
            $ bin/kafka-topics.sh --create --topic my-topic --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1
        
            # Lister les topics
            $ bin/kafka-topics.sh --list --bootstrap-server localhost:9092
        
            # Voir les détails d'un topic
            $ bin/kafka-topics.sh --describe --topic my-topic --bootstrap-server localhost:9092
        
            # Produire des messages
            $ bin/kafka-console-producer.sh --topic my-topic --bootstrap-server localhost:9092
        
            # Consommer des messages
            $ bin/kafka-console-consumer.sh --topic my-topic --bootstrap-server localhost:9092 --from-beginning
            
        
      2. Monitoring

        Kafka expose des métriques JMX qui peuvent être surveillées avec des outils comme Prometheus et Grafana.

    4. Meilleures pratiques

      1. Utiliser des topics dédiés pour différents types de données
      2. Configurer correctement le nombre de partitions en fonction du débit attendu
      3. Utiliser des groupes de consommateurs distincts pour des usages différents
      4. Surveiller les métriques de latence et de débit
      5. Mettre en place une stratégie de rétention des données adaptée

    Garanties de livraison

    Kafka offre différentes garanties de livraison configurables :
    • At most once (au plus une fois) : Les messages peuvent être perdus mais ne sont jamais redélivrés.
    • At least once (au moins une fois) : Les messages peuvent être redélivrés, mais ne sont jamais perdus. C'est la configuration par défaut et la plus courante.
    • Exactly once (exactement une fois) : Chaque message est délivré une seule fois aux consommateurs. Ceci est plus complexe à configurer et peut impacter le débit, mais est crucial pour certains cas d'utilisation (transactions financières, par exemple).
  6. Conseils de conception

    Conception des topics et partitions

    • Définition des topics : Conçoivez les topics en fonction des flux de données et des besoins des consommateurs. Privilégiez des topics spécifiques pour différents types d'événements ou de données, en tenant compte de la granularité nécessaire pour vos consommateurs.
    • Nombre de partitions : Le nombre de partitions détermine le parallélisme de la consommation. Un nombre plus élevé permet à plus de consommateurs de travailler en parallèle, mais peut entraîner une surcharge de gestion. Basez-vous sur le débit attendu et le nombre de consommateurs prévus.
    • Réplication : Essentielle pour la haute disponibilité, un facteur de réplication de 3 est courant en production, créant 3 copies de chaque partition sur différents brokers, au prix d'une utilisation accrue de l'espace disque.

    Paramètres clés

    • Équilibrage de charge : Assurez une distribution uniforme des messages entre les partitions à l'aide d'une clé de partitionnement appropriée pour éviter les "hot partitions".
    • Stratégies de partitionnement : Choisissez soigneusement votre clé de partitionnement. Par défaut, Kafka utilise un algorithme round-robin, mais une clé métier peut garantir que les événements liés sont traités dans l'ordre par le même consommateur.
    • Rétention des données : Configurez la politique de rétention selon vos besoins de conservation (taille ou durée) et prévoyez des stratégies d'archivage vers des systèmes de stockage à long terme (HDFS, S3) si nécessaire.

    Sécurité

    • Authentification SSL/TLS : Chiffrez les communications entre les brokers et les clients pour assurer la confidentialité des données en transit.
    • Autorisation (ACLs) : Utilisez les listes de contrôle d'accès pour définir précisément les autorisations de lecture/écriture sur les topics.
    • Chiffrement des données : Envisagez le chiffrement des données au repos pour une sécurité maximale.
    • Gestion des secrets : Sécurisez la gestion des informations d'identification et des clés d'authentification.
    • Monitoring : Implémentez des systèmes de surveillance pour détecter les accès non autorisés ou les comportements suspects.

    Scalabilité

    • Ajout de brokers : Augmentez la capacité de stockage et le débit en ajoutant des brokers au cluster. Kafka rééquilibre automatiquement les partitions.
    • Gestion des partitions : Augmentez le nombre de partitions pour améliorer le parallélisme (la réduction est plus complexe). Réassigned les partitions dynamiquement pour équilibrer la charge.
    • Surveillance : Surveillez les métriques clés (débit, latence, utilisation des ressources) pour anticiper les besoins de montée en charge.
  7. Commandes pratiques

    Gestion des topics

    Créer un topic

                                    kafka-topics.sh --create \
                                    --topic my-topic \
                                    --partitions 3 \
                                    --replication-factor 1 \
                                    --bootstrap-server localhost:9092
                                    
                                

    Lister les topics

                                    kafka-topics.sh --list --bootstrap-server localhost:9092
                                    
                                

    Décrire un topic

                                    kafka-topics.sh --describe \
                                        --topic my-topic \
                                        --bootstrap-server localhost:9092

    Production et consommation

    Produire des messages

    kafka-console-producer.sh \
                                        --broker-list localhost:9092 \
                                        --topic my-topic

    Tapez vos messages et appuyez sur Entrée pour les envoyer.

    Consommer des messages

    kafka-console-consumer.sh \
                                        --bootstrap-server localhost:9092 \
                                        --topic my-topic \
                                        --group my-group \
                                        --from-beginning
                                    
                                

    L'option --from-beginning permet de lire les messages depuis le début du topic.

    Gestion des consommateurs

    Lister les groupes de consommateurs

    kafka-consumer-groups.sh \
        --list \
        --bootstrap-server localhost:9092

    Affiche la liste de tous les groupes de consommateurs.

    Voir les décalages (offsets) d'un groupe

    kafka-consumer-groups.sh \
        --bootstrap-server localhost:9092 \
        --group my-group \
        --describe

    Affiche les décalages actuels pour chaque partition consommée par le groupe.

    Réinitialiser les offsets d'un groupe

    # Réinitialiser au début (earliest)
    kafka-consumer-groups.sh \
        --bootstrap-server localhost:9092 \
        --group my-group \
        --reset-offsets \
        --to-earliest \
        --execute \
        --topic my-topic
    
    # Réinitialiser à la fin (latest)
    kafka-consumer-groups.sh \
        --bootstrap-server localhost:9092 \
        --group my-group \
        --reset-offsets \
        --to-latest \
        --execute \
        --topic my-topic

    Attention: Cette opération est irréversible. Utilisez --dry-run avant pour voir les changements sans les appliquer.

    Voir le décalage (lag) d'un groupe

    kafka-consumer-groups.sh \
        --bootstrap-server localhost:9092 \
        --group my-group \
        --describe \
        --members \
        --verbose

    Affiche des informations détaillées sur les membres du groupe et leur retard de consommation.

    Supprimer un groupe de consommateurs

    kafka-consumer-groups.sh \
        --bootstrap-server localhost:9092 \
        --delete \
        --group my-group

    Supprime le groupe et toutes ses métadonnées. Les données des topics ne sont pas supprimées.

    Surveillance des consommateurs

    Voir les métriques d'un consommateur

    # Activer JMX pour exposer les métriques
    export KAFKA_JMX_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
    
    # Lancer le consommateur avec JMX
    KAFKA_JMX_OPTS="$KAFKA_JMX_OPTS" kafka-console-consumer.sh \
        --bootstrap-server localhost:9092 \
        --topic my-topic \
        --group my-group

    Connectez-vous avec JConsole ou un outil similaire sur localhost:9999 pour voir les métriques.

    Vérifier la latence de consommation

    kafka-consumer-groups.sh \
        --bootstrap-server localhost:9092 \
        --group my-group \
        --describe \
        | grep -v "LAG 0"

    Affiche uniquement les partitions avec un décalage (lag) supérieur à zéro.

  8. Exemples de cas d'utilisation

    Système de log centralisé : Kafka est largement utilisé comme un pipeline central pour collecter et agréger les logs provenant de diverses sources (applications, serveurs, équipements réseau). Ces logs peuvent ensuite être consommés par des systèmes d'analyse en temps réel, des outils de monitoring ou des systèmes d'sécurité.
    Systèmes de notifications en temps réel : Les notifications push pour des applications mobiles ou web, les alertes par e-mail ou SMS peuvent être envoyées via Kafka. Les producteurs émettent des événements de notification dans un topic, et les différents services de notification (pour iOS, Android, email, SMS) consomment ces événements et envoient les notifications correspondantes.
    Échange de données transactionnelles : Kafka peut être utilisé dans les processus de paiement et de confirmation de commande pour garantir l'ordre et la consécution des opérations. Bien que Kafka ne soit pas une base de données transactionnelle, il peut assurer la livraison ordonnée des événements, ce qui est crucial pour la cohérence des transactions dans des architectures microservices.
    Collecte et traitement de données de capteurs IoT : Dans les applications IoT, un grand nombre de capteurs génèrent des flux de données continus. Kafka peut ingérer ces flux à haute vitesse et les rendre disponibles pour des systèmes de traitement et d'analyse en temps réel (par exemple, pour la surveillance, la maintenance prédictive ou l'optimisation).
    Streaming d'événements pour la micro-architecture : Dans une architecture de microservices, Kafka peut servir de colonne vertébrale pour la communication asynchrone basée sur les événements entre les différents services. Cela permet un découplage fort et une meilleure résilience.
  9. Comparaison avec d'autres technologies

    Apache Kafka vs RabbitMQ

    Points forts de Kafka

    • Débit très élevé
    • Persistance à long terme des messages
    • Idéal pour le traitement de flux en temps réel
    • Meilleur pour l'analyse de données et les architectures événementielles

    Points forts de RabbitMQ

    • Files d'attente traditionnelles avec routage avancé
    • Optimisé pour la gestion des files d'attente
    • Livraison garantie des messages
    • Meilleur pour le traitement asynchrone et l'intégration d'applications

    Apache Kafka vs Apache Pulsar

    Avantages de Kafka

    • Maturité et large adoption
    • Meilleures performances pour les charges de travail simples
    • Écosystème riche d'outils et d'intégrations
    • Documentation abondante et communauté active

    Avantages de Pulsar

    • Architecture séparant stockage et calcul
    • Multi-locataire natif
    • Meilleure évolutivité horizontale
    • Idéal pour les environnements cloud natifs
  10. Quand choisir Kafka ?

    Cas d'utilisation idéaux

    • Traitement de flux en temps réel à grande échelle
    • Persistance des messages à long terme
    • Architectures événementielles
    • Traitement de flux continu
    • Besoins en débit très élevé avec faible latence

    Alternatives à considérer

    • Files d'attente simples : RabbitMQ ou Redis
    • Messagerie temps réel : NATS ou Redis Pub/Sub
    • Environnements cloud natifs : Apache Pulsar
    • Écosystème Microsoft Azure : Event Hubs
    • Écosystème AWS : Amazon Kinesis ou Amazon MSK

Exercices, examens et projets

Exercice

Atelier Big Data

Construire un petit pipeline de données et documenter ses choix.

Obligatoire Consulter
Examen

Examen Big Data

Évaluer la compréhension de l'architecture et des outils.

Obligatoire Consulter
Projet

Projet fil rouge Big Data

Livrer un pipeline reproductible avec ingestion, stockage et restitution.

Livrables :

  • Pipeline
  • Schéma de données
  • Documentation
Obligatoire Consulter