ARCHIVED from builddistributedsystem.com on 2026-04-28 — URL: https://builddistributedsystem.com/tracks/queues/tasks/task-15-4-exactly-once
TASK

Implementation

Achieve exactly-once processing semantics:

Producer side:

  1. Assign unique ID to each message
  2. Queue deduplicates by ID

Consumer side:

  1. Track processed message IDs
  2. Skip messages already processed
  3. Atomically: process + commit offset + record as processed

This requires cooperation between producer, queue, and consumer.

Sample Test Cases

Producer deduplicationTimeout: 5000ms
Input
{
  "src": "c0",
  "dest": "n1",
  "body": {
    "type": "init",
    "msg_id": 1,
    "node_id": "n1",
    "node_ids": [
      "n1"
    ]
  }
}
Expected Output
{"src":"n1","dest":"c0","body":{"type":"init_ok","in_reply_to":1,"msg_id":0}}
Consumer skip duplicateTimeout: 5000ms
Input
{
  "src": "c0",
  "dest": "n1",
  "body": {
    "type": "init",
    "msg_id": 1,
    "node_id": "n1",
    "node_ids": [
      "n1"
    ]
  }
}
Expected Output
{"src":"n1","dest":"c0","body":{"type":"init_ok","in_reply_to":1,"msg_id":0}}

Hints

Hint 1
Dedup on producer side with message ID
Hint 2
Track processed IDs on consumer side
Hint 3
Use transactions for consume-produce
OVERVIEW

Theoretical Hub

Exactly-Once Semantics

True exactly-once is end-to-end: exactly-once production + exactly-once consumption + idempotent processing. Kafka achieves this through idempotent producers, transactional consumers, and offset commits within transactions.

Idempotency Keys

Using unique message IDs, producers retry safely (queue rejects duplicates) and consumers skip already-processed messages. The challenge is tracking and garbage-collecting these IDs efficiently.

Key Concepts

exactly-onceidempotencydeduplication
main.py
python
Implement Exactly-Once Semantics - Queues | Build Distributed Systems