System Design beginner LIVE DEMO
πŸ””

Notification System Delivery Lifecycle Visualization

Walk through a scalable notification system from event intake and queue buffering through priority handling, preference checks, idempotency, provider dispatch, opt-out drops, retry backoff

System DesignNotification SystemMessage QueuesDeduplicationRetry Backoff
Interactive Demo

Continue with the guided workspace

Use the paired workspace to connect this guide's mental model with live component state, visible signals, and the outcome each step or scenario is meant to prove.

Mental Model

A highly available notification system must handle massive spikes in demand while reliably delivering alerts across multiple external channels (SMS, email, push notifications) that suffer from unpredictable downstream latency and outages.

For interactive exploration of these behaviors, you can run the live sandbox: Notification System Simulator.

Components and Why They Exist

Event Producer

Represents upstream client applications (like payment processors, user auth systems, or marketing engines) that trigger alerts. Generates notification payloads including user metadata, delivery channel preference, template type, and a client-side idempotency key. In the demo, watch request particles flow from the Event Producer to the API Gateway.

API Gateway

Serves as a single entry point that secures, validates, and quickly acknowledges requests. Performs authentication checks, validates request fields, and writes the event immediately to a message queue, returning a fast HTTP 202 Accepted response. In the demo, watch incoming requests pass through this gate to ensure schema correctness before queueing.

Message Queue (Kafka)

Buffers high-volume requests durably to isolate client-facing responsiveness from slow external networks. Temporarily holds events in partition queues so that down-stream worker processes can consume them at their own pace. In the demo, watch the queue status change and check queue buffer level during traffic spikes.

Priority Router

Prevents marketing alerts or low-priority digests from delaying high-priority alerts (like OTP verification codes). Inspects the priority tag of queued messages and routes high-priority notifications through dedicated queues or consumer threads. In the demo, watch high-priority OTP items preempt promotional messages in delivery speed.

Notification Service

Implements core business rules (checking user preferences, resolving templates, enforcing idempotency) before external dispatch. Orchestrates pre-dispatch checks against caching servers and preference databases before handing off to provider-specific adapters. In the demo, watch nodes coordinates incoming messages and routes them to their channels.

Preference DB

Stores user delivery preferences and opt-out statuses. Returns user configurations indicating which communication channels are blocked or allowed. In the demo, watch requests route to opt-out checks and get dropped immediately if the channel is disallowed.

Idempotency Cache

Guards the system against sending duplicate notifications if client applications retry requests due to network timeouts. Stores unique client-provided idempotency keys in a fast in-memory database with a Time-To-Live (TTL). In the demo, watch duplicate requests hit this cache, recognize the existing key, and discard the message.

Dispatchers (Push, SMS, Email)

Abstracts the API specific protocols of downstream provider networks (like Apple APNs, Twilio, or SendGrid). Processes channel commands and handles specific network transport details for external delivery. In the demo, watch dispatchers route active sends to the device. Note provider failure states turn red.

Retry Scheduler

Processes temporary network errors or provider outages without lockups or CPU loops. Applies exponential backoff delays with random jitter before submitting retried tasks back to the queue. In the demo, watch failed SMS notifications route to the retry scheduler, delay, and re-enqueue.

User Device

Represents the final endpoint receiving the communication. Displays the received notification and confirms successful delivery to the system logs. In the demo, watch notifications land on the user device and record successful statuses.

Edge Cases and Misconceptions

Idempotency Window Tradeoffs

It is a common misconception that idempotency caches should store keys forever. Retaining keys permanently is memory-prohibitive. Production systems assign a TTL (Time-To-Live) of 24–72 hours to idempotency records, assuming that any client-side network retry will occur within that timeframe. Retries after the TTL window can result in duplicate notification delivery.

DOWNSTREAM throttling and rate limiting

External provider networks (such as SMS gateways or email servers) have strict QPS limits. Ingesting traffic without queue buffering leads to provider rejection errors. Decoupling the ingestion layer using message queues allows dispatch workers to execute rate-limited calls safely.

Silent drops on User opt-out

For regulatory compliance, user opt-out states must be checked at the last possible layer before downstream dispatch. However, critical system alerts (like fraud warnings or password reset OTPs) must bypass these marketing preference filters to guarantee delivery. The system must categorise templates and allow structural bypass for critical classes.\n

Common Questions

Why is a message queue central to a notification system?

A queue decouples the high-speed event intake from slower, rate-limited downstream providers (like SMS and email APIs), preventing downstream delays from backing up client-facing services.

How does an idempotency check prevent double-delivery?

The client assigns a unique idempotency key to each notification request. The system stores this key in a fast cache (e.g., Redis) before calling providers. If a second request with the same key arrives, the system recognizes it as a duplicate and drops it.

Where should user preference checks occur in the delivery pipeline?

Preference checks should occur before dispatching messages to external providers. This saves provider costs, avoids wasting server resources, and ensures immediate compliance with opt-out settings.

Why is exponential backoff with jitter used for retries?

If an external provider suffers an outage, retrying immediately and repeatedly creates a thundering herd that keeps the provider overloaded. Exponential backoff increases the delay between attempts, and jitter adds randomness to prevent multiple workers from retrying at the exact same millisecond.