Sobes.tech
Middle — Middle+

How to ensure message delivery exactly once, avoiding duplication?

sobes.tech AI

Answer from AI

To ensure exactly-once delivery of messages, it is necessary to combine several approaches, as this is a non-trivial task in distributed systems:

  • Idempotency of message handlers: processing the same message multiple times should not change the final result.
  • Unique message identifiers: each message has a unique ID that is stored in the database upon processing.
  • Processing state storage: upon receiving a message, it is checked whether it has already been processed (by ID). If yes, it is ignored.
  • Transactional acknowledgment: recording the processing result and marking the message as processed should be atomic.

Example in Python using a database to track processed messages:

import sqlite3

conn = sqlite3.connect('messages.db')
conn.execute('''CREATE TABLE IF NOT EXISTS processed_messages (msg_id TEXT PRIMARY KEY)''')

def process_message(msg_id, payload):
    cursor = conn.cursor()
    cursor.execute('SELECT 1 FROM processed_messages WHERE msg_id = ?', (msg_id,))
    if cursor.fetchone():
        print('Message already processed, skipping')
        return

    # Process the message
    print(f'Processing message: {payload}')

    # Save the processing fact
    cursor.execute('INSERT INTO processed_messages (msg_id) VALUES (?)', (msg_id,))
    conn.commit()

# Example call
process_message('12345', 'Data')
process_message('12345', 'Data')  # will be skipped

Thus, even with repeated delivery, the message will only be processed once.