← 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. Two big open-ended topics, both squarely in distributed systems territory. Not a lot of hand-holding from the interviewer.

Questions Asked (2)

Q1

Your service depends on an upstream API that starts responding slowly. How do you protect your own service's reliability? Walk through your approach including timeouts, retries, circuit breakers, bulkheads, fallbacks, async processing, and load shedding.

System DesignTechnical Trade-offs
Author's notes

This one went longer than I expected.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by framing the problem as a resilience engineering challenge: protect your service from cascading failures due to upstream slowness. Then walk through a layered defense strategy, explaining how each technique (timeouts, retries, circuit breakers, bulkheads, fallbacks, async processing, load shedding) addresses specific failure modes, and discuss trade-offs and how you'd validate the approach.

Pro tip: Emphasize that timeouts and retries must be tuned together with jitter and budgets to avoid retry storms, and that circuit breakers should be paired with fallbacks to degrade gracefully. Also mention that you'd measure and monitor these mechanisms in production to continuously improve resilience.

1. Set aggressive timeouts and limit retries

Configure timeouts on all upstream calls to fail fast, and implement retries with exponential backoff and jitter, capped by a retry budget to prevent overwhelming the upstream.

2. Implement circuit breakers and bulkheads

Use circuit breakers to stop calling a failing upstream after a threshold, allowing it to recover. Isolate calls with bulkheads (e.g., thread pools or semaphores) to prevent resource exhaustion in one dependency from affecting others.

3. Design fallbacks and graceful degradation

Provide fallback responses (cached data, defaults, or partial results) when the upstream is unavailable or slow, ensuring core functionality remains available.

4. Offload non-critical work to async processing

Move non-essential or batch operations to asynchronous queues or background jobs, so they don't block user-facing requests during upstream slowness.

5. Apply load shedding and prioritize critical traffic

When under stress, shed or throttle low-priority requests to protect critical paths, using techniques like rate limiting, queue management, or adaptive concurrency limits.

Key Points to Mention

  • Timeouts: set them slightly above p99 latency of upstream, and ensure they are enforced at all layers (client, network, server).
  • Retries: use exponential backoff with jitter, limit retries to idempotent operations, and implement a retry budget to avoid retry storms.
  • Circuit breakers: monitor error rates and latency, open circuit when thresholds are exceeded, and half-open to test recovery.
  • Bulkheads: isolate thread pools or connection pools per dependency to contain failures and prevent resource contention.
  • Fallbacks: return cached or default responses, or degrade features gracefully (e.g., show stale data) to maintain user experience.
  • Load shedding: prioritize traffic based on criticality, drop or queue low-priority requests, and use adaptive limits to protect the system.

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

Q2

When would you choose Redis over a relational database, and when would you use both together? Compare them across access patterns, durability, consistency, latency, and cost.

System DesignTechnical Trade-offsData Modeling
Author's notes

Felt more comfortable here.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by defining the core strengths of each system: Redis for speed and ephemeral data, relational databases for durability and complex queries. Then compare them across the five dimensions, using concrete examples from a high-scale environment like DoorDash. Finally, explain how they complement each other in a hybrid architecture, such as caching with Redis and persisting in a relational database.

Pro tip: Emphasize that Redis is not a replacement for a relational database but a complement; discuss patterns like cache-aside and write-through, and mention how you'd handle cache invalidation and data consistency to show depth.

1. Clarify requirements and access patterns

Identify the read/write ratio, data size, query complexity, and latency requirements. For example, high-frequency reads of small, hot data favor Redis, while complex transactions favor relational databases.

2. Compare across the five dimensions

For each dimension—access patterns, durability, consistency, latency, and cost—contrast Redis and relational databases. Use specific examples, like Redis for session storage (low latency, eventual consistency) vs. PostgreSQL for orders (ACID, durable).

3. Decide when to use Redis alone

Choose Redis when you need sub-millisecond latency, can tolerate some data loss, and the data model is simple (key-value). Examples: caching, real-time leaderboards, rate limiting, session stores.

4. Decide when to use a relational database alone

Choose a relational database when you need ACID transactions, complex joins, strong consistency, and durable storage. Examples: financial records, user accounts, order management.

5. Design a hybrid architecture

Use both together: Redis as a cache or for ephemeral data, and the relational database as the source of truth. Discuss patterns like cache-aside, write-through, and how to handle cache invalidation and consistency.

Key Points to Mention

  • Access patterns: Redis excels at simple key-value lookups and high-throughput operations; relational databases handle complex queries and joins.
  • Durability: Redis offers persistence options (RDB, AOF) but is less durable than relational databases with write-ahead logging and replication.
  • Consistency: Redis provides eventual consistency in clustered setups; relational databases offer strong consistency with ACID transactions.
  • Latency: Redis delivers sub-millisecond latency; relational databases typically have higher latency due to disk I/O and query processing.
  • Cost: Redis is in-memory, so cost scales with RAM; relational databases can use cheaper disk storage but may require expensive scaling for high throughput.
  • Hybrid patterns: Cache-aside, write-through, and write-behind caching; use Redis for session management, rate limiting, and real-time features alongside a relational database for transactional data.

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