Maps and Navigation System Design Template
Vector tiles and CDN, region-sharded routing graph with customizable contraction hierarchies, live-traffic ETA, rerouting, geocoding, offline packs
Cách dùng: Use it when designing map rendering, route planning or turn-by-turn navigation, or preparing a maps interview. Fill the coverage area, traffic data source and the three load numbers (tiles, routes, location batches) first. The main pitfall is treating routing as a per-request Dijkstra on static weights instead of separating per-release preprocessing from per-minute traffic customization.
Xem trước
System Design: [Maps and navigation service name]
Reference design for a maps and turn-by-turn navigation service: map rendering with pre-generated vector tiles, a routing engine built on a contraction-hierarchy style road graph that accepts live traffic weights, ETA prediction, rerouting from streamed location updates, geocoding and offline map packs. It follows the structure of the System Design Document template, adds a 45-minute interview path, access-pattern and failure-mode tables, and is pre-filled with a worked design to adapt. Replace every
[bracketed]value and every row marked Example; values marked Example are assumptions, not benchmarks.
Document control
| Field | Value |
|---|---|
| Document ID | [SDD-MAP-001] |
| System / feature | [Maps, routing and navigation] |
| Version | [0.1] |
| Status | [Draft / In review / Approved / Implemented / Superseded] |
| Owner | [@owner] |
| Author(s) | [@author] |
| Reviewers | [@reviewer-1], [@reviewer-2] |
| Last updated | YYYY-MM-DD |
| Classification | [Internal / Confidential] |
| Coverage area | [Countries or regions served] |
| Map data sources and licences | [Source, licence, release cadence] |
| Related | [Location privacy policy], [Traffic data contract], [ADR: tile format] |
Approvals
| Role | Name | Decision | Date |
|---|---|---|---|
| Tech lead | [@name] | [Approved / Changes requested] | YYYY-MM-DD |
| Staff / principal engineer | [@name] | [Decision] | YYYY-MM-DD |
| SRE / operations | [@name] | [Decision] | YYYY-MM-DD |
| Privacy / data protection | [@name] | [Decision] | YYYY-MM-DD |
| Product (navigation) | [@name] | [Decision] | YYYY-MM-DD |
Revision history
| Version | Date | Author | Change summary |
|---|---|---|---|
| 0.1 | YYYY-MM-DD | [@name] | First draft for design review |
| 0.2 | YYYY-MM-DD | [@name] | Example: Moved from raster to vector tiles after bandwidth estimate |
| 0.3 | YYYY-MM-DD | [@name] | Example: Replaced plain contraction hierarchies with a customizable variant for live traffic |
| 1.0 | YYYY-MM-DD | [@name] | Example: Approved |
Contents
1. Overview
1.1 Problem statement
[Example: The current product shows raster map images from a third-party provider and computes routes with a plain shortest-path search on static speed limits. Routes ignore congestion, ETAs are wrong by more than 20% at rush hour, and the per-request provider bill grows faster than usage. The product needs its own map rendering, traffic-aware routing and navigation for [coverage area].]
1.2 Proposed solution
[Example: A batch pipeline turns map data into vector tiles, a routing graph and a geocoding index for each release. Clients fetch tiles from a CDN and render them locally. A routing service holds a preprocessed road graph per region in memory and applies live traffic weights every minute through a customization step, so queries stay fast while weights change. Navigating clients stream batched location samples; a traffic pipeline map-matches them to road segments and publishes segment speeds. A navigation session service compares each client's progress with its route and triggers rerouting when the client leaves the route or a much faster route appears. Offline packs bundle tiles, a compact routing graph and a geocoding subset per area.]
1.3 Decisions requested from reviewers
| ID | Question | Recommended option | Section |
|---|---|---|---|
| Q-01 | Example: Raster or vector tiles? | Vector tiles up to zoom 14, client overzoom above | 7.1, 10 |
| Q-02 | Example: Which speed-up technique for routing? | Customizable contraction hierarchy (metric-independent preprocessing, per-minute customization) | 7.2 |
| Q-03 | Example: Where does rerouting run? | Server decides, client has an offline fallback | 7.4 |
| Q-04 | Example: How long are raw location traces kept? | 24 hours raw, then aggregated per segment only | 9.2 |
| [Q-nn] | [Question] | [Option] | [Section] |
1.4 45-minute interview path
Use this order when the document serves an interview or a short review. It fits the time and leaves room for one deep dive chosen by the interviewer.
| Minutes | Cover | Output on the whiteboard |
|---|---|---|
| 0 to 5 | Scope: map view, route, ETA, turn-by-turn; state below-the-line items | Three core flows, coverage area |
| 5 to 10 | Estimates: tile requests, route requests, location updates per second | Three numbers, each with its consequence |
| 10 to 15 | API: tile fetch, route request, location batch, reroute push | Four calls |
| 15 to 25 | High-level design: tile pipeline and CDN, routing service, traffic pipeline, session service | One diagram with three separate paths |
| 25 to 40 | One deep dive: routing with live traffic (default), or ETA, or rerouting | Options, choice, reason |
| 40 to 45 | Failures and trade-offs: stale traffic, region outage, privacy of traces | Failure table rows, one 10x change |
Pick the routing deep dive unless the interviewer steers elsewhere: it is where a naive answer (run Dijkstra on the planet per request) fails most visibly. Say early that tiles are a caching problem, not a compute problem.
2. Requirements
2.1 Core functional requirements
| ID | Requirement | Priority |
|---|---|---|
| FR-01 | Example: Render a pannable, zoomable map of the coverage area | Must |
| FR-02 | Example: Compute a driving route between two points with up to 3 alternatives | Must |
| FR-03 | Example: Show an ETA that reflects current traffic | Must |
| FR-04 | Example: Give turn-by-turn guidance and reroute when the driver leaves the route | Must |
| FR-05 | Example: Convert an address or place name to coordinates and back (geocoding, reverse geocoding) | Must |
| FR-06 | Example: Download an area for offline viewing, search and routing | Should |
| FR-07 | Example: Walking and cycling profiles | Should |
| [FR-nn] | [Requirement] | [Must / Should / Could] |
2.2 Non-functional requirements
| ID | Quality | Target | Measured as |
|---|---|---|---|
| NFR-01 | Tile latency | Example: p95 at or below 100 ms from CDN | Client real-user metrics |
| NFR-02 | Route latency | Example: p95 at or below 300 ms for routes under 500 km | Server timing |
| NFR-03 | ETA accuracy | Example: Median absolute error under 10% at arrival | Predicted vs actual for completed trips |
| NFR-04 | Traffic freshness | Example: Segment speeds reflect conditions within 2 minutes | Lag from sample to published speed |
| NFR-05 | Reroute time | Example: New route on screen within 3 s of leaving the route | Session timing |
| NFR-06 | Availability | Example: 99.95% for routing; map view works from cache during outages | Synthetic probes |
| NFR-07 | Privacy | Example: No raw trace retained beyond 24 h; no trace linked to an account after aggregation | Data audit |
| [NFR-nn] | [Quality] | [Target] | [Measurement] |
2.3 Below the line (out of scope)
- [Example: public transit routing with timetables (needs a different algorithm family)]
- [Example: collecting and editing base map data (consumed as releases from the data team)]
- [Example: places reviews, photos and business listings]
- [Example: truck routing with legal restrictions per vehicle]
- [Item deferred, with the release that will take it]
3. Capacity estimation
3.1 Assumptions
| Input | Symbol | Value | Source |
|---|---|---|---|
| Daily active users | Example: 100 million | Product forecast | |
| Share of users who navigate per day | Example: 20% | Usage analytics | |
| Navigation sessions per navigating user per day | Example: 2 | Usage analytics | |
| Average session length | Example: 25 min | Usage analytics | |
| Peak to average ratio | Example: 3 | Hourly traffic curve | |
| Location batch interval while navigating | Example: 5 s | Client design | |
| Tiles fetched per user per day | Example: 100 | Client telemetry | |
| Road graph edges in the largest region | Example: 500 million | Map data release |
3.2 Location updates
Sessions per day and average concurrent sessions:
Consequence: location ingestion is the highest-rate write path. It goes into a partitioned log, never into a database on the request path, and the session service keeps only the latest position per session in memory.
3.3 Route requests
Assume per day one route per session, two reroutes per session on average, and 60 million route previews from users who do not start navigation:
Consequence: the route rate is modest, so routing is bounded by memory (the graph must stay resident) more than by CPU. Even at an Example 15 ms of CPU per query including two alternatives, the peak needs about cores per copy of the fleet, which is small.
3.4 Routing graph memory
With shortcuts, a contracted graph holds roughly twice the original edges. At an Example 20 bytes per stored edge:
Consequence: one region fits on one large-memory server, so we shard routing by region (continent or country group), replicate each region graph, and handle the rare cross-region route with a coarse overlay graph.
3.5 Tiles
Tile requests and origin load with an Example CDN hit rate of 95%:
Zoom 14 has tiles. If 30% hold data and an average vector tile is Example 20 KB, zoom 14 needs about 1.6 TB, and all lower zooms together add about one third more, about 2.1 TB per release.
Consequence: tiles are generated once per data release, stored in object storage and served through a CDN; the origin only fills cache misses.
3.6 Summary
| Quantity | Estimate | Design consequence |
|---|---|---|
| Location batches | ~420 000/s at peak | Partitioned log; latest position in memory only |
| Route requests | ~6 250/s at peak | Small CPU fleet; size by memory per region |
| Graph memory | ~20 GB per large region | Shard routing by region; replicas per region |
| Tile requests | ~350 000/s at peak, ~17 500/s at origin | CDN first; pre-generated tiles in object storage |
| Tile storage | ~2 TB per release | Keep two releases for rollback; offline packs cut from the same set |
4. API design
4.1 Endpoints
| Interface | Operation | Purpose |
|---|---|---|
| Tiles | GET /tiles/v1/{release}/{z}/{x}/{y}.mvt | Vector tile, immutable per release, long cache lifetime |
| Routing | POST /v1/routes | Compute route and alternatives with ETA |
| Navigation | POST /v1/sessions | Start a navigation session for a chosen route |
| Navigation | POST /v1/sessions/{id}/locations | Upload a batch of location samples |
| Navigation | Server push on session channel | Reroute, ETA update, incident ahead |
| Geocoding | GET /v1/geocode?q=&near= and GET /v1/reverse?lat=&lng= | Address and place lookup |
| Offline | GET /v1/offline/packs?bbox= | List packs and their versions for an area |
4.2 Request and response examples
A route request, its response, and one location batch from a navigating client:
POST /v1/routes HTTP/1.1
Content-Type: application/json
{"origin": {"lat": 10.7769, "lng": 106.7009}, "destination": {"lat": 10.8231, "lng": 106.6297}, "profile": "car", "alternatives": 2, "depart_at": "now", "avoid": ["tolls"]}
{"routes": [{"route_id": "rt_9f2c", "distance_m": 11240, "duration_s": 1680, "duration_no_traffic_s": 1260, "polyline": "[encoded polyline]", "legs": [{"steps": [{"maneuver": "turn-right", "street": "[Street name]", "distance_m": 420}]}], "traffic_version": "2026-10-22T08:14Z", "graph_release": "2026.42"}]}
{"session_id": "nav_51ab", "samples": [{"t": 1792640000, "lat": 10.7771, "lng": 106.7012, "speed_mps": 8.1, "heading": 82, "accuracy_m": 6}]}
4.3 Errors and limits
| Case | Status | Body type |
|---|---|---|
| No route (island, closed area) | 422 | problems/no-route |
| Point outside coverage | 422 | problems/out-of-coverage |
| Unknown or retired graph release | 409 | problems/stale-release, client refreshes |
| Too many requests | 429 with Retry-After | problems/rate-limited |
Route requests are idempotent reads. Location batches carry a sequence number per session so the server drops duplicates after client retries.
5. Data model
5.1 Entities
The graph entities come from the data release; speeds and sessions are runtime data with short lifetimes.
5.2 Storage choices
| Data | Store | Why |
|---|---|---|
| Vector tiles | Example: Object storage per release, CDN in front | Immutable, cache forever per release |
| Road graph and shortcuts | In-memory arrays on routing servers, loaded from a release file | Random access at memory speed |
| Live segment speeds | Example: In-memory table per region, snapshot each minute to object storage | Read by routing customization every minute |
| Speed profiles (typical speed per weekday slot) | Columnar files per release | Batch built, read for future departures |
| Session state | Example: Sharded in-memory store with TTL | Latest position only, high write rate |
| Places and addresses | Search index with a geo field | Text plus proximity queries |
5.3 Access patterns
| Query | Key or index that serves it | Partition key and rationale |
|---|---|---|
| Fetch tile for a view | release/z/x/y object key | None needed; CDN caches by URL |
| Route from A to B | Node arrays and shortcut arrays in memory | Region; a route almost always stays in one region |
| Speeds for customization | Segment id array, dense index | Region, same as the graph, so no cross-shard reads |
| Latest position of a session | session_id | session_id hash; spreads hot cities evenly |
| Samples to aggregate per segment | Log keyed by H3 cell at a coarse resolution | Geography, so one aggregator sees all samples of a road stretch |
| Geocode "address near me" | Text index plus geo filter | Country, because address formats and data releases are per country |
| Offline pack for an area | Pack manifest by region and release | Region, matching how packs are cut |
6. High-level design
| Component | Responsibility | Scales by |
|---|---|---|
| Tile generator | Cut data into vector tiles per zoom | Batch workers per release |
| CDN | Serve tiles, absorb almost all read traffic | Provider |
| Routing service | Answer route queries on the customized graph | Replicas per region |
| Customization job | Apply new speeds to the preprocessed graph | One per region, every minute |
| Location ingest | Accept batches, validate, write to the log | Stateless instances |
| Map matching | Snap noisy samples to road segments | Log partitions |
| Segment speed aggregator | Turn matched samples into speeds per segment and minute | Log partitions |
| Navigation session service | Track progress, decide reroutes, push updates | Sessions per shard |
| Geocoding service | Text and reverse lookups | Replicas per country index |
7. Detailed design
7.1 Deep dive: map tiles
The map is cut into square tiles addressed by zoom , column and row in the Web Mercator projection; zoom has tiles.
| Option | How it works | Cost | Fit |
|---|---|---|---|
| Raster tiles, pre-rendered | Server draws PNG images per zoom | Large storage, one image set per style and language | Simple clients, no styling at runtime |
| Raster tiles, on demand | Render on request, cache | Render farm sized for misses | Rarely viewed areas |
| Vector tiles, pre-generated | Geometry and attributes encoded per tile (Mapbox Vector Tile format), client renders | Smaller transfers, client GPU work | Rotation, tilt, dark mode, labels in the user's language |
Choice: vector tiles pre-generated up to zoom 14, with the client overzooming (reusing zoom 14 geometry) for closer views. Reason: one tile set serves every style and language, transfers are smaller than raster, and the client can rotate the map during navigation without new requests. Generalise geometry per zoom so a zoom 5 tile does not carry every building.
Tile URLs include the release, so tiles are immutable and cacheable for the life of the release. A new release changes the URL prefix; nothing is purged.
7.2 Deep dive: routing on a road graph with live traffic
The road network is a directed graph: intersections are nodes, road segments are edges with a travel-time weight. Turn restrictions are modelled as edges between segment pairs or as a turn-cost table.
| Option | Query cost | Weight changes | Notes |
|---|---|---|---|
| Dijkstra | Explores every node closer than the target; seconds on a continent | Free | Correct baseline, too slow at scale |
| A* with a distance lower bound | Fewer nodes, still large on long routes | Free | Good for walking in small areas |
| Contraction hierarchies (CH) | Very small search (bidirectional, upward only) | Full re-preprocessing, minutes to hours | Fast but assumes fixed weights |
| Customizable variants (CCH, CRP) | Slightly slower than CH | Customization in seconds | Separates topology preprocessing from weights |
How contraction works, in short: rank nodes by importance, remove them one at a time from least important upward, and add a shortcut edge whenever removing a node would break a shortest path between its neighbours. A query then runs two searches, forward from the origin and backward from the destination, each only climbing to more important nodes, and meets in the middle.
Choice: a customizable variant. The expensive step depends only on the road topology and runs once per data release; a customization step applies the live travel times every minute and finishes in seconds. Reason: plain CH would need full preprocessing for every traffic update, while Dijkstra or A* cannot meet NFR-02 on long routes.
Alternatives come from penalising the edges of the best route and searching
again, keeping routes that differ enough and are not much longer. Return the
traffic_version so a reroute can be compared fairly with the original.
7.3 Deep dive: ETA with live traffic
The ETA is the sum of predicted travel times along the route at the time the driver will reach each segment, not at departure time.
| Option | Strength | Weakness |
|---|---|---|
| Static speed limits | Simple | Wrong whenever traffic exists |
| Live speeds only | Reflects now | Wrong for segments reached in 40 minutes |
| Historical profile per weekday slot | Captures rush hour | Misses incidents |
| Blend: live for near segments, profile for far ones, learned correction | Best accuracy | Model to train and monitor |
Choice: blend. For each segment use the live speed if the driver reaches it soon, fade toward the historical profile further ahead, then apply a learned correction per route (intersections, turns, time of day) trained on completed trips. Reason: it meets NFR-03 without a heavy model on the request path; the correction is a small model served next to the router.
Speeds come from map-matched samples. Aggregate per segment per minute only when at least Example 3 distinct sessions contributed; otherwise fall back to the profile. This also protects privacy (9.2).
7.4 Deep dive: location updates and rerouting
Clients sample GPS every second and send a batch every 5 s while navigating. The session service keeps the route, the last matched position and the expected progress.
| Option | Pros | Cons |
|---|---|---|
| Client detects off-route and asks for a new route | Fast, works with poor signal | Client logic per platform, no server view of traffic changes |
| Server decides everything | One implementation, can push faster routes | Depends on connectivity |
| Hybrid | Client detects off-route instantly, server pushes faster routes | Two code paths to test |
Choice: hybrid. The client detects leaving the route (for example a distance above a threshold for several consecutive samples) and requests a reroute immediately; the server re-evaluates the remaining route every Example 2 minutes against fresh traffic and pushes a better route only when it saves more than Example 3 minutes or 10%. Reason: NFR-05 needs a local decision, while traffic changes are visible only on the server.
Map matching snaps noisy samples to the most likely sequence of segments, using the road geometry and the order of samples, not just the nearest road. A nearest-road snap confuses parallel roads and overpasses.
7.5 Geocoding
Forward geocoding parses a free-text query, matches it against an address and
place index, and ranks by text score, importance and distance from the user.
Reverse geocoding finds the nearest address or street to a point with a
spatial index. Keep one index per country so formats and releases stay
independent. Typing suggestions reuse the prefix techniques in Search
Autocomplete System Design (system-design/design-search-autocomplete).
7.6 Offline maps
An offline pack holds the vector tiles for an area up to zoom 14, a compact routing graph for the same area with typical speed profiles, and a geocoding subset. Packs are versioned with the data release; the client downloads a binary diff when a new release covers its packs. Offline routing has no live traffic, so the client labels the ETA as an estimate and switches to online routing when connectivity returns.
7.7 How real systems do it
How real systems do it (paraphrased, not copied). Delling, Goldberg, Pajor and Werneck describe Customizable Route Planning (SEA 2011): a preprocessing phase that depends only on the road network, a fast customization phase that applies any cost function, and a query phase. Microsoft Research states that the approach underlies the routing engine of Bing Maps. The key idea for this design is the same split: run the expensive work per map release, and run the cheap work per traffic update. Uber's H3 write-up (2018) describes a hexagonal, hierarchical grid used to aggregate and analyse spatial data, which is the role H3 cells play here for partitioning location samples. Read the originals in 12.3; this box keeps only the general idea.
8. Scalability and performance
| Concern | Approach | Limit before redesign |
|---|---|---|
| Tile reads | CDN with immutable URLs per release | Origin sized for cache misses only |
| Route queries | Replicas per region, graph in memory | Example: graph above about 60% of server memory |
| Customization | Parallel per cell of the partition, atomic weight swap | Example: must finish within the 60 s update interval |
| Location ingestion | Log partitioned by coarse H3 cell | Hot partitions in dense cities; split cells further |
| Session state | Sharded by session id, TTL | Memory per shard |
| Cross-region routes | Overlay graph of border nodes | Rare long routes take a slower path |
Latency budget for a route request (target p95 300 ms):
| Step | Budget |
|---|---|
| Gateway, auth, rate limit | 20 ms |
| Snap origin and destination to the graph | 20 ms |
| Best route search and shortcut unpacking | 40 ms |
| Two alternatives | 80 ms |
| ETA correction model | 20 ms |
| Steps, street names, encoding | 20 ms |
| Network and headroom | 100 ms |
9. Reliability, security and operations
9.1 Failure modes
| Component | Failure | Detection | Blast radius | Mitigation | RTO |
|---|---|---|---|---|---|
| Traffic pipeline | Speeds stop updating | Freshness lag above 5 min | ETAs drift in all regions | Fall back to historical profiles, show "traffic unavailable" | Example: 15 min |
| Customization job | Job overruns or fails | Weight version age | One region keeps old weights | Keep serving last good weights | Example: 5 min |
| Routing region | All replicas down | Probe failures | Routing in one region | Route through a second site holding the same region graph | Example: 5 min |
| Bad data release | Broken roads or tiles | Release validation, canary errors | Whole product if shipped widely | Staged rollout by region, keep previous release | Example: 30 min |
| CDN | Provider outage | Real-user tile errors | Map view for new areas | Second CDN by DNS weight; client tile cache | Example: 15 min |
| Session service shard | Shard lost | Error rate | Sessions on that shard | Client keeps route and reroutes locally; session recreated from next batch | Example: 1 min |
| [Component] | [Failure] | [Signal] | [Scope] | [Mitigation] | [Time] |
9.2 Security and privacy
| Threat or duty | Control |
|---|---|
| Location traces reveal home and work | Raw samples kept Example 24 h, keyed by session not account; only aggregates kept longer |
| Re-identification from sparse roads | Publish a segment speed only with enough distinct sessions; drop trip start and end segments |
| Fake traffic from spoofed devices | Device attestation, plausibility checks on speed and heading, cap influence per device |
| Scraping tiles and routes | API keys, rate limits, signed tile URLs for partners |
| Data licence breach | Attribution in the client; licence check before redistribution in offline packs |
| [Threat] | [Control] |
9.3 Observability
| Signal | Metric | Alert threshold |
|---|---|---|
| ETA accuracy | Median absolute error by region | Example: above 12% for 1 h |
| Traffic freshness | Age of newest speeds | Above 5 min |
| Route latency | p95 by region | Above 300 ms for 10 min |
| Reroute rate | Reroutes per session | Doubling vs. 7-day baseline (map error or bad weights) |
| Tile errors | 4xx and 5xx at CDN | Above 0.5% |
9.4 Cost estimate
| Item | Unit cost | Quantity | Monthly cost |
|---|---|---|---|
| CDN egress | [USD per GB] | [GB per month] | [USD] |
| Routing servers (large memory) | [USD per node-month] | Example: 3 replicas x regions | [USD] |
| Location log and aggregation | [USD per node-month] | [Nodes] | [USD] |
| Object storage for releases | [USD per TB-month] | Example: 2 releases x 2 TB | [USD] |
| Total | [USD] |
10. Trade-offs and alternatives
| Decision | Options | Chosen | Why | What we give up |
|---|---|---|---|---|
| Tile format | Raster; vector | Vector | Smaller, restylable, rotatable | Client rendering work, older devices slower |
| Routing technique | Dijkstra or A*; CH; customizable CH or CRP | Customizable | Fast queries and minute-level traffic updates | More complex pipeline than plain CH |
| Graph sharding | One planet graph; per region | Per region with overlay | Fits memory, isolates failures | Cross-region routes slower |
| Reroute decision | Client; server; hybrid | Hybrid | Fast local reaction plus traffic awareness | Two code paths |
| Traffic retention | Keep traces; aggregate only | Aggregate after 24 h | Privacy and storage | Cannot reprocess old raw data |
| What changes at 10x / 0.1x | 10x users: location log and session shards first, then CDN cost; graph memory unchanged. 0.1x users: buy tiles and routing from a provider, keep only the session service | Revisit at each annual plan | Load profile shifts the build or buy line | [Note] |
| [Decision] | [Options] | [Chosen] | [Why] | [Cost] |
11. Delivery plan and risks
11.1 Milestones
| Milestone | Scope | Exit criterion | Target date |
|---|---|---|---|
| M1 | Tile pipeline and CDN for one country | Tile p95 within NFR-01 | YYYY-MM-DD |
| M2 | Routing with historical profiles | Route p95 within NFR-02 | YYYY-MM-DD |
| M3 | Live traffic and customization | Freshness within NFR-04 | YYYY-MM-DD |
| M4 | Navigation sessions and rerouting | Reroute time within NFR-05 | YYYY-MM-DD |
| M5 | Offline packs | Pack update by diff works on test devices | YYYY-MM-DD |
11.2 Rollout and rollback
[Example: Each data release ships to one region first and to the rest after 48 hours without regressions in reroute rate or ETA error. The previous release stays loaded on routing servers and tile URLs, so rollback is a configuration change that takes effect within 5 minutes.]
11.3 Risks
| ID | Risk | Likelihood | Impact | Mitigation | Owner |
|---|---|---|---|---|---|
| R-01 | Example: Too few probe vehicles for reliable speeds in small cities | High | Medium | Historical profiles, partner data, minimum sample rule | [@name] |
| R-02 | Example: Customization exceeds 60 s as the graph grows | Medium | High | Measure per release, split regions, parallelise cells | [@name] |
| R-03 | Example: Privacy complaint over trace retention | Low | High | Retention limits, DPIA, published policy | [@name] |
| [R-nn] | [Risk] | [L / M / H] | [L / M / H] | [Mitigation] | [@name] |
12. Appendices
12.1 Open questions
| ID | Question | Owner | Due |
|---|---|---|---|
| OQ-01 | Example: Do we license third-party traffic data for regions with few users? | [@name] | YYYY-MM-DD |
| OQ-02 | Example: Which zoom is the maximum for offline packs on low-storage devices? | [@name] | YYYY-MM-DD |
| [OQ-nn] | [Question] | [@name] | YYYY-MM-DD |
12.2 Glossary
| Term | Meaning |
|---|---|
| Vector tile | A tile carrying geometry and attributes that the client draws itself |
| Overzoom | Drawing a closer zoom from the most detailed tile available |
| Contraction hierarchy | Preprocessed graph with node ranks and shortcut edges that makes shortest-path queries small |
| Customization | Applying new edge weights to a preprocessed graph without redoing the topology work |
| Map matching | Snapping a sequence of noisy positions to the roads actually travelled |
| Speed profile | Typical speed per segment for each weekday and time slot |
| H3 cell | Hexagonal cell of Uber's hierarchical grid, used here to partition samples |
12.3 References
| Reference | Use |
|---|---|
| Geisberger, Sanders, Schultes, Delling, "Contraction Hierarchies: Faster and Simpler Hierarchical Routing in Road Networks", WEA 2008, LNCS 5038 | 7.2 contraction idea |
| Dibbelt, Strasser, Wagner, "Customizable Contraction Hierarchies", SEA 2014 (arXiv:1402.0402) | 7.2 customizable variant |
| Delling, Goldberg, Pajor, Werneck, "Customizable Route Planning", SEA 2011 (Microsoft Research) | 7.2 and 7.7 |
| Brodsky, "H3: Uber's Hexagonal Hierarchical Spatial Index", Uber engineering blog, 2018 | 5.3 and 7.7 partitioning idea |
| Mapbox Vector Tile Specification 2.1 (CC BY 3.0 US) | 7.1 tile encoding |
| Xu and Lam, System Design Interview: An Insider's Guide, Volume 2 (2022), chapter "Google Maps" | Inspiration only; no text or figures reused |
Ride-Hailing Dispatch System Design (system-design/design-ride-matching) | Driver location indexing and dispatch |
Search Autocomplete System Design (system-design/design-search-autocomplete) | Typing suggestions for places |
Back-of-Envelope Estimation and Capacity Model (system-design/back-of-envelope-estimation) | Method for section 3 |
Standard and licence note
Based on common industry practice for map rendering and route planning and on the published research and specifications cited in 12.3. The book and engineering write-ups listed there are inspiration only; no text, diagrams or numbers were copied, and all figures here are illustrative examples. Check the current version of each cited specification and the licence of your map data before use. Original text written for this collection. Template licence: MIT.
Template liên quan
Zanzibar-Style Authorization Service System Design Template
Relationship-based authorization service: relation tuples, namespace config, Check/Expand/List/Watch APIs, consistency tokens, caching, sharding, failure modes
Thiết kế hệ thốngCDC Pipeline System Design Template
CDC pipeline: log-based capture, watermark chunked snapshot, per-key order, schema evolution, outbox, search, cache and warehouse sinks, replay
Thiết kế hệ thốngChat System Design Template (Reference Design)
Real-time 1:1 and group chat: WebSocket gateways, per-conversation ordering, fan-out, receipts, offline sync, push, E2EE