URL maps for routing in GCP - Time & Space Complexity
When using URL maps for routing in cloud infrastructure, it's important to understand how the routing decisions scale as the number of URL rules grows.
We want to know how the time to find the right route changes when more URL rules are added.
Analyze the time complexity of the following URL map routing setup.
resource "google_compute_url_map" "example" {
name = "example-url-map"
default_service = google_compute_backend_service.default.self_link
host_rule {
hosts = ["example.com"]
path_matcher = "path-matcher-1"
}
path_matcher {
name = "path-matcher-1"
default_service = google_compute_backend_service.default.self_link
path_rule {
paths = ["/images/*"]
service = google_compute_backend_service.images.self_link
}
path_rule {
paths = ["/videos/*"]
service = google_compute_backend_service.videos.self_link
}
}
}
This configuration routes requests based on host and path rules to different backend services.
Identify the API calls, resource provisioning, data transfers that repeat.
- Primary operation: Matching incoming request paths against path rules in the URL map.
- How many times: Once per incoming request, checking each path rule until a match is found.
As the number of path rules increases, the routing system checks more rules to find the correct backend.
| Input Size (n) | Approx. Path Rules Checked |
|---|---|
| 10 | Up to 10 checks |
| 100 | Up to 100 checks |
| 1000 | Up to 1000 checks |
Pattern observation: The number of checks grows roughly in direct proportion to the number of path rules.
Time Complexity: O(n)
This means the time to route a request grows linearly with the number of path rules to check.
[X] Wrong: "Routing time stays the same no matter how many path rules exist."
[OK] Correct: Each additional path rule adds more checks, so routing takes longer as rules increase.
Understanding how routing scales helps you design efficient URL maps and anticipate performance as your app grows.
"What if the URL map used a tree structure for path matching instead of a list? How would the time complexity change?"
Practice
Solution
Step 1: Understand URL map role
A URL map directs web traffic to backend services depending on URL patterns.Step 2: Identify correct function
Routing based on URL paths or hosts matches the description of URL maps.Final Answer:
To route incoming web traffic to different backend services based on URL paths or hosts -> Option CQuick Check:
URL maps route traffic = B [OK]
- Confusing URL maps with storage or VM services
- Thinking URL maps monitor traffic instead of routing
- Assuming URL maps create resources automatically
Solution
Step 1: Identify correct key for multiple path matchers
The key for multiple path matchers is plural: "pathMatchers" with an array value.Step 2: Confirm value type
The value must be an array of objects, so square brackets [] are needed.Final Answer:
"pathMatchers": [{"name": "pm1", "defaultService": "backend1"}] -> Option BQuick Check:
Multiple path matchers use "pathMatchers" array = A [OK]
- Using singular "pathMatcher" for multiple entries
- Using object instead of array for pathMatchers
- Mixing singular/plural keys incorrectly
https://example.com/images/logo.png?
{
"defaultService": "backend-default",
"pathMatchers": [
{
"name": "pm-images",
"defaultService": "backend-images",
"pathRules": [
{"paths": ["/images/*"], "service": "backend-images"}
]
}
]
}Solution
Step 1: Check path rules for "/images/*"
The path matcher "pm-images" has a path rule matching "/images/*" directing to "backend-images".Step 2: Match request URL path
The request path "/images/logo.png" matches the "/images/*" pattern, so it routes to "backend-images".Final Answer:
backend-images -> Option AQuick Check:
Path "/images/*" matches request = backend-images [OK]
- Choosing defaultService without checking pathRules
- Assuming no match causes failure instead of default routing
- Confusing path patterns with exact matches
{
"defaultService": "backend-default",
"pathMatchers": [
{
"name": "pm1",
"defaultService": "backend1",
"pathRules": [
{"paths": ["/app/*"], "service": "backend-app"}
]
}
]
}
Why does a request to https://example.com/app go to backend-default instead of backend-app?Solution
Step 1: Understand path pattern matching
The pattern "/app/*" matches paths starting with "/app/" but not "/app" exactly.Step 2: Check request path against pattern
The request path "/app" lacks the trailing slash, so it does not match "/app/*" and falls back to defaultService.Final Answer:
The path "/app" does not match the pattern "/app/*" which requires a trailing slash -> Option DQuick Check:
Trailing slash matters in path patterns = C [OK]
- Assuming "/app" matches "/app/*" without slash
- Thinking defaultService always overrides pathRules
- Believing backend service must be explicitly defined to route
https://example.com/api/v1/users to backend-v1 and requests to https://example.com/api/v2/users to backend-v2. Which URL map configuration correctly achieves this?Solution
Step 1: Check path rules for specific version routing
{ "defaultService": "backend-default", "pathMatchers": [ { "name": "pm-api", "defaultService": "backend-default", "pathRules": [ {"paths": ["/api/v1/*"], "service": "backend-v1"}, {"paths": ["/api/v2/*"], "service": "backend-v2"} ] } ] } defines two distinct path rules: "/api/v1/*" to "backend-v1" and "/api/v2/*" to "backend-v2" which matches requirements.Step 2: Verify defaultService and pathRules consistency
{ "defaultService": "backend-default", "pathMatchers": [ { "name": "pm-api", "defaultService": "backend-default", "pathRules": [ {"paths": ["/api/v1/*"], "service": "backend-v1"}, {"paths": ["/api/v2/*"], "service": "backend-v2"} ] } ] } uses "backend-default" as defaultService, so unmatched paths go there, which is correct.Step 3: Identify issues in other options
{ "defaultService": "backend-default", "pathMatchers": [ { "name": "pm-api", "defaultService": "backend-v1", "pathRules": [ {"paths": ["/api/v1/*"], "service": "backend-v1"}, {"paths": ["/api/v2/*"], "service": "backend-v2"} ] } ] } sets defaultService to "backend-v1" which may misroute unmatched paths. { "defaultService": "backend-default", "pathMatchers": [ { "name": "pm-api", "defaultService": "backend-v2", "pathRules": [ {"paths": ["/api/v1/*"], "service": "backend-v1"} ] } ] } misses "/api/v2/*" pathRule. { "defaultService": "backend-default", "pathMatchers": [ { "name": "pm-api", "defaultService": "backend-default", "pathRules": [ {"paths": ["/api/*"], "service": "backend-v1"}, {"paths": ["/api/*"], "service": "backend-v2"} ] } ] } duplicates "/api/*" paths causing conflict.Final Answer:
Option A correctly routes /api/v1/* and /api/v2/* to respective backends -> Option AQuick Check:
Distinct pathRules for versions = A [OK]
- Setting defaultService to one version backend
- Missing pathRule for one version
- Duplicating same path pattern causing conflicts
Ready to prove it?
Pass the test and this pattern moves unknown
