Skip to main content

CDN & Edge Computing

TL;DR​

CDNs (Content Delivery Networks) cache static/semi-static content at edge locations worldwide, serving users from nearest point-of-presence (PoP). Reduces latency, origin load, and bandwidth costs. Edge computing pushes logic to the edge (Cloudflare Workers, AWS Lambda@Edge); suitable for lightweight transformations. Combine with origin auto-scaling for efficient global distribution.

Learning Objectives​

  • Understand CDN cache hierarchies and purging strategies.
  • Design cache headers and invalidation policies for content freshness.
  • Implement edge computing for lightweight request transformation.
  • Optimize origin infrastructure for cache misses and purges.
  • Monitor CDN performance and cost.

Motivating Scenario​

Your video platform serves global users. Serving all traffic from a single US region means Australian users experience 200+ ms latency. A CDN caches videos at edge locations; AU users get 10 ms latency from a Sydney PoP. Real-time content (product feeds, user profiles) uses edge computing to transform at low latency.

Mental Model​

CDN architecture: origin, edge caches, and edge compute near users.

Core Concepts​

Origin: Primary server hosting authoritative content.

Point of Presence (PoP): Geographic location with caches and compute. CDNs maintain 100+ PoPs globally.

Cache Headers: HTTP directives (Cache-Control, ETag, Last-Modified) control caching behavior and staleness.

Cache Purge: Invalidate cached content when origin updates. Can be instant or via surrogate keys.

Edge Computing: Execute code (JS, WASM) at CDN edges for request transformation, A/B testing, security filtering.

Practical Example​

resource "aws_cloudfront_distribution" "main" {
enabled = true
is_ipv6_enabled = true

origin {
domain_name = aws_s3_bucket.content.bucket_regional_domain_name
origin_id = "myS3Origin"

s3_origin_config {
origin_access_identity = aws_cloudfront_origin_access_identity.oai.cloudfront_access_identity_path
}
}

origin {
domain_name = "api.example.com"
origin_id = "myAPIOrigin"

custom_origin_config {
http_port = 80
https_port = 443
origin_protocol_policy = "https-only"
origin_ssl_protocols = ["TLSv1.2"]
}

origin_custom_header {
name = "X-Origin-Verify"
value = "secret-token-123"
}
}

default_cache_behavior {
allowed_methods = ["GET", "HEAD", "OPTIONS"]
cached_methods = ["GET", "HEAD"]
target_origin_id = "myS3Origin"

forwarded_values {
query_string = false

cookies {
forward = "none"
}
}

viewer_protocol_policy = "redirect-to-https"
min_ttl = 0
default_ttl = 3600
max_ttl = 86400

compress = true
}

# API cache behavior (shorter TTL)
ordered_cache_behavior {
path_pattern = "/api/*"
allowed_methods = ["GET", "HEAD", "OPTIONS", "PUT", "POST", "PATCH", "DELETE"]
cached_methods = ["GET", "HEAD"]
target_origin_id = "myAPIOrigin"

forwarded_values {
query_string = true
headers = ["Host", "CloudFront-Viewer-Country"]

cookies {
forward = "all"
}
}

viewer_protocol_policy = "https-only"
min_ttl = 0
default_ttl = 300
max_ttl = 3600
}

restrictions {
geo_restriction {
restriction_type = "none"
}
}

viewer_certificate {
cloudfront_default_certificate = true
}
}

# Cache invalidation (on deployment)
resource "aws_cloudfront_invalidation" "deploy" {
distribution_id = aws_cloudfront_distribution.main.id
paths = ["/*"] # Invalidate all on deploy
}

Decision Checklist​

  • CDN configured for geographic distribution?
  • Cache headers set appropriately by content type?
  • Cache purge strategy (instant vs TTL-based) defined?
  • Edge compute used for lightweight transformations?
  • CDN performance metrics monitored (hit ratio, latency)?

Self-Check​

  • How do CDNs reduce latency for global users?
  • What cache headers control freshness?
  • When would you use edge compute vs traditional CDN caching?
  • How do you balance cache TTL with content freshness?

One Takeaway​

CDNs are essential for global performance. Combine long TTLs for static assets, short TTLs for dynamic content, and edge compute for lightweight transformations near users.

Next Steps​

CDN Cost Optimization​

class CDNOptimizer:
def optimize_cache_ttl(self):
"""Balance freshness vs cache hit ratio"""
# Analysis of access patterns
for content_type in ['html', 'css', 'js', 'images', 'videos']:
hit_ratio = self.get_hit_ratio(content_type)
staleness_complaints = self.get_staleness_reports(content_type)

current_ttl = self.current_ttls[content_type]

# If hit ratio low, increase TTL
if hit_ratio < 0.5:
new_ttl = current_ttl * 2
logger.info(f"{content_type}: Increase TTL {current_ttl}s → {new_ttl}s")

# If too many complaints, decrease TTL
if staleness_complaints > 5_per_day:
new_ttl = current_ttl / 2
logger.info(f"{content_type}: Decrease TTL {current_ttl}s → {new_ttl}s")

# Recommended defaults (proven good)
# HTML (dynamic): 300s (5 min) - frequent updates, prefer fresh
# CSS/JS (versioned): 31536000s (1 year) - immutable (v1.2.3.css)
# Images (versioned): 31536000s (1 year)
# API responses (dynamic): 60s (1 min)

def estimate_bandwidth_savings(self):
"""Calculate savings from CDN vs direct origin"""
monthly_bandwidth = 1_000 # TB
origin_bandwidth_cost = 0.085 # $ per GB
cdn_cost = 0.085 # $ per GB (varies by provider)

# Origin: 1000 TB * $0.085 = $85,000/month
# CDN: 900 TB via CDN (90% hit ratio) = 900 * $0.085 = $76,500
# Savings: $8,500/month

# But also:
# - Reduced origin load (can downsize servers)
# - Better latency (users happier)
# - Global redundancy (disaster recovery)
# - DDoS protection (CDN handles)

Advanced Edge Computing Patterns​

Pattern 1: A/B Testing at Edge​

// Cloudflare Worker: Route traffic based on user ID
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
const url = new URL(request.url)
const userId = request.headers.get('X-User-ID')

// A/B test: Send 50% to old API, 50% to new API
const hashCode = hash(userId)
if (hashCode % 2 === 0) {
url.hostname = 'api-v1.example.com' // Control group (old)
} else {
url.hostname = 'api-v2.example.com' // Treatment group (new)
}

return fetch(new Request(url, request))
}

// Benefit: No changes to client code, test new APIs at edge
// Faster experimentation (real users, real traffic)

Pattern 2: Geo-Routing for Compliance​

// Route EU traffic to EU-based origin (GDPR compliance)
// Route US traffic to US-based origin
addEventListener('fetch', event => {
event.respondWith(handleGeoRouting(event.request))
})

async function handleGeoRouting(request) {
const country = request.headers.get('CF-IPCountry')
const url = new URL(request.url)

if (EU_COUNTRIES.includes(country)) {
url.hostname = 'eu.example.com' // EU origin
} else if (US_COUNTRIES.includes(country)) {
url.hostname = 'us.example.com' // US origin
} else {
url.hostname = 'global.example.com' // Default
}

return fetch(new Request(url, request))
}

// Ensures data residency compliance without client changes

Pattern 3: Bot Detection at Edge​

// Cloudflare Worker: Detect and block bots at edge
addEventListener('fetch', event => {
event.respondWith(detectAndRoute(event.request))
})

async function detectAndRoute(request) {
const userAgent = request.headers.get('User-Agent') || ''
const ip = request.headers.get('CF-Connecting-IP')

// Known bot patterns
const botPatterns = [
/googlebot/i,
/bingbot/i,
/curl/i,
/scrapy/i
]

const isBot = botPatterns.some(p => p.test(userAgent))

if (isBot && !isAllowedBot(ip)) {
// Route bot traffic to cheaper origin or cache longer
return new Response('Blocked', { status: 403 })
}

// Legitimate traffic proceeds
return fetch(request)
}

// Benefit: Block scrapers early, reduce origin load

Monitoring and Observability​

class CDNMonitoring:
def monitor_cache_health(self):
"""Track cache performance metrics"""
metrics = {
'cache_hit_ratio': self.get_metric('cache_hit_ratio'), # Target: > 85%
'p95_latency': self.get_metric('p95_latency'), # Target: < 100ms
'origin_requests': self.get_metric('origin_requests'),
'bandwidth_saved': self.estimate_bandwidth_saved(),
'geo_distribution': self.get_requests_by_location(),
}

# Alert if hit ratio drops
if metrics['cache_hit_ratio'] < 0.80:
alert(f"Cache hit ratio low: {metrics['cache_hit_ratio']:.0%}")

# Alert if origin getting hammered
if metrics['origin_requests'] > 10_000_per_second:
alert(f"Origin overloaded: {metrics['origin_requests']} req/s")

return metrics

def detect_cache_anomalies(self):
"""Detect unusual cache behavior"""
# Sudden drop in hit ratio (stale objects?)
# Spike in origin requests (cache invalidation bug?)
# Regional latency spike (CDN PoP issue?)
# Unusual geographic distribution (attack?)
pass

References​