← DoorDash Interview Insights

DoorDash·Software Engineer·Onsite - System Design / Architecture·Senior

Senior
May 2026

Summary

DoorDash system design round for a full-stack role, and they went straight for the jugular with a large-scale alerting system. Pretty intense scope for a single session, covering everything from data modeling to fan-out architecture to DLQ strategies.

Questions Asked (5)

Q1

Design an alert notification system for a large-scale service that accepts events from multiple producers, applies user-defined routing rules, and delivers across channels like email, SMS, push, Slack, and webhooks.

System DesignTechnical Trade-offsData Modeling
Author's notes

This is the whole question, and it's a lot.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying functional and non-functional requirements, then design a scalable, decoupled architecture that ingests events, evaluates routing rules, and delivers notifications reliably. Focus on trade-offs around consistency, latency, and fault tolerance, and discuss how to handle failures and scale each component.

Pro tip: Emphasize idempotency and deduplication at every stage to prevent duplicate notifications, and discuss how to handle user preferences and rate limiting to avoid overwhelming recipients.

1. Clarify Requirements

Ask questions to understand scale (events per second, number of users), latency expectations, delivery guarantees (at-least-once, exactly-once), and supported channels. Also clarify how routing rules are defined and updated.

2. High-Level Architecture

Propose a pipeline: ingestion layer (API gateway, message queue), rule evaluation engine, and delivery service per channel. Use a message broker (e.g., Kafka) to decouple producers from consumers and enable scalability.

3. Data Modeling and Rule Engine

Design a schema for events, user preferences, and routing rules. Discuss how to store and evaluate rules efficiently, possibly using a rules engine or a DSL, and how to handle dynamic updates.

4. Delivery and Reliability

Explain how to ensure reliable delivery with retries, dead-letter queues, and idempotency. Discuss per-channel adapters, rate limiting, and handling of failures (e.g., third-party outages).

5. Scalability and Trade-offs

Address scaling bottlenecks (e.g., rule evaluation, delivery throughput) and trade-offs between consistency, latency, and cost. Mention monitoring, alerting, and how to handle spikes.

Key Points to Mention

  • Use of message queues (e.g., Kafka) for decoupling and buffering
  • Idempotency and deduplication to avoid duplicate notifications
  • Rule evaluation strategies (e.g., pre-filtering, indexing, caching)
  • Per-channel delivery services with retry and circuit breaker patterns
  • Rate limiting and user preferences to prevent notification fatigue
  • Monitoring, metrics, and alerting for system health and delivery success

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q2

How would you handle deduplication, alert grouping into digests, and silencing windows within the notification pipeline?

System DesignTechnical Trade-offs
Author's notes

Silencing windows I got pretty comfortable with, just a time-based filter applied before fan-out.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the requirements and scale of the notification pipeline, then walk through the three concerns (deduplication, grouping, silencing) in the order events flow through the system. For each, describe the data model, algorithms, and trade-offs, and finish by explaining how they interact and how you would monitor and test the pipeline.

Pro tip: Emphasize idempotency and state management: deduplication and silencing require shared state (e.g., a fast store like Redis) with TTLs, and grouping needs a windowing strategy—discuss how you'd handle failures and ensure exactly-once semantics without blocking the pipeline.

1. Clarify requirements and constraints

Ask about notification volume, latency tolerance, deduplication window, grouping rules, and silencing scope (user, event type, global). Confirm whether the system is real-time or batch.

2. Design deduplication

Choose a dedup key (e.g., event ID, hash of content) and a store (Redis with TTL, or a database) to track seen events. Discuss idempotency, race conditions, and cleanup.

3. Design alert grouping into digests

Define grouping criteria (time window, user, alert type) and a buffering mechanism (e.g., Kafka with windowing, or in-memory with flush). Explain how to aggregate and format digests.

4. Design silencing windows

Model silences as rules with start/end times and scope. Check silences before sending, and handle overlapping or conflicting rules. Use a fast lookup store.

5. Integrate and discuss trade-offs

Show how the three components fit in the pipeline (e.g., dedup -> silence check -> group -> send). Discuss trade-offs: latency vs. accuracy, storage cost, complexity, and failure modes.

Key Points to Mention

  • Idempotency and exactly-once processing using unique event IDs and transactional outbox pattern
  • Use of Redis or similar for fast dedup and silence lookups with TTLs to avoid unbounded growth
  • Windowing strategies (tumbling, sliding) for grouping and how to handle late-arriving events
  • Silence rule precedence and conflict resolution (e.g., most specific rule wins)
  • Monitoring and alerting on pipeline health: dedup rate, group sizes, silence hits, and latency
  • Scalability considerations: partitioning by user or event type to distribute load

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q3

What's your retry and dead letter queue strategy for failed notification deliveries, and how do you ensure at-least-once delivery without spamming users?

System DesignAPI & Integrations
Author's notes

Went with exponential backoff plus a max retry count before routing to a DLQ.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the notification types and their criticality, then outline a layered retry strategy with exponential backoff and jitter, and explain how dead letter queues (DLQs) capture permanently failed messages for analysis and manual intervention. Emphasize idempotency and deduplication to achieve at-least-once delivery without spamming users, and discuss how you monitor and alert on DLQ depth and retry rates.

Pro tip: Tie your strategy to user experience: for non-critical notifications, consider dropping after a few retries to avoid spam, while for critical ones (e.g., order updates), use persistent retries with a cap and fallback channels. Also, mention that you'd track delivery attempts per user and enforce a global rate limit to prevent notification storms.

1. Clarify requirements and constraints

Ask about the types of notifications (transactional vs. promotional), expected volume, latency requirements, and tolerance for duplicate or delayed messages. This shapes the retry and DLQ design.

2. Design retry strategy

Use exponential backoff with jitter to avoid thundering herd, set a maximum retry count, and differentiate retry policies based on notification criticality. For example, critical alerts might retry for hours, while promotional ones might retry only a few times.

3. Implement dead letter queue

After max retries, move messages to a DLQ for manual inspection or automated reprocessing. Ensure DLQ messages include metadata (failure reason, attempt count) and set up alerts for DLQ depth to detect systemic issues.

4. Ensure at-least-once delivery without spamming

Make message processing idempotent using a unique message ID and deduplication store (e.g., Redis or database) to prevent duplicate sends. Additionally, implement user-level rate limiting and suppression lists to avoid overwhelming users.

5. Monitor, alert, and iterate

Track metrics like retry rate, DLQ size, delivery latency, and duplicate rate. Set up alerts for anomalies and use DLQ analysis to improve retry logic and reduce failures.

Key Points to Mention

  • Exponential backoff with jitter to spread out retries and reduce load.
  • Idempotency keys and deduplication to prevent duplicate notifications.
  • Dead letter queue for failed messages with alerting and reprocessing capabilities.
  • Differentiated retry policies based on notification criticality (e.g., transactional vs. promotional).
  • User-level rate limiting and suppression to avoid spamming.
  • Monitoring and metrics (retry rate, DLQ depth, delivery success rate) for continuous improvement.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q4

How do you handle channel-specific rate limits, say an SMS provider that caps you at 100 messages per second, without dropping high-severity alerts?

System DesignTechnical Trade-offs
Author's notes

Prioritization queue per channel was my answer.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the requirements: what defines a high-severity alert, what are the latency and delivery guarantees, and what channels are available. Then propose a multi-layered architecture that prioritizes critical alerts through dedicated queues, rate limiting, and fallback mechanisms, while ensuring observability and fairness for lower-priority messages.

Pro tip: Emphasize that rate limits are per-channel and often per-account, so you should design for dynamic limit discovery and backpressure, not just static throttling. Also, mention that you'd measure the impact of throttling on alert delivery SLAs and iterate.

1. Clarify requirements and constraints

Ask about the definition of high-severity alerts, acceptable latency, delivery guarantees, and whether multiple channels (e.g., SMS, push, email) are available. Understand the provider's rate limit specifics (e.g., per second, burst allowance).

2. Design a priority-based queuing system

Implement separate queues for different severity levels, with high-severity alerts in a dedicated queue that gets priority access to the rate-limited channel. Use a token bucket or leaky bucket algorithm to enforce the rate limit while allowing bursts up to the cap.

3. Implement rate limiting and backpressure

Apply a distributed rate limiter (e.g., using Redis or a dedicated service) that all senders respect. When the limit is reached, high-severity alerts should either wait (if latency allows) or trigger fallback channels; low-severity alerts can be delayed or dropped based on policy.

4. Add fallback and escalation mechanisms

If the primary channel is saturated, automatically route high-severity alerts to alternative channels (e.g., push notifications, phone calls, or a different SMS provider). Define escalation policies and ensure idempotency to avoid duplicates.

5. Monitor, measure, and iterate

Track metrics like queue depth, rate limit hits, alert delivery latency, and fallback usage. Set up alerts for when high-severity alerts are delayed beyond SLA, and use this data to adjust priorities, limits, or add capacity.

Key Points to Mention

  • Priority queues with strict ordering for high-severity alerts
  • Token bucket or leaky bucket algorithm for rate limiting
  • Distributed rate limiting using Redis or a centralized service
  • Fallback channels and escalation policies for critical alerts
  • Backpressure and load shedding for low-priority alerts
  • Observability: metrics, logging, and alerting on delivery SLAs

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q5

How would you deal with hot subscribers, meaning a single user or endpoint that receives a disproportionate volume of alerts?

System DesignTechnical Trade-offs
Author's notes

Blanked for a second on this one.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the scenario and requirements, then propose a multi-layered solution that includes detection, mitigation, and prevention. Emphasize trade-offs between alert fidelity, latency, and system complexity, and tie your answer to DoorDash's scale and reliability needs.

Pro tip: Mention that hot subscribers are often a symptom of misconfigured alerts or a single point of failure, so addressing root causes (e.g., alert deduplication, aggregation) is as important as rate limiting. Also, highlight the importance of observability to detect and debug such issues quickly.

1. Clarify the problem

Ask questions to understand the scale, impact, and existing alerting infrastructure. Define what 'disproportionate volume' means and identify the subscriber's criticality.

2. Detect and monitor

Propose mechanisms to detect hot subscribers, such as per-subscriber metrics, anomaly detection, and alerting on alert volume. Emphasize the need for observability.

3. Mitigate immediately

Suggest short-term solutions like rate limiting, throttling, or temporarily disabling the subscriber's alerts. Discuss trade-offs of each approach.

4. Implement long-term fixes

Propose structural changes like alert aggregation, deduplication, batching, or sharding. Consider architectural changes to the alerting pipeline to handle scale.

5. Evaluate trade-offs and iterate

Discuss how to balance alert delivery guarantees, latency, and system complexity. Suggest monitoring and iterating based on feedback.

Key Points to Mention

  • Rate limiting and throttling per subscriber to prevent overload
  • Alert aggregation and deduplication to reduce noise
  • Backpressure and queue management in the alerting pipeline
  • Sharding or partitioning subscribers to isolate hot ones
  • Observability: metrics, logging, and tracing for alert delivery
  • Trade-offs: alert latency vs. reliability, false positives vs. missed alerts

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.