Formation Apache Kafka : de zéro à la prod

Kafka broker, topic et partition : les concepts de base — chapitre 0

Les bases indispensables pour maîtriser l’écosystème Kafka et le streaming temps réel.

Leçon gratuite

C’est quoi Kafka ?

Un Kafka broker est un serveur du cluster : il stocke les partitions des topics et répond aux producteurs comme aux consommateurs. Kafka est une plateforme distribuée de streaming d’événements conçue pour traiter des flux de données à grande échelle, en temps réel, avec une fiabilité et une performance exceptionnellement élevées.

  • Publication et consommation de messages en temps réel.
  • Très haut débit et faible latence.
  • Résilience grâce à la réplication et au partitionnement.

Kafka = Messagerie + Journal distribué + Stockage persistant + Scalabilité horizontale

Concepts clés de Kafka

Topic

Catégorie logique des messages (ex : transactions).

Partition

Division d’un topic pour paralléliser le traitement.

Broker

Serveur Kafka stockant les partitions.

Producer

Application qui envoie les messages.

Consumer

Application qui lit les messages.

Consumer Group

Groupe de consumers se partageant les partitions.

Offset

Position d’un message dans une partition.

Partitionnement Kafka

Le partitionnement est la clé de la scalabilité de Kafka. Il permet d’augmenter le débit, de garantir la résilience et d’assurer le parallélisme des traitements.

  • Scalable – le débit augmente avec le nombre de partitions.
  • Rapide – traitement parallèle.
  • Fiable – réplication automatique.

1. Principe

Un topic est divisé en plusieurs partitions réparties sur plusieurs brokers. Chaque message appartient à une seule partition.

2. Clé de partition

  • Kafka utilise partition = murmur2(key) % nombre_de_partitions
  • Même clé → même partition → ordre garanti
  • Sans clé → partitionneur « sticky » : un lot entier sur une partition, puis la suivante (équilibrage, mais pas d’ordre)

3. Parallélisme

Dans un consumer group :

  • 1 partition = 1 seul consumer du groupe à la fois (un consumer peut en lire plusieurs ; les consumers en surplus restent inactifs)
  • En cas de panne → redistribution automatique

4. Réplication

  • 1 leader : écritures / lectures (les followers peuvent servir les lectures si l’on active le « fetch from follower », KIP-392)
  • Plusieurs followers : répliques synchronisées
  • Failover automatique

5. Orchestration

  • Jusqu’à Kafka 3.x → ZooKeeper (KRaft disponible en test dès 2.8, prêt pour la production en 3.3)
  • Kafka 4.0+ → KRaft uniquement (quorum de contrôleurs interne, ZooKeeper supprimé)

6. Exemple de configuration

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

Bonnes pratiques

À retenir

  • Augmenter les partitions pour augmenter le débit.
  • Utiliser une clé logique pour maintenir l’ordre (ex : clientId).
  • Réplication ≥ 3 pour haute disponibilité.
  • Vérifier la distribution équitable des partitions.

Kafka = Topic → Partitions → Brokers → Consumers
Clé → ordre • Partitions → scalabilité • Réplication → tolérance aux pannes

Questions diverses

C’est quoi le Round-Robin dans Kafka ?

Ancien comportement sans clé : un message par partition, à tour de rôle. Depuis Kafka 2.4, le producteur utilise un partitionneur « sticky » (remplit un lot sur une partition puis change), ce qui donne des lots plus gros et un meilleur débit. Dans les deux cas, aucun ordre n’est garanti.

Kafka vs File de messages classique

Kafka conserve les messages (log persistant). RabbitMQ (files classiques) supprime le message une fois acquitté. Kafka permet la relecture à tout moment via les offsets.

Offset vs Partition

La partition est l’unité physique de stockage. L’offset est la position du message dans cette partition.

Le schéma : topic, partitions et offsets

Producteurclé = id clientP0 · client A0123456P1 · client B01234P2 · client C012345consommateur : lit l’offset 4 de P2L’ordre est garanti dans une partition, pas entre partitionsMême clé → même partition → ordre des événements d’un client préservé
Schéma Un topic, trois partitions, des offsets

Comment lire le schéma

  • Chaque ligne est une partition : un journal où les messages s’ajoutent à droite. Le numéro dans chaque case est l’offset, la position du message.
  • Le producteur choisit la partition grâce à la clé : tous les événements du client A vont dans P0, dans l’ordre où ils ont été produits.
  • La case jaune est le dernier message écrit. Les cases pointillées sont les positions futures.
  • Le consommateur ne « prend » pas le message : il lit à un offset et avance. Le message reste disponible pour les autres lecteurs.

Sous le capot : une partition sur le disque

Une partition n’est pas une abstraction : c’est un dossier sur le disque du broker, par exemple /var/lib/kafka/node1/orders-0/. Il contient des segments :

FichierRôle
00000000000000000000.logLes messages eux-mêmes, à la suite. Le nom = offset du premier message du segment
.indexIndex offset → position dans le fichier, pour retrouver un message vite
.timeindexIndex date → offset, utilisé pour relire « depuis hier 10 h »
leader-epoch-checkpointHistorique des leaders, pour réparer les répliques après une panne
  • Quand un segment atteint segment.bytes (1 Go par défaut) ou segment.ms (7 jours), Kafka en ouvre un nouveau. La rétention supprime des segments entiers, jamais un message isolé.
  • La partition est choisie par murmur2(clé) % nombre_de_partitions. Conséquence : augmenter le nombre de partitions change la destination des clés et casse l’ordre par client. Choisissez-le bien dès le départ.
  • Sans clé, le producteur remplit une partition par lot puis passe à la suivante (partitionneur « sticky ») : bon débit, mais aucun ordre garanti.

Lab VM Ubuntu : voir une partition de ses propres yeux

Environnement du lab

VM Ubuntu 24.04 · 4 vCPU · 8 Go RAM · 40 Go SSD · cluster Kafka 4.4 à 3 nœuds KRaft installé au Chapitre 1 (ports 9092, 9094, 9096). Les chiffres donnés sont des ordres de grandeur : ils dépendent de votre VM.

kafka-lab.sh status   # le cluster du Chapitre 1 doit être UP
kafka-topics.sh --bootstrap-server localhost:9092 --create --topic lab-orders --partitions 3 --replication-factor 3
# 100 000 commandes réparties sur 1 000 clients (format clé|valeur)
seq 1 100000 | awk '{printf "client-%d|{\"order\":%d,\"amount\":%d}\n", $1%1000, $1, ($1*7)%500}' > /tmp/orders.txt
kafka-console-producer.sh --bootstrap-server localhost:9092 --topic lab-orders \
  --property parse.key=true --property key.separator='|' < /tmp/orders.txt
# Où sont les messages ?
ls -lh /var/lib/kafka/node1/lab-orders-0/
kafka-dump-log.sh --files /var/lib/kafka/node1/lab-orders-0/00000000000000000000.log --print-data-log | head -20

Vérifiez qu’un même client tombe toujours dans la même partition :

# Le consommateur affiche "Partition:N<TAB>clé<TAB>valeur"
kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic lab-orders --from-beginning \
  --property print.key=true --property print.partition=true --max-messages 100000 2>/dev/null \
  | awk -F'\t' '$2 == "client-42" {print $1}' | sort | uniq -c
# Attendu : une seule ligne, par ex. "    100 Partition:1"
Ce que vous observezPourquoi
Environ 33 000 messages par partition1 000 clés réparties par le hachage
client-42 apparaît dans une seule partition (100 fois)Même clé → même partition
Le .log fait quelques Mo, le .index quelques KoL’index est « clairsemé » : une entrée tous les 4 Ko de données

À tester en plus

Passez le topic à 6 partitions (kafka-topics.sh --alter --partitions 6), renvoyez le fichier, et regardez où tombe maintenant client-42. Vous venez de voir pourquoi on ne change pas le nombre de partitions d’un topic où l’ordre compte.

Astuce d’expert : la partition chaude

  • Une clé très fréquente (un gros client, un null mal géré transformé en "unknown") envoie tout son trafic sur une seule partition : un seul consumer travaille, les autres attendent. Surveillez le débit par partition, pas seulement par topic.
  • Règle de départ pour le nombre de partitions : débit cible ÷ débit d’un consumer, arrondi vers le haut à un multiple du nombre de brokers (ex. 6 ou 12 sur 3 brokers). Trop de partitions coûte aussi : plus de fichiers ouverts, des rééquilibrages et des élections plus longues.

Suivez votre progression. Créez un compte gratuit pour cocher vos leçons et reprendre là où vous en étiez.

Créer un compte gratuit