Bird
Raised Fist0
LLDsystem_design~25 mins

Delivery agent assignment in LLD - System Design Exercise

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
Design: Delivery Agent Assignment System
Includes order intake, agent status management, assignment logic, and notifications. Excludes payment processing and customer support.
Functional Requirements
FR1: Assign delivery agents to new orders automatically
FR2: Support real-time location tracking of delivery agents
FR3: Handle up to 10,000 concurrent orders per hour
FR4: Allow manual reassignment by dispatchers
FR5: Notify agents of new assignments instantly
FR6: Ensure agents are assigned based on proximity and availability
FR7: Support agent status updates (available, busy, offline)
Non-Functional Requirements
NFR1: API response time for assignment should be under 200ms (p99)
NFR2: System availability target is 99.9% uptime
NFR3: Support up to 5,000 active delivery agents simultaneously
NFR4: Data consistency for agent status and assignments must be strong
Think Before You Design
Questions to Ask
❓ Question 1
❓ Question 2
❓ Question 3
❓ Question 4
❓ Question 5
Key Components
Order intake API
Agent location tracking service
Assignment engine
Notification service
Agent status management
Database for orders and agents
Design Patterns
Geospatial indexing for proximity search
Event-driven architecture for real-time updates
Circuit breaker for external notification failures
Caching for agent availability
Load balancing for API endpoints
Reference Architecture
  +-------------+       +----------------+       +---------------------+
  |  Order API  | ----> | Assignment Eng | ----> | Notification Service |
  +-------------+       +----------------+       +---------------------+
         |                      |                          |
         v                      v                          v
  +----------------+    +----------------+         +----------------+
  | Agent Location |    | Agent Status   |         |   Database     |
  | Tracking Svc   |    | Management     |         | (Orders, Agents)|
  +----------------+    +----------------+         +----------------+
Components
Order API
REST API with Node.js or Python Flask
Receive new orders and trigger assignment process
Agent Location Tracking Service
WebSocket or MQTT service
Receive and update real-time agent GPS locations
Agent Status Management
In-memory store like Redis
Track agent availability and status updates
Assignment Engine
Microservice in Go or Java
Assign agents to orders based on proximity and availability
Notification Service
Push notification system (Firebase, APNs)
Notify agents instantly about new assignments
Database
PostgreSQL with PostGIS extension
Store orders, agents, and geospatial data
Request Flow
1. 1. Customer places an order via Order API.
2. 2. Order API stores order in database and triggers Assignment Engine.
3. 3. Assignment Engine queries Agent Status Management for available agents.
4. 4. Assignment Engine queries Agent Location Tracking Service or database for agent locations.
5. 5. Assignment Engine selects nearest available agent using geospatial queries.
6. 6. Assignment Engine updates order with assigned agent in database.
7. 7. Notification Service sends assignment notification to the selected agent.
8. 8. Agent status is updated to busy in Agent Status Management.
9. 9. Agent accepts or rejects assignment; status updates accordingly.
Database Schema
Entities: - Agent (agent_id PK, name, phone, status ENUM('available','busy','offline'), last_location POINT, last_update TIMESTAMP) - Order (order_id PK, customer_id, pickup_location POINT, dropoff_location POINT, status ENUM('pending','assigned','delivered'), assigned_agent_id FK) - Assignment Log (assignment_id PK, order_id FK, agent_id FK, assigned_at TIMESTAMP, status ENUM('accepted','rejected')) Relationships: - One Agent can have many Assignments - One Order has one assigned Agent
Scaling Discussion
Bottlenecks
Assignment Engine CPU overload due to high concurrent assignment requests
Database geospatial query latency with large agent and order volumes
Notification service delays or failures under high load
Real-time location updates overwhelming tracking service
Solutions
Horizontal scale Assignment Engine with load balancers and stateless design
Use geospatial indexes (PostGIS) and cache nearby agents in Redis for faster lookups
Implement retry and fallback mechanisms in Notification Service; use message queues
Batch location updates and use efficient protocols like MQTT; shard tracking service by region
Interview Tips
Time: 10 minutes for requirements and clarifications, 15 minutes for architecture and data flow, 10 minutes for scaling and trade-offs, 10 minutes for Q&A
Clarify assignment criteria and real-time constraints
Explain choice of geospatial indexing and caching
Discuss strong consistency needs for agent status
Highlight event-driven notifications and failure handling
Address scaling challenges with concrete solutions

Practice

(1/5)
1.

What is the primary goal of a delivery agent assignment system?

easy
A. Match orders to available delivery agents nearby
B. Track payment details of customers
C. Manage inventory in warehouses
D. Calculate delivery charges for orders

Solution

  1. Step 1: Understand the system purpose

    The delivery agent assignment system focuses on connecting orders with delivery agents who can fulfill them.
  2. Step 2: Identify the main function

    Matching orders to free agents nearby ensures timely delivery and efficient resource use.
  3. Final Answer:

    Match orders to available delivery agents nearby -> Option A
  4. Quick Check:

    Delivery agent assignment = Matching orders to agents [OK]
Hint: Focus on matching orders to agents, not payments or inventory [OK]
Common Mistakes:
  • Confusing delivery assignment with payment processing
  • Thinking inventory management is part of agent assignment
  • Assuming delivery charges calculation is the main goal
2.

Which data structure is best to quickly find the nearest free delivery agent for an order?

easy
A. Priority queue sorted by distance from order location
B. Stack of agents in order of registration
C. Hash map keyed by agent ID
D. Linked list of all agents

Solution

  1. Step 1: Identify the need for sorting by distance

    To find the nearest free agent, sorting agents by their distance to the order location is essential.
  2. Step 2: Choose a data structure supporting efficient nearest retrieval

    A priority queue can efficiently provide the closest agent by always giving the smallest distance first.
  3. Final Answer:

    Priority queue sorted by distance from order location -> Option A
  4. Quick Check:

    Nearest agent search = Priority queue [OK]
Hint: Use priority queue for nearest-first retrieval [OK]
Common Mistakes:
  • Using hash map which doesn't sort by distance
  • Using stack or linked list which are inefficient for nearest search
  • Ignoring the need to sort by distance
3.

Consider this pseudocode for assigning an agent:
for agent in agents:
  if agent.status == 'free' and distance(agent, order) < min_distance:
    min_distance = distance(agent, order)
    assigned_agent = agent
return assigned_agent

What will this code return if all agents are busy?

medium
A. The closest free agent
B. None or null
C. The first agent in the list
D. An error due to undefined variable

Solution

  1. Step 1: Check variable initializations

    The code does not initialize assigned_agent or min_distance before the loop.
  2. Step 2: Trace execution when all agents are busy

    The if condition's first part (agent.status == 'free') fails for all agents, so due to short-circuit evaluation of 'and', the second part (distance < min_distance) is never evaluated. The loop ends without ever setting assigned_agent. Returning an uninitialized assigned_agent causes an error due to undefined variable.
  3. Final Answer:

    An error due to undefined variable -> Option D
  4. Quick Check:

    No initialization + all busy = undefined variable error [OK]
Hint: No variable initialization leads to undefined variable error [OK]
Common Mistakes:
  • Thinking assigned_agent defaults to None or null
  • Assuming it returns the first agent regardless of status
  • Believing the code handles no free agents gracefully
4.

Given this snippet:
assigned_agent = None
for agent in agents:
  if agent.status = 'free':
    assigned_agent = agent
return assigned_agent

What is the main error in this code?

medium
A. Returning assigned_agent inside the loop
B. Not initializing assigned_agent before loop
C. Using assignment operator '=' instead of comparison '==' in if condition
D. Using 'free' instead of 'available' as status

Solution

  1. Step 1: Check the if condition syntax

    The condition uses '=' which assigns value instead of '==' which compares values.
  2. Step 2: Understand impact of wrong operator

    This causes a syntax error or unintended behavior because '=' cannot be used in conditions.
  3. Final Answer:

    Using assignment operator '=' instead of comparison '==' in if condition -> Option C
  4. Quick Check:

    Use '==' for comparison, not '=' [OK]
Hint: Use '==' for comparisons in conditions [OK]
Common Mistakes:
  • Confusing '=' with '==' in if statements
  • Thinking assigned_agent must be initialized inside loop
  • Assuming return inside loop is the error
5.

You want to design a scalable delivery agent assignment system for a city with thousands of agents and orders per minute. Which approach best improves scalability?

hard
A. Use a centralized server to check all agents for every order
B. Partition the city into zones and assign agents within zones only
C. Assign agents randomly without considering location
D. Assign the oldest registered agent to every order

Solution

  1. Step 1: Understand scalability challenges

    Checking all agents for every order is slow and resource-heavy at large scale.
  2. Step 2: Choose a partitioning strategy

    Dividing the city into zones limits search space, making assignment faster and scalable.
  3. Step 3: Evaluate other options

    Random or oldest agent assignment ignores location, causing delays and inefficiency.
  4. Final Answer:

    Partition the city into zones and assign agents within zones only -> Option B
  5. Quick Check:

    Zone partitioning = scalable assignment [OK]
Hint: Divide city into zones to limit search scope [OK]
Common Mistakes:
  • Using centralized server causing bottlenecks
  • Ignoring agent location in assignment
  • Assigning agents randomly or by registration time