Three diagrams, drawn from what is actually deployed
Not stock icons — every address, node name and file path below is
real and matches provision/fleet.tsv,
provision/fleet-damavand.tsv and the zone pushed for
this demo. Full prose walkthrough is in
zagros/docs/17-cdn-demo.md.
The request path, in words
- Your browser resolves
demo.zag.taxi-plus.iragainst ZoneBan, our own authoritative DNS forzag.taxi-plus.ir. It gets back all four edge addresses and picks one — this is why refreshing enough times can show different edges answering. - A TLS connection opens to that address, SNI =
demo.zag.taxi-plus.ir.edge.cert.run()picks the right certificate out of that edge's config-plane snapshot by SNI — the same snapshot pushed to all four edges. - The request arrives at one of twenty generated serving locations (WAF level × cache lifetime, a fixed cross product compiled once at load, never per-request). For a static path with a fresh cache entry, the edge answers straight from its own disk cache: the origin is never contacted, and
X-Cache-Status: HITsays so. - For a cache MISS, or for anything under
/api(wired uncacheable by this zone's own path rule), the edge opens a plain HTTP/1.1 connection to10.64.30.203:8080— the Kubernetes Service in front of this demo's own pods — forwardingX-Forwarded-ForandX-Forwarded-Proto, and stripping anything a client tried to forge in their place (Forwarded,CF-Connecting-IP,True-Client-IPand others are blanked before the origin ever sees them). - The Service is deployed with
externalTrafficPolicy: Local, specifically so the pod sees the edge's own real address rather than a SNATed cluster-internal one — which is how/api/nowcan report which edge actually made this particular request. - The response comes back the same way; the edge stores it (if cacheable) keyed by
scheme|generation|host|uri, and adds its own response headers —X-Cache-Status,Strict-Transport-Security,Alt-Svc— before it reaches your browser.
A large asset, for throughput rather than latency
Everything else on this site is realistically sized — fonts, CSS, the diagrams above. None of that is big enough to say anything about throughput once a connection is warm. This one file exists only for that measurement:
/assets/sample-12mb.bin — 12 MiB, deterministic pseudo-random bytes generated once when the origin pod starts (not compressible-looking, so a transfer's size on the wire actually reflects the file), served with a one-year Cache-Control: immutable. The numbers this produced — first pull through the origin against a repeat served from an edge's disk cache — are in the throughput table of docs/17-cdn-demo.md.