← DoorDash Interview Insights

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

Senior
Jul 2026

Summary

DoorDash system design round focused on building a fault-tolerant bootstrap API that fans out to multiple downstream services. The question had a lot of moving parts and the discussion kept expanding into territory I wasn't fully prepared for.

Questions Asked (2)

Q1

Design a bootstrap API that calls three downstream services in sequence, builds a composite response from their outputs, and gracefully handles failures at either the call or parse stage without aborting the entire request.

System DesignAPI & IntegrationsTechnical Trade-offs
Author's notes

I started with a straightforward sequential loop and null-on-failure logic, which felt right but maybe too simple for the level they expected.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements and constraints, then propose a high-level design that separates orchestration from downstream calls. Emphasize resilience patterns like timeouts, retries, and circuit breakers, and explain how to handle partial failures by returning a composite response with error details. Finally, discuss trade-offs and monitoring.

Pro tip: Demonstrate maturity by discussing how to handle partial failures gracefully—returning a 207 Multi-Status or a response with per-service status—and how to avoid cascading failures with bulkheads and fallbacks.

1. Clarify Requirements and Constraints

Ask about latency SLAs, expected failure rates, and whether the composite response should be all-or-nothing or allow partial success. Confirm if downstream services are idempotent and if retries are safe.

2. Design the Orchestration Layer

Outline a bootstrap API that sequentially calls three services, with each call wrapped in a resilient client (timeouts, retries, circuit breaker). Use a saga or orchestration pattern to manage the sequence and compensate on failure.

3. Handle Failures at Call and Parse Stages

For call failures, catch exceptions and decide whether to retry, fallback, or mark that service as failed. For parse failures, validate responses and log errors, returning partial data with error indicators.

4. Build Composite Response

Aggregate successful outputs into a unified response, including metadata about which services succeeded or failed. Consider using a standard format like JSON with a 'status' field per service.

5. Discuss Trade-offs and Monitoring

Compare sequential vs. parallel calls (if dependencies allow), synchronous vs. asynchronous processing, and consistency vs. availability. Highlight the need for logging, metrics, and tracing to monitor failures.

Key Points to Mention

  • Timeouts, retries with exponential backoff, and circuit breakers to prevent cascading failures.
  • Idempotency and safety of retries for downstream calls.
  • Partial failure handling: returning a composite response with per-service status (e.g., 207 Multi-Status).
  • Fallback strategies: default values, cached data, or degraded functionality.
  • Observability: logging, metrics, and distributed tracing for debugging and alerting.
  • Trade-offs: latency vs. consistency, sequential vs. parallel execution, and complexity of orchestration.

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

Q2

How would you extend this pattern to support timeouts, retries, and parallelism for independent service calls?

System DesignTechnical Trade-offsAdaptability & Ambiguity
Author's notes

This came as a natural follow-up and I was mostly okay on timeouts and retries.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the current pattern and the requirements for timeouts, retries, and parallelism. Then, propose a layered design that adds these concerns without breaking existing functionality, discussing trade-offs and implementation details. Conclude with how you would test and monitor the enhanced pattern.

Pro tip: Emphasize idempotency and backoff strategies to avoid cascading failures, and mention how you'd use circuit breakers to prevent retry storms. Also, highlight the importance of context propagation for timeouts and cancellation.

1. Clarify the current pattern and requirements

Ask questions to understand the existing pattern (e.g., synchronous calls, error handling) and the specific needs for timeouts, retries, and parallelism. Clarify constraints like latency budgets, failure modes, and whether calls are idempotent.

2. Design timeouts and cancellation

Propose adding timeouts at multiple levels (e.g., per call, overall operation) using context propagation. Discuss how to handle cancellation and cleanup to avoid resource leaks.

3. Implement retries with backoff and jitter

Describe a retry mechanism with exponential backoff and jitter to avoid thundering herds. Mention idempotency keys and circuit breakers to prevent retrying non-idempotent operations or overwhelming downstream services.

4. Enable parallelism for independent calls

Explain how to execute independent calls concurrently using futures, promises, or async/await, and how to aggregate results. Discuss handling partial failures and timeouts in parallel scenarios.

5. Address trade-offs, testing, and monitoring

Discuss trade-offs like increased complexity, resource usage, and potential for retry storms. Outline testing strategies (e.g., chaos engineering) and monitoring (e.g., metrics for retries, timeouts, and latency).

Key Points to Mention

  • Idempotency and its role in safe retries
  • Exponential backoff with jitter to avoid synchronized retries
  • Circuit breakers to prevent cascading failures
  • Context propagation for timeouts and cancellation
  • Handling partial failures in parallel calls (e.g., using Promise.allSettled)
  • Observability: metrics, logging, and tracing for retries and timeouts

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