InkdownInkdown
Start writing

Arpit Bhayani Blogs

336 files·168 subfolders

Shared Workspace

Arpit Bhayani Blogs
001 Ai Topological Sort

026-cdn-content-replication

Shared from "Arpit Bhayani Blogs" on Inkdown

How Does a CDN Handle Content Replication

Source: https://arpitbhayani.me/blogs/cdn-content-replication Date: 2025-10-02

Content Delivery Networks (CDNs) content replication is far more nuanced than most engineers realize. Let's dive deep into how CDNs actually replicate, distribute, and manage content across their global networks.


Content Delivery Networks (CDNs) content replication is far more nuanced than most engineers realize. Let’s dive deep into how CDNs actually replicate, distribute, and manage content across their global networks.

Why Content Replication Matters

When a user in Tokyo requests a cat video from a server in Virginia, they’re looking at 150-200ms of latency just from the round-trip time. Add TCP handshakes, TLS negotiations, and actual data transfer, and you’re easily hitting 500ms+ for initial content delivery.

CDNs solve this by placing copies of content geographically closer to users, but the challenge is determining what to replicate, where to place it, and when to update it.

001-ai-topological-sort.md
tldr.md
002 Temporal Primer
002-temporal-primer.md
tldr.md
003 Rag Production
003-rag-production.md
tldr.md
004 Structure Of Llm Chat
004-structure-of-llm-chat.md
tldr.md
005 How Llms Work
005-how-llms-work.md
tldr.md
006 Monolith Is Distributed System
006-monolith-is-distributed-system.md
tldr.md
007 Defensive Databases
007-defensive-databases.md
tldr.md
008 Bm25
008-bm25.md
tldr.md
009 Join Algorithms
009-join-algorithms.md
tldr.md
010 Venting At Work
010-venting-at-work.md
tldr.md
011 Half Life
011-half-life.md
tldr.md
012 Multi Paxos
012-multi-paxos.md
tldr.md
013 Mysql Replication Internals
013-mysql-replication-internals.md
tldr.md
014 Bloom Filters
014-bloom-filters.md
tldr.md
015 Clock Sync Nightmare
015-clock-sync-nightmare.md
tldr.md
016 Kafka Partitions
016-kafka-partitions.md
tldr.md
017 Product Quantization
017-product-quantization.md
tldr.md
018 Qkv Matrices
018-qkv-matrices.md
tldr.md
019 Deleted Production
019-deleted-production.md
tldr.md
020 How Llm Inference Works
020-how-llm-inference-works.md
tldr.md
021 Blocking Queues
021-blocking-queues.md
tldr.md
022 Heartbeats In Distributed Systems
022-heartbeats-in-distributed-systems.md
tldr.md
023 Cassandra Writes
023-cassandra-writes.md
tldr.md
024 Redis Replication
024-redis-replication.md
tldr.md
025 Arrogant People At Work
025-arrogant-people-at-work.md
tldr.md
026 Cdn Content Replication
026-cdn-content-replication.md
tldr.md
027 Cant Fix Everything Day One
027-cant-fix-everything-day-one.md
tldr.md
028 Emotions At Work
028-emotions-at-work.md
tldr.md
029 Grpc Http2
029-grpc-http2.md
tldr.md
030 Meetings With No Agenda Are A Waste Of Time
030-meetings-with-no-agenda-are-a-waste-of-time.md
tldr.md
031 Growth Is Not About Doing Everything
031-growth-is-not-about-doing-everything.md
tldr.md
032 Career Longevity Vs Job Hopping
032-career-longevity-vs-job-hopping.md
tldr.md
033 Stay Relevant At Higher Salary Levels
033-stay-relevant-at-higher-salary-levels.md
tldr.md
034 Why Consensus
034-why-consensus.md
tldr.md
035 Database Deadlocks
035-database-deadlocks.md
tldr.md
036 Cpu Cache Locality
036-cpu-cache-locality.md
tldr.md
037 Eventual Consistency
037-eventual-consistency.md
tldr.md
038 Dns Udp Tcp
038-dns-udp-tcp.md
tldr.md
039 Masters
039-masters.md
tldr.md
040 Empathy Makes Great Engineers Unstoppable
040-empathy-makes-great-engineers-unstoppable.md
tldr.md
041 Good Mentors Build People
041-good-mentors-build-people.md
tldr.md
042 Always Have Back Burner Projects
042-always-have-back-burner-projects.md
tldr.md
043 Before You Push Back Know What Youre Standing On
043-before-you-push-back-know-what-youre-standing-on.md
tldr.md
044 Be The One They Can Count On
044-be-the-one-they-can-count-on.md
tldr.md
045 How Much People Bet On You
045-how-much-people-bet-on-you.md
tldr.md
046 How To Get Leadership To Say Yes To Your Project
046-how-to-get-leadership-to-say-yes-to-your-project.md
tldr.md
047 Dont Let Your Best Ideas Die In Silence
047-dont-let-your-best-ideas-die-in-silence.md
tldr.md
048 Be Someone Others Want To Work With
048-be-someone-others-want-to-work-with.md
tldr.md
049 Dont Fall For Xy Problem Ask Right Questions
049-dont-fall-for-xy-problem-ask-right-questions.md
tldr.md
050 Biggest Lie Startups Tell Engineers
050-biggest-lie-startups-tell-engineers.md
tldr.md
051 Promotions Are Proactive Not Reactive
051-promotions-are-proactive-not-reactive.md
tldr.md
052 Not Enough To Be Right Learn To Be Heard
052-not-enough-to-be-right-learn-to-be-heard.md
tldr.md
053 No One Ships Alone
053-no-one-ships-alone.md
tldr.md
054 Not Every Mistake Needs A Correction
054-not-every-mistake-needs-a-correction.md
tldr.md
055 Build Influence At Work
055-build-influence-at-work.md
tldr.md
056 Your Soft Skills Arent Soft At All
056-your-soft-skills-arent-soft-at-all.md
tldr.md
057 Experience Before Forming Opinion
057-experience-before-forming-opinion.md
tldr.md
058 Curiosity And High Bias For Action
058-curiosity-and-high-bias-for-action.md
tldr.md
059 Worklog
059-worklog.md
tldr.md
060 Mistakes And Growth
060-mistakes-and-growth.md
tldr.md
061 Own It Instead Of Sweeping It Aside
061-own-it-instead-of-sweeping-it-aside.md
tldr.md
062 Dont Wait Step Up
062-dont-wait-step-up.md
tldr.md
063 Temporary Fix Is Permanent
063-temporary-fix-is-permanent.md
tldr.md
064 Interview Bias And What Sets You Apart
064-interview-bias-and-what-sets-you-apart.md
tldr.md
065 Saying This Isnt My Problem Is A Problem
065-saying-this-isnt-my-problem-is-a-problem.md
tldr.md
066 Okr
066-okr.md
tldr.md
067 Miscommunication
067-miscommunication.md
tldr.md
068 When In Doubt Code It Out
068-when-in-doubt-code-it-out.md
tldr.md
069 Follow Up Without Annoying People
069-follow-up-without-annoying-people.md
tldr.md
070 Lead Projects That Land
070-lead-projects-that-land.md
tldr.md
071 Abstract Thinking Skill Next Decade
071-abstract-thinking-skill-next-decade.md
tldr.md
072 We Engineers Suck At Task Estimation
072-we-engineers-suck-at-task-estimation.md
tldr.md
073 Shiny Object Syndrome In Tech
073-shiny-object-syndrome-in-tech.md
tldr.md
074 3p
074-3p.md
tldr.md
075 Leverage The Equilibrium
075-leverage-the-equilibrium.md
tldr.md
076 On Demand Container Loading In Aws Lambda
076-on-demand-container-loading-in-aws-lambda.md
tldr.md
077 Sql Has Problems We Can Fix Them Pipe Syntax In Sql
077-sql-has-problems-we-can-fix-them-pipe-syntax-in-sql.md
tldr.md
078 Nanolog A Nanosecond Scale Logging System
078-nanolog-a-nanosecond-scale-logging-system.md
tldr.md
079 Best Resource Is Mythical
079-best-resource-is-mythical.md
tldr.md
080 Wtf The Who To Follow Service At Twitter
080-wtf-the-who-to-follow-service-at-twitter.md
tldr.md
081 Know A Lot
081-know-a-lot.md
tldr.md
082 Out Of Syllabus
082-out-of-syllabus.md
tldr.md
083 Negotiate The Offer
083-negotiate-the-offer.md
tldr.md
084 Never Bad Mouth Your Ex Exployer
084-never-bad-mouth-your-ex-exployer.md
tldr.md
085 Culture Fit
085-culture-fit.md
tldr.md
086 Quantification In Resume
086-quantification-in-resume.md
tldr.md
087 Hiring Is Unfair
087-hiring-is-unfair.md
tldr.md
088 Questions For Interviewers
088-questions-for-interviewers.md
tldr.md
089 Collaboration Communication
089-collaboration-communication.md
tldr.md
090 Out Of Vicious Interview Cycle
090-out-of-vicious-interview-cycle.md
tldr.md
091 Pitch Projects Not Ideas
091-pitch-projects-not-ideas.md
tldr.md
092 Read Design Docs
092-read-design-docs.md
tldr.md
093 Read Rca Docs
093-read-rca-docs.md
tldr.md
094 Start Generalist
094-start-generalist.md
tldr.md
095 Do Not Rely On Summaries
095-do-not-rely-on-summaries.md
tldr.md
096 Structure Your Design Interviews
096-structure-your-design-interviews.md
tldr.md
097 Title Inflation
097-title-inflation.md
tldr.md
098 Find Your Own Project
098-find-your-own-project.md
tldr.md
099 Six Pointers To Crack Coding And Design Interviews
099-six-pointers-to-crack-coding-and-design-interviews.md
tldr.md
100 Keep Yourself Unblocked
100-keep-yourself-unblocked.md
tldr.md
101 Genetic Knapsack
101-genetic-knapsack.md
tldr.md
102 Pseudorandom Number Generation Lfsr
102-pseudorandom-number-generation-lfsr.md
tldr.md
103 How Indexes Work On Partitioned And Sharded Data
103-how-indexes-work-on-partitioned-and-sharded-data.md
tldr.md
104 Some Data Partitioning Strategies For Distributed Data Stores
104-some-data-partitioning-strategies-for-distributed-data-stores.md
tldr.md
105 Data Partitioning
105-data-partitioning.md
tldr.md
106 Leaderless Replication
106-leaderless-replication.md
tldr.md
107 Conflict Resolution
107-conflict-resolution.md
tldr.md
108 Conflict Detection
108-conflict-detection.md
tldr.md
109 Multi Master Replication
109-multi-master-replication.md
tldr.md
110 Monotonic Reads
110-monotonic-reads.md
tldr.md
111 Read Your Write Consistency
111-read-your-write-consistency.md
tldr.md
112 Handling Outages Master Replica
112-handling-outages-master-replica.md
tldr.md
113 Replication Formats
113-replication-formats.md
tldr.md
114 Replication Strategies
114-replication-strategies.md
tldr.md
115 Master Replica Replication
115-master-replica-replication.md
tldr.md
116 Durability
116-durability.md
tldr.md
117 Isolation
117-isolation.md
tldr.md
118 Atomicity
118-atomicity.md
tldr.md
119 Consistency
119-consistency.md
tldr.md
120 Architectures In Distributed Systems
120-architectures-in-distributed-systems.md
tldr.md
121 Mistaken Beliefs Of Distributed Systems
121-mistaken-beliefs-of-distributed-systems.md
tldr.md
122 Fork Bomb
122-fork-bomb.md
tldr.md
123 Chained Operators Python
123-chained-operators-python.md
tldr.md
124 Taxonomy On Sql
124-taxonomy-on-sql.md
tldr.md
125 The Weird Walrus
125-the-weird-walrus.md
tldr.md
126 Fully Persistent Arrays
126-fully-persistent-arrays.md
tldr.md
127 Persistent Data Structures Introduction
127-persistent-data-structures-introduction.md
tldr.md
128 Constant Folding Python
128-constant-folding-python.md
tldr.md
129 String Interning Python
129-string-interning-python.md
tldr.md
130 Recursion Visualizer Python
130-recursion-visualizer-python.md
tldr.md
131 Flajolet Martin
131-flajolet-martin.md
tldr.md
132 2q Cache
132-2q-cache.md
tldr.md
133 Israeli Queues
133-israeli-queues.md
tldr.md
134 1d Terrain
134-1d-terrain.md
tldr.md
135 Jaccard Minhash
135-jaccard-minhash.md
tldr.md
136 Ts Smoothing
136-ts-smoothing.md
tldr.md
137 Lfu
137-lfu.md
tldr.md
138 Morris Counter
138-morris-counter.md
tldr.md
139 Slowsort
139-slowsort.md
tldr.md
140 Bitcask
140-bitcask.md
tldr.md
141 Phi Accrual
141-phi-accrual.md
tldr.md
142 10x Engineer
142-10x-engineer.md
tldr.md
143 Decipher Repeated Key Xor
143-decipher-repeated-key-xor.md
tldr.md
144 Decipher Single Xor
144-decipher-single-xor.md
tldr.md
145 Python Iterable Integers
145-python-iterable-integers.md
tldr.md
146 Inheritance C
146-inheritance-c.md
tldr.md
147 Rum
147-rum.md
tldr.md
148 Consistent Hashing
148-consistent-hashing.md
tldr.md
149 Python Caches Integers
149-python-caches-integers.md
tldr.md
150 Fractional Cascading
150-fractional-cascading.md
tldr.md
151 Copy On Write
151-copy-on-write.md
tldr.md
152 Midpoint Insertion Caching Strategy
152-midpoint-insertion-caching-strategy.md
tldr.md
153 Fsm Python
153-fsm-python.md
tldr.md
154 Bayesian Average
154-bayesian-average.md
tldr.md
155 Sliding Window Ratelimiter
155-sliding-window-ratelimiter.md
tldr.md
156 Idf
156-idf.md
tldr.md
157 Better Programmer
157-better-programmer.md
tldr.md
158 Python Prompts
158-python-prompts.md
tldr.md
159 Rule 30 Cellular Automata
159-rule-30-cellular-automata.md
tldr.md
160 Function Overloading
160-function-overloading.md
tldr.md
161 Isolation Forest
161-isolation-forest.md
tldr.md
162 Image Steganography
162-image-steganography.md
tldr.md
163 Long Integers Python
163-long-integers-python.md
tldr.md
164 I Changed My Python
164-i-changed-my-python.md
tldr.md
165 Benchmark And Compare Pagination Approach In Mongodb
165-benchmark-and-compare-pagination-approach-in-mongodb.md
tldr.md
166 Mongodb Cursor Skip Is Slow
166-mongodb-cursor-skip-is-slow.md
tldr.md
167 Fast And Efficient Pagination In Mongodb
167-fast-and-efficient-pagination-in-mongodb.md
tldr.md
168 Making Http Requests Using Netcat
168-making-http-requests-using-netcat.md
tldr.md

Push vs. Pull

CDNs use two primary approaches for content replication, and most modern CDNs actually use a hybrid of both.

Push-Based Replication (Origin Push)

In push-based replication, your origin server proactively sends content to CDN edge nodes. Think of it like Amazon distributing books to warehouses before customers order them.

When you upload a new JavaScript bundle to your origin, you trigger an API call to your CDN (say, Cloudflare or Akamai). The CDN’s control plane receives this request and initiates a replication job. This job creates a directed acyclic graph (DAG) of distribution tasks, often using a hierarchical or mesh topology.

Let’s say you have 200 edge locations. The CDN doesn’t push directly from origin to all 200; that would crush your origin’s bandwidth. Instead, it

  1. Pushes to 5-10 regional “parent” nodes (tier-1 caches)
  2. The parents distribute to 20-30 “mid-tier” nodes (tier-2 caches)
  3. Mid-tier nodes replicate to edge nodes in their region

This hierarchical push typically uses BitTorrent’s principles at scale, chunking files and using parallel transfers. Fastly, for example, uses a proprietary protocol called Varnish clustering for this. On Akamai, you can use NetStorage to configure a push-based replication.

When to use push replication
  • Large files that won’t change often (firmware updates, game patches)
  • Content with predictable high demand (major software releases)
  • Time-sensitive content that needs to be everywhere immediately (livestream and news broadcasts)
  • When you have the bandwidth at the origin to support the initial distribution
Pull-Based Replication (On-Demand/Lazy Loading)

Pull-based replication is reactive; content is only replicated to an edge node when a user requests it from that location. Here’s how the request flow looks:

  1. User in Mumbai requests example.com/bundle.js
  2. Request hits CDN’s Mumbai edge node
  3. Edge checks its local cache, cache miss
  4. Edge makes a request to its parent node or directly to the origin
  5. Edge receives content, stores it locally, and serves it to the user
  6. Next user in Mumbai gets a cache hit, no origin request needed

The “cache miss goes to origin” explanation is simplified. In reality, there are usually 2-3 cache tiers:

  • Edge cache (L1): Thousands of these, closest to users, smallest storage
  • Regional cache (L2): Fewer nodes, more storage, aggregates requests from multiple edges
  • Origin shield (L3): Optional layer that sits in front of your origin to prevent stampedes

Here’s what a cache miss actually looks like in a multi-tier system:

Plain text

Each tier caches the response on the way back, so subsequent requests don’t need to go as far up the chain.

Cache stampede protection

One critical aspect: when content isn’t cached and suddenly gets 10,000 requests (maybe a tweet went viral), you don’t want 10,000 requests hammering your origin. CDNs use request coalescing or request collapsing, something like this…

Plain text

Only one request actually goes upstream; the other 9,999 wait for that result and share it.

The Hybrid Approach

Modern CDNs don’t strictly use push or pull; they use hybrid strategies with predictive intelligence.

Predictive pre-positioning

CDNs analyze traffic patterns using machine learning to predict what content should be where. If analytics show that a particular video always gets requested in Brazil on Friday evenings, the CDN proactively replicates it to Brazilian edge nodes on Friday afternoon, even though it’s technically a “pull” CDN.

Adaptive replication based on popularity

Content might exist in only 10 edge locations when it’s new, but if it suddenly gets popular, the CDN’s orchestration layer notices the high request rate and automatically replicates it to 50 more locations. Conversely, unpopular content gets evicted from edge caches and might only live in regional caches or the origin.

Geographic targeting

We can also configure replication rules

Plain text

The Data Structure For Replication

How does a CDN know if it has the right version of content? Most modern CDNs use content-addressed storage.

Instead of storing files by their URL alone, CDNs compute a hash (like SHA-256) of the content and use that hash as part of the cache key. This means:

Plain text

When your origin serves content, it includes an ETag header

Plain text

The CDN edge stores this with the content. Later, when checking if cached content is still valid, it can send:

Plain text

If the content hasn’t changed, the origin responds with 304 Not Modified, no data transfer needed. This is why you see URLs like:

Plain text

The hash or version in the filename/query param becomes part of the cache key. When you deploy new code, the hash changes, so it’s effectively a different object in the CDN’s eyes. The old version can stay cached (maybe someone is on an old app version), and the new version gets replicated independently.

Consistency Challenges

CDNs face a distributed systems problem: how do you ensure content is consistent across 200+ globally distributed nodes?

Most CDNs are eventually consistent by design. When you push an update or purge content, it doesn’t happen atomically everywhere. You might see:

  • 80% of edges updated in 10 seconds
  • 95% updated in 30 seconds
  • 99.9% updated in 2 minutes
  • Stragglers taking up to 5-10 minutes

This is a fundamental trade-off. CDNs choose availability over strong consistency because:

  1. Network partitions happen (undersea cable cuts, regional outages)
  2. Users care more about fast responses than perfect consistency for static assets
  3. The alternative (locking all edges during updates) would be catastrophically slow

But, if you cannot tolerate inconsistency, here’s what you can do

Version your API responses
Plain text
Use purge

Purging is expensive and creates thundering herd problems (ref 1, ref 2). When you purge, thousands of edge nodes might simultaneously request fresh content from the origin. Instead of purging, you can use short TTLs for content that changes. Something like this…

Plain text

The stale-while-revalidate directive is particularly clever: it lets the CDN serve stale content immediately while fetching fresh content in the background, avoiding both latency spikes and origin load spikes.

Replication Protocols

CDNs use optimized internal protocols for node-to-node transfer:

  • Consistent hashing: Determines which nodes should store which content
  • Gossip protocols: For propagating metadata about what content exists where
  • Custom UDP-based protocols: For low-latency health checks and coordination
  • Proprietary compression: Beyond gzip/brotli, optimized for internal transfers
Multi-region replication architecture

Here’s a simplified view of Cloudflare’s architecture

Plain text

Each “Colo” (colocation facility) contains multiple servers. Within a colo, they use Anycast routing, multiple servers share the same IP address, and requests are routed to the nearest/least-loaded one.

Transferring petabytes between nodes is expensive. CDNs optimize:

  1. Delta encoding

: Only transfer the diff between versions 2. Chunked transfer: Break large files into chunks, transfer chunks in parallel 3. Peer-to-peer between edges: Edges can fetch from nearby edges, not just from parent nodes 4. Compression: Use algorithms optimized for specific content types

Handling Dynamic Content

Modern CDNs don’t just cache static files; they run code at the edge using edge workers and functions. Services like Cloudflare Workers, Fastly Compute@Edge, and AWS Lambda@Edge let you run JavaScript/WebAssembly at edge nodes

This means the CDN isn’t just replicating static content; it’s replicating code execution capabilities. Your logic runs in 200+ locations simultaneously.

Implications for replication:

  • Code updates must be replicated (usually within seconds)
  • Code can generate responses dynamically, so cache hit rates drop
  • You need strategies like edge-side includes (ESI) to cache fragments

Real-World Performance Considerations

If CDN is going to power the most critical piece of your product (consider Live streaming), consider monitoring the replication lag. This is how your code would look…

Plain text

By the way, replication isn’t free, and hence, configure it when you really need it, because it induces

  • Storage costs: 200 locations = 200x storage cost
  • Bandwidth costs: Inter-node transfers are usually free within CDN, but origin → CDN bandwidth costs you
  • Request costs: Cache misses mean more origin requests = higher origin bandwidth bills

Footnotes

CDN replication is a fascinating way to understand and appreciate distributed systems. It trades strict consistency for availability and performance at massive scale. Some key takeaways are

  • Choose eventual consistency wherever possible
  • URLs with hashes/versions make replication predictable
  • Longer TTL isn’t always better.
  • Don’t assume purges happen instantly or completely
  • Not everything needs aggressive replication