Wie funktioniert die Log Compaction in Apache Kafka und welche Auswirkungen hat sie auf den Consumer-Offset?

Log Compaction in Apache Kafka ist ein Mechanismus, der sicherstellt, dass für jeden Nachrichtenschlüssel nur der letzte bekannte Wert im Log gespeichert wird. Im Gegensatz zur Standard-Retention-Policy, die Daten nach Zeit oder Größe löscht, konzentriert sich die Compaction auf die Schlüssel-Wert-Paare. Dies ist besonders nützlich für die Modellierung von Zuständen (State Stores), bei denen nur der aktuelle Wert einer Entität relevant ist.

Der Prozess wird durch den log.cleaner-Thread gesteuert. Dieser scannt die Log-Segmente und identifiziert Duplikate desselben Schlüssels. Ältere Versionen desselben Schlüssels werden markiert und in einem neuen, bereinigten Segment weggelassen.

Die Unterschiede zur klassischen Löschstrategie lassen sich wie folgt zusammenfassen:

MerkmalDelete Policy (Standard)Compact Policy
LöschkriteriumZeit (log.retention.hours) oder GrößeSchlüssel-Duplikate
DatenverlustÄlteste Datensätze werden entferntHistorische Werte desselben Schlüssels verschwinden
Primärer AnwendungsfallEvent-Streaming, TelemetrieDatenbank-Snapshots, Konfigurationen
Log-StrukturKontinuierlich abnehmendBehält mindestens einen Wert pro Key

Bezüglich des Consumer-Offsets führt Log Compaction zu Lücken in der Sequenz der Offsets. Wenn ein Consumer eine Partition liest und auf einen Offset stößt, der durch die Compaction entfernt wurde, springt der Kafka-Client automatisch zum nächsten verfügbaren Offset im Log.

Für den Consumer bedeutet dies, dass er keine Fehlermeldung erhält, sondern einfach die älteren Versionen des Schlüssels überspringt. In unseren Projekten im Bereich IT-Consulting & Digitale Strategie implementieren wir diesen Ansatz häufig, um die Wiederherstellungszeit von State-Stores nach einem Neustart zu verkürzen, da der Consumer nicht das gesamte historische Event-Log lesen muss, sondern nur den kompaktierten Endzustand.

Es ist jedoch zu beachten, dass Tombstones (Nachrichten mit null-Wert) genutzt werden müssen, um einen Schlüssel vollständig aus dem kompaktierten Log zu entfernen. Ohne Tombstone bleibt der letzte bekannte Wert dauerhaft gespeichert.

Wir empfehlen, Log Compaction ausschließlich für die Speicherung von Zuständen einzusetzen und niemals für Event-Streams, bei denen die zeitliche Abfolge oder die Historie aller Änderungen für die Geschäftslogik relevant ist.

Sergej Wiens

Sergej Wiens

Gründer & Software Architekt