Was ist der technische Unterschied zwischen 'At-least-once' und 'Exactly-once' Delivery in Kafka-Producer-Konfigurationen?

At-least-once Delivery stellt sicher, dass jede Nachricht mindestens einmal im Kafka-Broker ankommt. Technisch wird dies durch die Kombination aus acks (Bestätigungen) und retries erreicht. Wenn der Producer nach dem Senden einer Nachricht keine Bestätigung vom Broker erhält – etwa aufgrund eines Netzwerk-Timeouts –, sendet er die Nachricht erneut. Tritt der Fehler jedoch erst nach dem Schreiben auf den Broker, aber vor dem Erhalt des ACKs auf, führt dies zu Duplikaten im Log.

Exactly-once Delivery (EOS) verhindert diese Duplikate durch die Implementierung von Idempotenz und optionalen Transaktionen. Ein idempotenter Producer erhält vom Broker eine eindeutige Producer-ID (PID), und jede Nachricht wird mit einer monoton steigenden Sequenznummer versehen. Der Broker speichert die letzte empfangene Sequenznummer pro PID und Partition. Trifft eine Nachricht mit einer bereits bekannten Sequenznummer ein, wird sie verworfen, anstatt sie erneut zu schreiben.

Die technischen Unterschiede lassen sich wie folgt gegenüberstellen:

FeatureAt-least-onceExactly-once (Idempotent)
enable.idempotencefalsetrue
acks1 oder allall
DuplikateMöglich bei NetzwerkfehlernWerden serverseitig gefiltert
OverheadMinimalGering (PID-Management)
GarantieMindestens eine ZustellungGenau eine Zustellung pro Sequenz

Für komplexere Workflows, insbesondere bei Read-Process-Write-Zyklen, setzen wir zusätzlich die transactional.id. Dies ermöglicht es, Nachrichten über mehrere Partitionen hinweg atomar zu schreiben. Nur wenn die gesamte Transaktion erfolgreich committet wird, sind die Daten für Consumer mit dem isolation.level=read_committed sichtbar.

Die Wahl der Konfiguration ist abhängig von der geforderten Datenkonsistenz. In Projekten, in denen wir IT-Consulting & Digitale Strategie für Finanzsysteme oder Inventarverwaltungen bereitstellen, ist die Vermeidung von Duplikaten eine Grundvoraussetzung für die Korrektheit der Geschäftslogik.

Wir empfehlen für alle produktiven Systeme die Aktivierung von enable.idempotence=true, da der Performance-Verlust vernachlässigbar ist, während die Datenintegrität durch den Schutz vor Duplikaten massiv steigt.

Sergej Wiens

Sergej Wiens

Gründer & Software Architekt