Exactly Once Semantics (EOS)

Producer Side

  • Idempotent Producers:
    • Kafka producers can be configured to be idempotent, which means they use a unique sequence number for each message to avoid duplicate writes.
    • This ensures that even if a message is sent multiple times due to retries, it will only be written once
  • Transactional Producers: Producers can send messages in transactions, ensuring that either all messages in a transaction are committed or none are. This prevents partial writes
  • Producer Configuration:
    • acks=all (or acks=-1):
      • Ensures that the leader broker waits for acknowledgment from all in-sync replicas before considering a write successful
    • enable.idempotence=true
      • Enables idempotent producer functionality, which prevents duplicate messages in case of retries
      • Duplicate messages are detected and discarded.
    • Transactions
      • Configured with transactional.id to enable transactional behavior for exactly-once semantics

Consumer Side

  • Idempotent Consumption:
    • Consumers should ensure that processing logic is idempotent.
    • Consumers should handle duplicate messages gracefully
    • This means, processing a message multiple times does not change the outcome
  • Transactional Consumers:
    • Kafka allows consumers to commit offsets as part of a transaction, ensuring that offsets are committed only if the processing of messages is successful.
    • This prevents reprocessing of messages
  • Consumer Configuration:
    • enable.auto.commit=false
      • Disables automatic offset commits to ensure that offsets are only committed after successful message processing
      • Consumers commit offsets manually after successful processing within a transaction.
    • Transaction Management
      • When using transactions, ensure that consumer offset commits are handled as part of the transaction to avoid inconsistencies

Durability and Acknowledgements