← DoorDash Interview Insights

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

Senior
May 2026

Summary

System design round at DoorDash for a software engineering role. The problem was a notification platform at scale, which sounds manageable until you realize how many moving pieces they actually want you to cover in 45 minutes.

Questions Asked (4)

Q1

Design a notification system that receives alert events from internal services and delivers them to subscribed users across multiple channels like push, email, and SMS.

System DesignTechnical Trade-offs
Author's notes

This is a big one.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements and scale, then design a high-level architecture with decoupled components (ingestion, processing, delivery). Focus on reliability, scalability, and trade-offs, and discuss how to handle failures and ensure delivery guarantees.

Pro tip: Emphasize idempotency and deduplication to handle retries without spamming users, and discuss how to prioritize notifications (e.g., critical alerts vs. marketing) to avoid overwhelming recipients.

1. Clarify Requirements and Scale

Ask about expected event volume, user base size, delivery guarantees (at-least-once vs. exactly-once), latency requirements, and supported channels. This sets the stage for design decisions.

2. High-Level Architecture

Propose a decoupled system: ingestion service receives events and publishes to a message queue (e.g., Kafka). Processing service consumes events, applies user preferences and deduplication, then enqueues delivery tasks per channel.

3. Channel Delivery and Reliability

Design channel-specific workers (push, email, SMS) that handle provider integrations, retries with exponential backoff, and dead-letter queues. Ensure idempotency to avoid duplicate notifications.

4. Scalability and Fault Tolerance

Discuss horizontal scaling of services, partitioning of queues, and database sharding for user preferences. Address monitoring, alerting, and graceful degradation when providers fail.

5. Trade-offs and Extensions

Compare push vs. pull models, synchronous vs. asynchronous processing, and storage choices. Mention potential extensions like rate limiting, user batching, and analytics.

Key Points to Mention

  • Use of message queues (e.g., Kafka) for decoupling and buffering
  • Idempotency and deduplication to handle retries and avoid duplicate notifications
  • User preference management and subscription filtering
  • Delivery guarantees (at-least-once, exactly-once) and trade-offs
  • Retry mechanisms with exponential backoff and dead-letter queues
  • Monitoring, alerting, and metrics 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 reliability concerns like retries, dead-letter queues, and idempotency in the notification pipeline?

System DesignTechnical Trade-offs
Author's notes

Felt more comfortable here.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the notification pipeline's requirements and constraints, then systematically address reliability concerns: retries with backoff, dead-letter queues for failed messages, and idempotency to prevent duplicate notifications. Emphasize trade-offs between reliability and latency, and how you would monitor and alert on failures.

Pro tip: Mention that idempotency keys should be generated at the source and propagated through the pipeline, and that dead-letter queues should be monitored and have a process for manual intervention or automated replay.

1. Clarify requirements and constraints

Ask about the expected volume, latency requirements, and tolerance for duplicate or lost notifications. Understand the criticality of different notification types (e.g., order updates vs. marketing).

2. Design retry mechanism

Implement retries with exponential backoff and jitter to handle transient failures. Set a maximum retry limit to avoid infinite loops and consider circuit breakers to prevent cascading failures.

3. Implement dead-letter queues (DLQ)

After retries are exhausted, route failed messages to a DLQ for later analysis and reprocessing. Ensure DLQs are monitored and have alerting to detect systemic issues.

4. Ensure idempotency

Use idempotency keys to deduplicate notifications, ensuring that retries or multiple deliveries do not result in duplicate notifications. Store keys with a TTL to manage storage.

5. Monitor and iterate

Set up metrics for retry rates, DLQ size, and duplicate detection. Use these to continuously improve the pipeline and adjust parameters like retry limits and backoff intervals.

Key Points to Mention

  • Exponential backoff with jitter to avoid thundering herd
  • Dead-letter queues for poison messages and manual inspection
  • Idempotency keys to ensure exactly-once processing semantics
  • Trade-offs between reliability and latency (e.g., synchronous vs. asynchronous retries)
  • Monitoring and alerting on DLQ and retry metrics
  • Consideration of different notification priorities and SLAs

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

Q3

How would you enforce rate limiting and respect user preferences such as opt-outs and quiet hours?

System DesignAPI & Integrations
Author's notes

Honestly the quiet hours piece caught me a bit flat-footed.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the requirements and scale, then propose a multi-layered architecture that enforces rate limits at the API gateway and application levels while respecting user preferences through a preference service. Emphasize idempotency, distributed counters, and asynchronous processing to handle high throughput and ensure compliance.

Pro tip: Mention the importance of idempotency keys and dead-letter queues to handle retries and failures gracefully, showing you understand production reliability concerns.

1. Clarify Requirements and Scale

Ask questions to understand the expected traffic volume, types of notifications (e.g., push, SMS, email), and regulatory constraints like GDPR or TCPA. This ensures your design meets business and legal needs.

2. Design a Preference Service

Propose a centralized service that stores user opt-outs, quiet hours, and channel preferences. It should be highly available and support fast reads, possibly using a cache like Redis.

3. Implement Rate Limiting

Use a distributed rate limiter (e.g., token bucket or sliding window) at the API gateway and per-user level. Leverage Redis or a similar in-memory store for atomic counters and low latency.

4. Enforce Preferences and Quiet Hours

Before sending, check the preference service and apply quiet hours logic (considering user time zones). If a notification is blocked, queue it for later or drop it based on priority.

5. Ensure Reliability and Monitoring

Use idempotency keys to prevent duplicate sends, and implement retries with exponential backoff. Monitor rate limit hits, preference violations, and system latency with alerts.

Key Points to Mention

  • Distributed rate limiting algorithms (token bucket, sliding window) and their trade-offs
  • Using Redis or similar for atomic counters and low-latency preference lookups
  • Handling quiet hours across time zones and user-specific schedules
  • Idempotency and deduplication to avoid sending multiple notifications
  • Asynchronous processing with queues (e.g., Kafka, SQS) for scalability
  • Compliance with regulations (GDPR, TCPA) and audit logging

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

Q4

What observability and operational tooling would you build into this system?

System DesignProduct Analytics & Metrics
Author's notes

Short answer from me: delivery success rates per channel, latency percentiles, DLQ depth as an alert signal, and per-alert-type SLA tracking.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the system's critical user journeys and failure modes, then propose a layered observability strategy covering metrics, logs, traces, and alerts. Tie each tool to a concrete operational need, such as detecting order failures or latency spikes, and explain how you'd iterate based on incidents.

Pro tip: Emphasize that observability should be designed alongside the system, not bolted on later, and mention how you'd balance signal vs. noise to avoid alert fatigue. Show you understand the cost and complexity trade-offs of different tools.

1. Identify critical paths and failure modes

Map the system's key user journeys (e.g., order placement, payment, delivery tracking) and list potential failure points. This ensures your observability covers what matters most to the business.

2. Define SLIs, SLOs, and error budgets

Propose specific service-level indicators (e.g., order success rate, p99 latency) and objectives. Explain how error budgets guide prioritization and alerting thresholds.

3. Choose the observability stack

Recommend tools for metrics (Prometheus, Datadog), logging (ELK, Splunk), tracing (Jaeger, OpenTelemetry), and dashboards (Grafana). Justify choices based on scale, cost, and integration.

4. Design alerting and incident response

Describe how alerts are routed (PagerDuty), escalated, and tied to runbooks. Include strategies to reduce noise, such as multi-condition alerts and suppression during deploys.

5. Plan for iteration and feedback loops

Explain how you'd use post-mortems and regular reviews to refine metrics, add missing instrumentation, and adjust SLOs. Highlight the importance of continuous improvement.

Key Points to Mention

  • Distributed tracing with OpenTelemetry or Jaeger to follow requests across microservices
  • Structured logging with correlation IDs for efficient debugging
  • Real-time dashboards and anomaly detection for proactive monitoring
  • SLO-based alerting to balance reliability and feature velocity
  • Runbooks and automated remediation for common failure scenarios
  • Cost management and sampling strategies for high-volume telemetry data

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