Bird
Raised Fist0
LLDsystem_design~7 mins

Notification to all parties in LLD - System Design Guide

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Problem Statement
When an important event occurs, failing to notify all relevant parties causes confusion, delays, and errors. Without a reliable way to send notifications to everyone involved, some users may miss critical updates, leading to poor coordination and reduced trust in the system.
Solution
This pattern ensures that when an event happens, the system sends notifications to all registered parties automatically. It works by maintaining a list of subscribers and broadcasting messages to each one, either synchronously or asynchronously, so everyone stays informed in real time or near real time.
Architecture
Event
Notification
Subscriber 2
Subscriber N
Subscriber N

This diagram shows an event source triggering a notification dispatcher that sends messages to multiple subscribers.

Trade-offs
✓ Pros
Ensures all interested parties receive timely updates.
Decouples event generation from notification delivery, improving modularity.
Supports multiple notification channels (email, SMS, push) easily.
Can scale by adding more subscribers without changing event source.
✗ Cons
Requires managing subscriber lists and handling failures in delivery.
Can introduce latency if notifications are sent synchronously.
Complexity increases with multiple notification channels and formats.
Use when multiple users or systems must be informed about events, especially if the number of subscribers is moderate to large (hundreds to thousands).
Avoid if only one or two parties need notification or if notifications are not critical, as overhead may outweigh benefits.
Real World Examples
Uber
Uber notifies drivers and riders simultaneously about trip status changes to keep both parties updated in real time.
Amazon
Amazon sends order status notifications to customers, warehouse staff, and delivery partners to coordinate fulfillment.
Slack
Slack broadcasts message notifications to all members of a channel to ensure everyone sees updates promptly.
Code Example
The before code shows an event happening with no notifications sent. The after code introduces a NotificationDispatcher that keeps a list of subscribers and sends them messages when an event occurs. Subscribers implement an update method to receive notifications. This pattern ensures all parties are informed automatically.
LLD
### Before: No notification to all parties
class EventSource:
    def event_occurred(self):
        print("Event happened")

source = EventSource()
source.event_occurred()


### After: Notify all subscribers
class NotificationDispatcher:
    def __init__(self):
        self.subscribers = []

    def subscribe(self, subscriber):
        self.subscribers.append(subscriber)

    def notify_all(self, message):
        for subscriber in self.subscribers:
            subscriber.update(message)

class Subscriber:
    def __init__(self, name):
        self.name = name

    def update(self, message):
        print(f"{self.name} received notification: {message}")

class EventSource:
    def __init__(self, dispatcher):
        self.dispatcher = dispatcher

    def event_occurred(self):
        message = "Event happened"
        self.dispatcher.notify_all(message)

# Setup
dispatcher = NotificationDispatcher()
dispatcher.subscribe(Subscriber("Subscriber 1"))
dispatcher.subscribe(Subscriber("Subscriber 2"))

source = EventSource(dispatcher)
source.event_occurred()
OutputSuccess
Alternatives
Polling
Subscribers repeatedly check for updates instead of receiving push notifications.
Use when: Choose polling when real-time updates are not critical and system simplicity is preferred.
Webhook callbacks
System calls subscriber endpoints directly on events rather than broadcasting internally.
Use when: Choose webhooks when integrating with external systems that require immediate event data.
Summary
Notification to all parties ensures every interested user or system receives event updates automatically.
It works by maintaining subscriber lists and sending messages to each when events occur.
This pattern improves coordination and reduces missed information in multi-party systems.

Practice

(1/5)
1.

What is the main purpose of a notification system that sends messages to all parties?

easy
A. To quickly share important messages with everyone involved
B. To store large amounts of data securely
C. To perform complex calculations on user data
D. To create user profiles and preferences

Solution

  1. Step 1: Understand the role of notifications

    Notifications are designed to deliver messages to users or parties quickly and efficiently.
  2. Step 2: Identify the main goal

    The main goal is to share important information with all involved parties without delay.
  3. Final Answer:

    To quickly share important messages with everyone involved -> Option A
  4. Quick Check:

    Notification purpose = quick message sharing [OK]
Hint: Notifications = fast message delivery to all involved [OK]
Common Mistakes:
  • Confusing notifications with data storage
  • Thinking notifications perform data processing
  • Assuming notifications create user profiles
2.

Which of the following is the correct way to represent a notification service that sends messages to all parties in pseudocode?

function notifyAll(parties, message) {
  for (let i = 0; i < parties.length; i++) {
    parties[i].send(message);
  }
}
easy
A. Call send(message) once without looping
B. Send message only to the first party
C. Loop through parties and call send(message) on each
D. Loop through parties but do not send any message

Solution

  1. Step 1: Analyze the pseudocode loop

    The code loops through each party in the parties list using a for loop.
  2. Step 2: Check the send method call

    Inside the loop, it calls send(message) on each party, ensuring all get notified.
  3. Final Answer:

    Loop through parties and call send(message) on each -> Option C
  4. Quick Check:

    Loop + send call = notify all [OK]
Hint: Loop through all parties to send message [OK]
Common Mistakes:
  • Sending message only once
  • Not looping through all parties
  • Calling send outside the loop
3.

Consider this code snippet for notifying parties:

parties = ["Alice", "Bob", "Charlie"]
function notifyAll(parties, message) {
  let notified = []
  for (const person of parties) {
    notified.push(person + ": " + message)
  }
  return notified
}

console.log(notifyAll(parties, "Meeting at 5 PM"))

What will be the output?

medium
A. ["Alice: Meeting at 5 PM", "Bob: Meeting at 5 PM", "Charlie: Meeting at 5 PM"]
B. ["Meeting at 5 PM", "Meeting at 5 PM", "Meeting at 5 PM"]
C. ["Alice", "Bob", "Charlie"]
D. Error: notifyAll is not defined

Solution

  1. Step 1: Understand the loop behavior

    The function loops over each person in parties and creates a string combining their name and the message.
  2. Step 2: Check the returned list

    The notified list contains strings like "Alice: Meeting at 5 PM" for each party.
  3. Final Answer:

    ["Alice: Meeting at 5 PM", "Bob: Meeting at 5 PM", "Charlie: Meeting at 5 PM"] -> Option A
  4. Quick Check:

    Loop + string concat = list of personalized messages [OK]
Hint: Each party gets message with their name prefixed [OK]
Common Mistakes:
  • Returning only messages without names
  • Returning original party list
  • Assuming function is undefined
4.

Identify the bug in this notification function and select the fix:

function notifyAll(parties, message) {
  for (let i = 0; i < parties.length; i++) {
    parties.send(message)
  }
}
medium
A. Remove the loop and call parties.send(message) once
B. Add a return statement inside the loop
C. Change i < parties.length to i <= parties.length
D. Change parties.send(message) to parties[i].send(message)

Solution

  1. Step 1: Identify incorrect method call

    The code calls send on the entire parties array instead of individual party objects.
  2. Step 2: Fix by indexing the array

    Use parties[i].send(message) to call send on each party in the loop.
  3. Final Answer:

    Change parties.send(message) to parties[i].send(message) -> Option D
  4. Quick Check:

    Call send on each party object [OK]
Hint: Call send on parties[i], not parties array [OK]
Common Mistakes:
  • Calling send on the whole array
  • Using wrong loop condition
  • Adding unnecessary return inside loop
5.

You are designing a notification system to alert all parties involved in a project. Which design choice best ensures scalability and reliability?

  • A. Use a single server to send notifications sequentially to all parties.
  • B. Send notifications only to a random subset of parties to reduce load.
  • C. Store all notifications in a database and send them manually when needed.
  • D. Use a message queue to distribute notification tasks to multiple worker servers.
hard
A. Single server sending sequentially
B. Message queue with multiple workers
C. Store notifications and send manually
D. Send to random subset to reduce load

Solution

  1. Step 1: Evaluate single server approach

    Sending sequentially from one server limits scalability and can cause delays or failures.
  2. Step 2: Consider message queue with workers

    Using a message queue allows distributing notification tasks to multiple workers, improving scalability and reliability.
  3. Step 3: Assess other options

    Storing notifications for manual sending is slow; sending to random subset misses parties.
  4. Final Answer:

    Message queue with multiple workers -> Option B
  5. Quick Check:

    Queue + workers = scalable, reliable notifications [OK]
Hint: Use queues and workers for scalable notifications [OK]
Common Mistakes:
  • Relying on single server for all notifications
  • Sending notifications manually
  • Skipping parties to reduce load