CDN, Load Balancer, Reverse Proxy — edge-এর স্থাপত্য
CDN, Load Balancers and Reverse Proxies
User আর origin-এর মাঝখানে দাঁড়ানো স্থাপত্যের তিন চরিত্র — reverse proxy, load balancer, CDN; দিক-বিভ্রান্তি থেকে consistent hashing, x-cache header থেকে BGP-anycast।
আগে এটা বুঝি
আপনি একটা popular site খুললেন। DNS উত্তর দিল এমন একটা IP যেটা হয়তো আপনার শহরেই, হয়তো দেশেই — কিন্তু ওই company-র datacenter সম্ভবত হাজার কিলোমিটার দূরে। Request-টা কোথায় গেল? কে সেটা গ্রহণ করল origin-server-এর নামে?
উত্তরটা লুকিয়ে আছে user আর origin-এর মাঝখানের একগুচ্ছ মধ্যস্থতাকারীর (mediator) ভেতরে — proxy, load balancer, CDN। Modern web traffic- এর বড় অংশ একটা origin-server-কে সরাসরি ছোঁয়ও না: edge-cache serve করে, LB সিদ্ধান্ত নেয় কোন replica, reverse-proxy headers rewrite করে।
এই লেসনের দুইটা কাজ: এক, তিন চরিত্রের identity পরিষ্কার করা — বিশেষত forward/reverse proxy-র সেই চিরকালের confusion; দুই, এদের ভেতরের সিদ্ধান্ত-যন্ত্রগুলো খোলা — algorithm, health-check, cache-economics, anycast-routing। শেষে নিজেই একটা mini-edge বানাবেন stdlib দিয়ে।
মূল ধারণা
Proxy-র দিক — একবারে চিরতরে
Confusion-এর মূল: ‘proxy’ মানেই কেউ কারো হয়ে দাঁড়ানো। প্রশ্নটা হলো কার হয়ে:
| Forward proxy | Reverse proxy | |
|---|---|---|
| কার হয়ে | client-এর হয়ে | server-এর হয়ে |
| কে কনফিগার করে | user/org (browser setting, corp network) | service-owner |
| কার কাছে অদৃশ্য | server (origin ভাবে client-ই বলছে) | client (origin-এর address-ই এটা মনে হয়) |
| উদ্দেশ্য | egress-control, filtering, anonymity, caching-outbound | load-balance, TLS-termination, caching-inbound, security-shield |
| উদাহরণ | corporate HTTP proxy, privacy-VPN-ish, scraping-proxy | nginx/HAProxy/Varnish fronting app-servers |
মনে রাখার সূত্র: forward = আমার হয়ে বাইরে যাও; reverse = বাইরের কারো হয়ে ভেতরে আসো। আজকের মূল বিষয় reverse দিক — কারণ CDN আসলে geographically-distributed reverse proxy-র fleet, আর LB হলো traffic-director তার ঠিক পেছনে।
- BrowserDNS → edge IP; request + cookies
- CDN edge PoP (anycast)cache HIT হলে এখানেই শেষ — origin কোনোদিন দেখেই না
- Reverse proxy / LBTLS terminate, L7 route, health-checked pool থেকে pick
- App server replicabusiness logic — stateless হলে যেকোনোটা
- Database / object storesingle source of truth
Load balancer algorithms — সিদ্ধান্ত-নেওয়ার চার স্কুল
| Algorithm | Rule | জেতে কখন | ভেঙে পড়ে কখন |
|---|---|---|---|
| Round-robin | পালা করে সবাইকে | homogeneous servers, uniform requests | request-cost ভিন্ন হলে (এক heavy req এক replica-কে ভস্মীভূত করে) |
| Least-connections | যার খোলা conn কম | long-lived/varied requests (WS! API!) | connection-count ≠ load হলে |
| IP-hash / source-hash | client-IP hash → fixed backend | session-affinity দরকার, no shared store | hash-pool imbalance; client behind big NAT |
| Consistent hashing | ring-space-এ both keys & nodes | node add/remove-এ minimal remapping | hot-key problem (celebrity key) |
Consistent-hashing-এ একটু থামি — এটা distributed-systems module-এর
অন্যতম hero-concept, informal intro এখানেই: plain hash(key) mod N
-এ N বদলালে (node down/scale-up!) প্রায় সব key remap হয় — cache-এ
cold-storm। Consistent hashing key আর node দুটোকেই এক ring-এ বসায়;
key-টা clockwise-next node-এ — node যোগ/বিয়োগে শুধু ~1/N key সরে,
বাকি সব জায়গায়। CDN-cache assignment, DB-sharding, Dynamo-style
store — সব এই এক idea-র উপর দাঁড়ানো।
L4 বনাম L7 — কে কী দেখে
L4 balancer: TCP/IP header দেখে (ip, port) → দ্রুত, kernel/hardware-level,
content-blind routing
L7 balancer: HTTP পড়ে (path, host, cookie, → ধীর (terminate+re-originate),
header rules) content-aware routing/api/* → microservice-A, /img/* → static-pool, cookie-দেখে beta-cohort
→ canary-backend — এসব শুধু L7-এ সম্ভব। দাম: L7-এর হাতে পূর্ণ TCP
connection (client-side) + নতুন connection (backend-side), TLS
termination CPU, buffer-copy। L4 (DPVS, AWS NLB-class) packet-forward
করে — millions conn, কিন্তু path/header অদৃশ্য। Production stack
প্রায়ই দুটোর স্তর: L4 front-door flood-shield → L7 smart-router।
ভেতরে কী ঘটছে
Health check, failover আর purge-এর রাজনীতি
Health checks — pool জীবিত রাখা
দুই মোড:
Active: LB প্রতি ২ সেকেন্ডে GET /healthz → 200? না হলে fail-counter++ → evict
Passive: আসল traffic-ই test — timeout/5xx দেখে LB নিজেই প্রত্যাখ্যান করেSubtleties production-এ মারে: (১) deep-health (/healthz যে
database ping করে) বনাম shallow (process alive?) — false-positive
pool-এ dead-but-breathing node থেকে যায়। (২) Flapping — 50/50
borderline node ঘুরেফিরে join/leave; hysteresis (join-threshold strict,
evict-lenient) লাগে। (৩) Eviction cascade — সব LB-node একসাথে
এক backend evict করলে বাকিদের উপর thundering herd; jittered timers।
CDN economics — hit-ratio-ই business
origin-fetch cost ≈ 10-100× edge-serve cost
(hit-ratio 95% ⇒ origin-load ÷20)Hit-ratio বাড়ানোর হাতিয়ার: longer TTL (stale-tolerance trade-off), cache-key normalization (query-string policy!), origin shield — PoP-গুলোর মাঝে এক intermediate tier যে origin-এর সামনে দাঁড়ায়: 50 PoP miss হলে একসাথে ৫০টা fetch না করে shield-এ coalesce → shield HIT → origin-এ ১টা fetch। Origin-এর দিক থেকে দেখুন: shield-ই তার personal LB-of-caches।
Anycast — BGP-র উপর geo-steering magic
DNS-based geo-steering (dns লেসনের latency-based answers) আছে, কিন্তু CDN-রা মূল অস্ত্র নেয় routing-plane থেকে: anycast — একই IP prefix বিশ্বজুড়ে শতাধিক location থেকে BGP announce। Internet routing-table naturally প্রতিটা user-কে BGP-nearest PoP-এ পৌঁছে দেয় — DNS lookup একটাও ছাড়াই!
same prefix 203.0.113.0/24 announced from:
Frankfurt-PoP ─ BGP ─┐
Dhaka-PoP ─ BGP ─┼──▶ user-এর ISP-র routing table 'nearest' বেছে নেয়
Tokyo-PoP ─ BGP ─┘ (AS-path length অনুযায়ী)Bonus: PoP-down হলে BGP withdraw → traffic auto-reroute — failover routing-protocol-এর free gift। DDoS-absorption-ও এখানেই (attack-traffic সব PoP-এ ছড়িয়ে পড়ে, এক জায়গায় জমে না)। routing-bgp লেসনের AS-path concept-টা এখানে সরাসরি weaponized।
TLS termination — কোথায় padlock খোলা হবে
| Termination at | লাভ | দাম |
|---|---|---|
| Edge CDN | full offload, HTTP/3, WAF inspection | origin-পর্যন্ত plaintext/re-encrypt decision |
| LB | centralized cert-management | LB-ই bottleneck/CPU-hotspot |
| Origin (pass-through) | end-to-end encryption | L7-routing, header-inspection অসম্ভব |
Re-encrypt (edge→origin TLS again) আজ common compromise — hop-wise inspection রেখে wire-plaintext বন্ধ। Compliance-world (PCI) প্রায়ই mandate করে এটাই।
উদাহরণ
একটা request-এর পূর্ণ জীবনী — header-forensics দিয়ে
GET /article/42 HTTP/2
Host: news.example.com ← DNS দিয়েছে CDN CNAME-chain-এর শেষ IP
─── CDN edge (PoP, Dhaka) ──────────────────────────────
cache lookup: key = https://news.example.com/article/42
MISS → origin-fetch (via origin shield: shield-HIT! ১টা fetch)
response পেল: Cache-Control: max-age=300, age-header যোগ করল
পরের ৫ মিনিটে এই PoP-এ এই URL-এর সব request: HIT, origin-touch zero
─── Reverse proxy / LB (origin side) ───────────────────
TLS terminated (cert: *.example.com — managed renewal)
L7 rule: path /article/* → article-service pool
pool-health: [app-1 ✓, app-2 ✓, app-3 ✗(healthz fail — evicted)]
algorithm: least-conn → app-2 (4 open) beats app-1 (7 open)
headers inject: X-Forwarded-For: <client-ip>,
X-Request-Id: f3a9..., Host rewrite
─── App server app-2 ──────────────────────────────────
db query, render → 200 OK, ETag "v9-77cd"
response ফেরত: edge cache-store + client-deliver
x-cache: MISS (এই client-এর জন্য) / HIT (পরের সবার জন্য ৫ মিনিট)Header-গুলোই debugging-এর ভাষা — experiment-এ আমরা ঠিক এগুলোই live পড়ব। আর খেয়াল করুন stateless-replica assumption: app-2-কে কেন pick হলো জানা যায়নি, দরকারও নেই — session-state Redis-এ, যে-ই serve করুক।
ছবিতে
Edge-এর পূর্ণ মানচিত্র — তিন চরিত্র এক frame-এ
┌─────────────── Internet ───────────────┐
users ──┐ │ │
users ──┼── BGP/anycast ──▶ nearest PoP ┐ │
users ──┘ │ ▼ │
│ ┌──────────────────────┐ │
│ │ CDN EDGE (reverse-pxy│ │
│ │ fleet, per-city) │ │
│ │ cache HIT? → serve │ │
│ └──────────┬───────────┘ │
│ MISS │ (coalesced via │
│ ▼ origin shield) │
│ ┌──────────────────────┐ │
│ │ ORIGIN LB │ │
│ │ L7 route + health │ │
│ │ [✓][✓][✗→evict] │ │
│ └──────────┬───────────┘ │
│ pick healthy replica │
│ ┌────────▼─────────────┐ │
│ │ app replicas ×N │ │
│ └──────────┬───────────┘ │
│ ▼ │
│ database │
└────────────────────────────────────────┘
failure drill: PoP dies:
app-2 hangs → /healthz timeouts BGP withdraw prefix
→ active-check marks down → global tables update
→ pool=[app-1] continues → users re-route next-nearest PoP
(zero user-visible downtime) (seconds, automatic)নিজে চালিয়ে দেখুন
dig, curl -I, traceroute — নিজের চোখে edge-architecture
ধাপ ১ — CNAME chain পড়া (CDN fingerprint):
dig www.reddit.com CNAME +short
# reddit.map.fastly.net. ← Fastly!
dig www.nytimes.com CNAME +short
# ...akamaized.net. ← Akamai familyVendor-দের naming-convention এখানেই ফাঁস — *.map.fastly.net,
*.edgekey.net (Akamai), *.cdn.dnscache...। Production-debugging-
এ এই skill-ই প্রথম প্রশ্নের উত্তর দেয়: ‘এই domain-এর traffic কার
infra দিয়ে যাচ্ছে?’
ধাপ ২ — x-cache HIT/MISS dance (Wikipedia):
curl -sI https://en.wikipedia.org/wiki/Main_Page | grep -i 'x-cache\|age'
# x-cache: MISS from cp3058... age: 0
curl -sI https://en.wikipedia.org/wiki/Main_Page | grep -i 'x-cache\|age'
# x-cache: HIT from cp3058... age: 12দ্বিতীয় call-এ HIT — আপনার আগের request-ই edge-cache-এ বসিয়ে গেছে।
age header বলে দেয় object-টা cache-এ কত সেকেন্ড বয়সী।
ধাপ ৩ — traceroute-এ proximity:
traceroute -m 15 www.reddit.com
# 1 router.local ← আপনার gateway
# 2-4 ISP core
# 5-6 fastly POP (আপনার শহর/দেশে!)
# মোট ~৬-৮ hop — origin-datacenter হলে ১৫+ hop হতো(Caveat: ICMP-deprioritization-এ মাঝের hop-গুলো * * * দেখাতে
পারে — endpoint-arrival-টাই মূল signal।)
ধাপ ৪ — ভাবনার প্রশ্ন: আপনার বাসার ISP-র একই site-এর latency colleague-এর office-এর চেয়ে আলাদা কেন? anycast-BGP nearest-selection vs DNS-steering — কোনটা কোন site ব্যবহার করছে বের করার চেষ্টা করুন (dig answer-এর IP-ownership whois + traceroute-mix দিয়ে)।
CNAME-chain দেখায় CDN-vendor signature, x-cache header-দুই-call comparison প্রমাণ করে edge-cache-এর অস্তিত্ব, আর traceroute-এর short hop-count বলে দেয় edge আপনার কত কাছে — তিনটাই textbook-diagram-এর live প্রমাণ।
নিজে বানান
edge_lab.py — reverse proxy + round-robin LB + health-eviction
- ৩টা backend worker spawn করুন (ports 9001-9003) — প্রতিটা নিজের port বলে দেয় body-তে
- Proxy handler: healthy-pool থেকে round-robin pick, urllib দিয়ে fetch, X-Upstream header inject
- Passive health: fetch-fail হলে backend evict — retry another
- Background loop: evicted-দের periodic probe — ফিরলে re-admit
- curl দিয়ে rotation দেখুন, এক backend kill করে eviction দেখুন
~৯০ লাইনে পুরো edge-miniature — stdlib only:
#!/usr/bin/env python3
"""edge_lab.py — tiny reverse proxy + RR-LB over 3 backends w/ health eviction"""
import http.server, socketserver, threading, time, urllib.request
BACKENDS = [{'port': p, 'healthy': True} for p in (9001, 9002, 9003)]
rr_index = {'next': 0}
class Backend(http.server.BaseHTTPRequestHandler):
def do_GET(self):
me = self.server.backend_port
body = f'hello from backend :{me} (path={self.path})\n'.encode()
self.send_response(200)
self.send_header('Content-Type', 'text/plain; charset=utf-8')
self.send_header('Content-Length', str(len(body)))
self.end_headers()
self.wfile.write(body)
def log_message(self, *a): pass
class Proxy(http.server.BaseHTTPRequestHandler):
def do_GET(self):
for _ in range(len(BACKENDS)): # সর্বোচ্চ pool-size retry
healthy = [b for b in BACKENDS if b['healthy']]
if not healthy:
self.send_error(503, 'all backends unhealthy')
return
b = healthy[rr_index['next'] % len(healthy)]
rr_index['next'] += 1
try:
r = urllib.request.urlopen(
f'http://127.0.0.1:{b["port"]}{self.path}', timeout=2)
body = r.read()
self.send_response(r.status)
self.send_header('X-Upstream', f'127.0.0.1:{b["port"]}')
self.send_header('X-Round-Robin-Index', str(rr_index['next'] - 1))
self.send_header('Content-Type', r.headers['Content-Type'])
self.send_header('Content-Length', str(len(body)))
self.end_headers()
self.wfile.write(body)
return
except Exception:
b['healthy'] = False # passive eviction!
print(f'[lb] backend :{b["port"]} FAILED → evicted')
self.send_error(502, 'exhausted retries')
def log_message(self, *a): pass
def spawn_backend(port):
socketserver.TCPServer.allow_reuse_address = True
srv = socketserver.ThreadingTCPServer(('127.0.0.1', port), Backend)
srv.backend_port = port
threading.Thread(target=srv.serve_forever, daemon=True).start()
def recovery_loop():
while True:
for b in BACKENDS:
if b['healthy']:
continue
try:
urllib.request.urlopen(
f'http://127.0.0.1:{b["port"]}/healthz', timeout=1)
b['healthy'] = True
print(f'[lb] backend :{b["port"]} recovered → admitted')
except Exception:
pass
time.sleep(1)
if __name__ == '__main__':
for b in BACKENDS:
spawn_backend(b['port'])
threading.Thread(target=recovery_loop, daemon=True).start()
print('[lb] proxy :8000 → backends 9001-9003')
ProxySrv = socketserver.ThreadingTCPServer
ProxySrv(('127.0.0.1', 8000), Proxy).serve_forever()Drill-session (দ্বিতীয় terminal):
for i in 1 2 3; do curl -si localhost:8000/x | grep -i x-upstream; done
# X-Upstream: 127.0.0.1:9001
# X-Upstream: 127.0.0.1:9002
# X-Upstream: 127.0.0.1:9003 ← perfect rotation
kill -9 $(lsof -ti :9002) # এক backend মেরে ফেলুন
for i in 1 2 3 4; do curl -si localhost:8000/x | grep -i 'x-upstream\|HTTP'; done
# X-Upstream: 127.0.0.1:9001 ... 9003 ... 9001 ... 9003
# ← 9002 গায়েব, বাকিরা seamlessনিজে বাড়ান: (১) least-connections mode — in-flight counter রেখে;
(২) consistent-hash mode — hash(client_ip) % ring দিয়ে affinity
demo (kill করলে শুধু ওই arc-এর keys remap); (৩) X-Cache simulation —
proxy-তে dict-cache + max-age expiry বসিয়ে HIT/MISS header; (৪)
active-health-check interval config + hysteresis thresholds।
বাস্তব সিস্টেমে
Edge-architecture বাস্তবে
CDN duopoly-plus world। Akamai (pioneer, 1998 — আজও enterprise-king), Cloudflare (developer-first, flat pricing), Fastly (programmable-VCL, big-tech customers), CloudFront (AWS-native gravity)। প্রত্যেকের differentiator ভিন্ন layer-এ: Akamai = network-scale, Fastly = edge-compute-latency, Cloudflare = breadth-of-services (Workers, R2, WAF)।
Reverse proxy-র রাজত্ব। nginx (web-এর সবচেয়ে বেশি used server-class software), HAProxy (LB-specialist, battle-tested), Envoy (modern, service-mesh-এর data-plane), Caddy (auto-HTTPS)। Kubernetes-জগৎ-এ Ingress-controller ≈ reverse-proxy-as-config; service-mesh sidecar ≈ per-pod micro-reverse-proxy। এক concept, প্রতি দশকে নতুন incarnation।
Anycast বাস্তবে। Cloudflare/Wikipedia/Google-DNS (8.8.8.8!) — সবাই anycast। 8.8.8.8 এক IP, হাজারো location; আপনার query পৌঁছায় BGP-nearest edge-এ। Root DNS servers-ও একই trick — ১৩ lettered identities, কিন্তু বাস্তবে হাজারের উপর instances।
Purge-war stories। GitHub-এর famous 2018 incident: US-East storage-network degradation → cache-layer mass-invalidations → origin thundering-herd → cascading slowdown global। Lesson: invalidation-policy নিজেই availability-risk; immutable-hash-URL design এই class-এর incident structurally অসম্ভব করে।
TLS-termination choices বাস্তবে। Financial-sector deployments প্রায়ই origin-TLS-only (pass-through) নেয় — compliance-audit trail-এ ‘wire- plaintext never existed’ দাবিটা মূল্যবান। Consumer-web-এ opposite: edge-termination universal, কারণ WAF/bot-management চায় inspect। Architecture = compliance × performance × threat-model equation।
যে ভুলগুলো সবাই করে
“VPN আর forward proxy একই — দুটোই "privacy tools"।”
Overlapping-marketing, ভিন্ন mechanism। Forward proxy: application-aware (HTTP-level) intermediary, per-app config, transport-visibility থাকে। VPN: network-layer tunnel — device-এর সব traffic encapsulate, OS-level, আর সাধারণত encryption+authentication protocol-stack সহ। Corporate-এ দুটোই থাকতে পারে: VPN ঢুকিয়ে intranet reach, forward-proxy দিয়ে egress-filter। Confusion মারাত্মক যখন security-review-তে — threat-model ভিন্ন, trust-anchor ভিন্ন (proxy-trusts-your-config; VPN-trusts-their-exit)।
“Round-robin সবচেয়ে fair — তাই default ভালো।”
Fairness-এর মাপকাঠি-ই ভুল ধরা। RR দেয় request-count fairness, কিন্তু load-এর unit request-count নয় — cost হলো। 99 light + 1 heavy request-এর batch-এ RR heavy-টা যাকে দেয় সে replica-র queue ভস্মীভূত, বাকিরা idle — classic skew। Least-connections এই skew self-correct করে (busy replica-র নতুন conn কম পায়)। RR-এর সত্যিকারer ঘর: homogeneous short-lived requests, বা L4-এ connection-count-level balancing already happened হলে। Default-choice ≠ best-choice।
“CDN শুধু static file-serve করে — dynamic API-তে লাভ নেই।”
Dynamic-content CDN-এর লাভ তিন পথে আসে, caching ছাড়াই: (১) TLS+HTTP3 termination আপনার শহরেই — handshake-RTT কমে (QUIC-lesson-এর হিসাব!); (২) route-optimization — vendor-রা private backbone-এ origin-fetch (public-internet-এর চেয়ে predictable); (৩) shield/coalescing — dynamic-miss-ও duplicate-fetch storm আটকায়। আর API-response-এর অনেকটাই semi-cacheable (per-user TTL 5s, ETag revalidation) — cache-control design-ই সেই দরজা খোলে।
“Health-check pass মানে backend healthy — fail মানে dead।”
Binary-check binary-reality mapping-টাই ভুল। /healthz-returning-200
একটা process যার db-connection-pool exhausted, disk-full, বা GC-death-spiral
— shallow-check-এ green থাকতেই পারে (false-positive serving errors)।
উল্টোদিকে transient-network-blip-এ healthy-node evict (false-negative
capacity-loss)। Production-মানে: layered checks (shallow + dependency-aware),
hysteresis thresholds, outlier-detection (e5xx-rate passive signal) —
binary-flag-এর চেয়ে continuous-health-score। Monitoring-এ এই nuance-ই
oncall-এর ঘুম-মান ঠিক করে।
বুঝেছেন কি না দেখুন
1Corporate forward-proxy আর reverse-proxy — দুটোই caching করতে পারে।
Cache-hit-এর ফল কোন ক্ষেত্রে কে পায়, আর bandwidth-saving কোনটায়
organization-এর নিজের?
যুক্তি
Forward-proxy cache-hit: organization-এর egress-bandwidth বাঁচে (internet-link bill!) + user-latency কমে; লাভভোগী = proxy-configurer-org। Reverse-proxy/CDN cache-hit: origin-compute+bandwidth বাঁচে + global-user-latency কমে; লাভভোগী = service-owner। একই mechanism (HTTP caching semantics!), উল্টো direction — এই symmetry-টাই forward/ reverse distinction-এর functional মূল।
2Pool-এ ৪ replica। Consistent-hash ring-এ (360-slot virtual) nodes বসল
90° gap-এ। Node-3 down হলে ঠিক কত ভগ্নাংশ key remap হবে? Plain
hash(key) mod 4 → mod 3 migration-এ তুলনা করুন।
প্রয়োগ
Consistent-ring: node-3-এর arc-এর keys (~1/4) clockwise-next node-এ (node-4) সরে; বাকি 3/4 অক্ষত। Plain-mod: mod-4→mod-3 transition-এ যেসব key k mod 4 == k mod 3 না — প্রায় সব (75%-এর উপর) key নতুন bucket — cache-cold-storm। এই সংখ্যাগুলোই Karger-paper-এর motivation: remap-cost O(keys/N) বনাম O(keys)। Scale-event frequency বাড়ার সাথে পার্থক্যটা exponential-feel হয়ে ওঠে।
3L4 balancer কেন HTTP-cookie-based sticky-session implement করতে পারে না?
এই limitation-এর workaround কী কী — transport-level alternatives বলুন।
যুক্তি
L4 দেখে শুধু ip/port — HTTP-request bytes decrypt/parse করেই না, তাই cookie (application-layer) তার জগতের বাইরে। Workarounds: (১) source-IP affinity — same-client-ip → same-backend (NAT-এর পেছনে thousands-user one-bucket bias); (২) client-cert/PSID — TLS-level identity (pass-through-এ SNI-route); (৩) architecture-shift: stateful affinity-র দরকারই নেই করে দেওয়া — session-state externalize (Redis), replica-stateless — আজকের standard answer। Affinity একটা legacy-crutch; stateless-design crutch-ই বাদ দেয়।
4Global product launch — video-heavy marketing-page + real-time stock-API
- user-dashboard। CDN/LB/TLS-termination architecture propose করুন:
কোন content কোন tier, cache-strategy, আর failure-mode প্রত্যেকটার।
ডিজাইন
Marketing-page: CDN-edge aggressive-cache (immutable-hash assets, HTML short-TTL+stale-while-revalidate) — launch-spike absorption edge-এই; failure-mode: origin-dead-ও page serves (stale-permitted)। Stock-API: no-cache responses but CDN-route it — TLS/h3-termination + shield fetch-coalescing; per-symbol micro-TTL (1s) optional if staleness-budget allows; failure-mode: bypass-to-origin fallback path pre-warmed। Dashboard: uncacheable + WS/SSE — LB least-connections (long-lived conns!), sticky-not-needed (state externalized); failure-mode: connection- drain on replica-evict + client-auto-reconnect। TLS: edge-terminate (performance+WAF) with origin re-encrypt (compliance)。 Common thread: traffic-class-wise ভিন্ন strategy — এক-size-fits-all edge-config-ই launch-day outage-এর #1 কারণ।
5Origin shield কী, আর এটা ছাড়া 50-PoP CDN-এ single cold-object fetch-এ
origin-এ কয়টা request আসতে পারে?
স্মরণ
Shield = origin-এর সামনে বসানো designated intermediate-cache-tier: সব PoP-miss shield-কেই জিজ্ঞেস করে, shield miss হলে একবারই origin touch করে। Shield ছাড়া: ৫০ PoP-ই একই object-এর জন্য concurrent-miss করতে পারে → origin-এ ৫০ simultaneous fetch (request-coalescing না থাকলে) — thundering-herd-on-cold-popular-object। Shield-সহ: ১। এটা fan-in reduction-এর textbook case — আজকের build-এর retry-loop-এও একই herd-pattern দেখেছেন।
এরপর কী
এরপর কী
Module-এর শেষ লেসনে আমরা lens উল্টে দেব — এতদিন আমরা protocol-গুলো বর্ণনা করেছি; এবার দেখব সত্যিই কী ঘটছে: packet capture — tcpdump আর Wireshark দিয়ে wire-এর raw truth পড়া, libpcap-র kernel-tap architecture, BPF filter-programs, আর pcap-file-format parse করা নিজের হাতে। Networking module-এর সব theory-র সামনে সেই চূড়ান্ত পরীক্ষা: packets don’t lie।
আরও পড়ুন
- RFC 9110 — HTTP Semantics (Caching and Intermediaries) — R. Fielding et al. · Shared/proxy caching semantics — CDN behavior-র protocol-side contract
- Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the WWW — David Karger et al. · Consistent hashing-র মূল গবেষণাপত্র (1997) — আজ CDN/LB/storage সবখানে
- TCP/IP Illustrated, Volume 1 (2nd Edition) — Kevin R. Fall, Richard W. Stevens · Proxy, NAT আর routing-interaction-এর প্রামাণ্য ভিত্তি