openmeter / docs /decisions /0003-idempotency.md
Leon4gr45's picture
Upload folder using huggingface_hub (part 5)
b47934a verified
|
Raw
History Blame Contribute Delete
2.12 kB
# Idempotency
## Context and Problem Statement
Event-driven ingestion requires idempotency to handle message retries, ensuring reliable processing.
Key considerations are:
- Distributed systems often guarantee least-once delivery.
- Event replays may be necessary for failure and recovery scenarios.
- CloudEvents are unique by ID + Source properties.
Neither Kafka nor ksqlDB natively supports message idempotency.
## Considered Options
To achieve idempotency we discovered event deduplication options both on producer (API Server) and consumer (ksqlDB) side:
1. Redis with key expiration
1. Redis with bloom filter
1. Deduplication in ksqlDB via windowed tables
## Decision Outcome
To maintain strong consistency and avoid complex multi-phase commits and state management, we chose deduplication via ksqlDB.
- Idempotency via deduplication
- Deduplication in ksqlDB via windowed tables
- Events are unique by ID + Source
- 32 days default deduplication window
### Consequences
- Pros: No need to run Redis.
- Pros: Strong consistency can be guaranteed.
- Cons: Increased Kafka storage for deduplication window.
- Cons: Longer retention window may impact backup and recovery time.
## Pros and Cons of the Options
### Redis with key expiration
- Pros: Simple implementation.
- Cons: Inconsistent with Kafka Producer.
- Cons: Requires Redis.
### Redis with bloom filter
- Same tradeoffs as Redis with key expiration.
- Pros: Efficient storage.
- Cons: Possible false positives leading to dropped events.
### Deduplication in ksqlDB via windowed tables
Deduplicating Kafka messages with ksqlDB requires an extra table where we count how many times we have seen a specific event. Then we only include events in streaming processing at their first occurrence.
See [How to find distinct values in a stream of events](https://developer.confluent.io/tutorials/finding-distinct-events/ksql.html) for more details.
- Pros: No separate system required.
- Pros: Guaranteed consistency.
- Cons: Increased Kafka storage for deduplication window.
- Cons: Longer retention window may impact backup and recovery time.