Offsets, commits et gestion de la position de lecture

Comprendre précisément comment Kafka trace la position de lecture, comment commiter correctement et garantir l’absence de pertes ou de doublons.

Contexte

Kafka ne supprime jamais les messages après consommation. Ce qui détermine la progression d’un consommateur, c’est l’offset qu’il a atteint et l’offset qu’il a commité. Un système mal configuré peut créer :

  • des pertes de messages,
  • des doublons dans les traitements,
  • des blocages suite à un rebalance,
  • un lag croissant pouvant saturer les flux.

La maîtrise des offsets est essentielle pour garantir une consommation fiable, idempotente et performante.

Lexique

Offset

Numéro séquentiel d’un message dans une partition Kafka.

Offset commité

Position sauvegardée pour le consumer group dans __consumer_offsets.

Auto-commit

Kafka commite automatiquement l’offset à intervalle régulier.

Manual commit

Le développeur contrôle précisément quand l’offset est confirmé.

Lag

Messages restant à consommer pour être à jour (backlog).

Commandes pratiques

# Consommer un topic avec offset affiché
bin/kafka-console-consumer.sh \
  --bootstrap-server localhost:9092 \
  --topic commandes.ecommerce \
  --group facturation \
  --from-beginning \
  --property print.offset=true

# Visualiser les offsets et le lag d’un consumer group
bin/kafka-consumer-groups.sh \
  --bootstrap-server localhost:9092 \
  --describe \
  --group facturation

# Réinitialiser les offsets au début (repair / replay)
bin/kafka-consumer-groups.sh \
  --bootstrap-server localhost:9092 \
  --group facturation \
  --reset-offsets \
  --to-earliest \
  --all-topics \
  --execute
    

Auto-commit vs commit manuel

Auto-commit

Solution simple, mais dangereuse :

  • Kafka commite automatiquement toutes les 5 secondes,
  • ⚠ peut commiter des messages non traités,
  • convient uniquement pour des cas simples non critiques.
enable.auto.commit=true
auto.commit.interval.ms=5000
    

Commit manuel (recommandé en production)

Le développeur décide quand le message est considéré comme traité.

  • commitSync() → garantit le commit (bloquant)
  • commitAsync() → plus performant mais non garanti
while (true) {
  var records = consumer.poll(Duration.ofMillis(100));

  for (var record : records) {
    process(record); // traitement métier
  }

  consumer.commitSync(); // sécurité + cohérence
}
    
Bonnes pratiques :
  • Évitez auto-commit en production.
  • Utilisez commitSync après un traitement critique.
  • Pour les traitements lourds, commitez par batch (ex : toutes les 50 lignes).
  • Surveillez le lag dans Grafana pour détecter les ralentissements.
  • Sécurisez vos services avec une logique idempotente + DLQ.

Résultat

Vous êtes capable de lire précisément la position de lecture d’un consumer, de contrôler quand commiter, de diagnostiquer un lag et de sécuriser vos traitements même dans un environnement distribué sujet aux crashes et aux rebalances.

Résumé

L’offset est au cœur de la mécanique Kafka. Une gestion rigoureuse garantit une consommation fiable, sans duplicata ni perte. C’est une compétence indispensable pour tous les systèmes event-driven professionnels.

Quiz rapide

  • Quelle différence entre offset lu et offset commité ?
  • Dans quel cas utiliser commitSync() plutôt que commitAsync() ?
  • Quelles sont les causes possibles d’un lag élevé ?

Exercice pratique

Lancez deux consommateurs dans un même consumer group, puis :

  • affichez les offsets avec --describe,
  • réinitialisez les offsets au début,
  • analysez le nouveau comportement de consommation,
  • mettez en place un commit manuel dans un consumer Java.

Navigation

Review My Order

0

Subtotal