Foundationপ্রথম নীতি থেকে
LEVEL 7লেসন ২১/২২কঠিন৫০ মিনিট

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।

এই লেসন শেষে আপনি পারবেন

  • Forward আর reverse proxy-র দিক-confusion চিরতরে মেটাতে পারবেন — কে কার হয়ে দাঁড়ায়, কোন পক্ষের কাছে অদৃশ্য, কোন পক্ষের কাছে প্রকাশ্য
  • Load-balancing algorithm-গুলো তুলনা করতে পারবেন — round-robin, least-connections, IP-hash, consistent hashing (distributed-systems preview) — প্রতিটার জয়-পরাজয়ের শর্তসহ
  • L4 বনাম L7 balancing-এর পার্থক্য ব্যাখ্যা করতে পারবেন — কোন layer কী দেখে, ফলে routing-power আর speed-এর trade-off কোথায়
  • CDN-এর cache-hit ratio economics, origin shield, আর purge-invalidation problem বর্ণনা করে health-check failover আর anycast geo-steering (BGP link!) যুক্ত করতে পারবেন
  • TLS termination-point choice-এর implications (edge vs LB vs origin) এবং stdlib Python-এ reverse proxy + round-robin LB + health-check eviction build করে প্রমাণ করতে পারবেন

আগে যা বোঝা থাকা দরকার

আগে এটা বুঝি

আপনি একটা 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 proxyReverse proxy
কার হয়েclient-এর হয়েserver-এর হয়ে
কে কনফিগার করেuser/org (browser setting, corp network)service-owner
কার কাছে অদৃশ্যserver (origin ভাবে client-ই বলছে)client (origin-এর address-ই এটা মনে হয়)
উদ্দেশ্যegress-control, filtering, anonymity, caching-outboundload-balance, TLS-termination, caching-inbound, security-shield
উদাহরণcorporate HTTP proxy, privacy-VPN-ish, scraping-proxynginx/HAProxy/Varnish fronting app-servers

মনে রাখার সূত্র: forward = আমার হয়ে বাইরে যাও; reverse = বাইরের কারো হয়ে ভেতরে আসো। আজকের মূল বিষয় reverse দিক — কারণ CDN আসলে geographically-distributed reverse proxy-র fleet, আর LB হলো traffic-director তার ঠিক পেছনে।

Client থেকে origin — আধুনিক request-এর সাধারণ যাত্রাপথ
  1. BrowserDNS → edge IP; request + cookies
  2. CDN edge PoP (anycast)cache HIT হলে এখানেই শেষ — origin কোনোদিন দেখেই না
  3. Reverse proxy / LBTLS terminate, L7 route, health-checked pool থেকে pick
  4. App server replicabusiness logic — stateless হলে যেকোনোটা
  5. Database / object storesingle source of truth

Load balancer algorithms — সিদ্ধান্ত-নেওয়ার চার স্কুল

AlgorithmRuleজেতে কখনভেঙে পড়ে কখন
Round-robinপালা করে সবাইকেhomogeneous servers, uniform requestsrequest-cost ভিন্ন হলে (এক heavy req এক replica-কে ভস্মীভূত করে)
Least-connectionsযার খোলা conn কমlong-lived/varied requests (WS! API!)connection-count ≠ load হলে
IP-hash / source-hashclient-IP hash → fixed backendsession-affinity দরকার, no shared storehash-pool imbalance; client behind big NAT
Consistent hashingring-space-এ both keys & nodesnode add/remove-এ minimal remappinghot-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 CDNfull offload, HTTP/3, WAF inspectionorigin-পর্যন্ত plaintext/re-encrypt decision
LBcentralized cert-managementLB-ই bottleneck/CPU-hotspot
Origin (pass-through)end-to-end encryptionL7-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)
Client→origin path-এ তিন mediator-এর অবস্থান, দৃষ্টি-ক্ষমতা আর সিদ্ধান্ত। ডানদিকে ব্যর্থতার দৃশ্য: health-check eviction আর BGP-withdraw failover।

নিজে চালিয়ে দেখুন

EXPERIMENT

dig, curl -I, traceroute — নিজের চোখে edge-architecture

macOS / Linux (dig, curl, traceroute/traceroute6)· ১৫ মিনিট

ধাপ ১ — CNAME chain পড়া (CDN fingerprint):

dig www.reddit.com CNAME +short
# reddit.map.fastly.net.          ← Fastly!
dig www.nytimes.com CNAME +short
# ...akamaized.net.               ← Akamai family

Vendor-দের 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 প্রমাণ।

নিজে বানান

BUILD IT

edge_lab.py — reverse proxy + round-robin LB + health-eviction

Python · ●●●○○
  1. ৩টা backend worker spawn করুন (ports 9001-9003) — প্রতিটা নিজের port বলে দেয় body-তে
  2. Proxy handler: healthy-pool থেকে round-robin pick, urllib দিয়ে fetch, X-Upstream header inject
  3. Passive health: fetch-fail হলে backend evict — retry another
  4. Background loop: evicted-দের periodic probe — ফিরলে re-admit
  5. 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-এর ঘুম-মান ঠিক করে।

বুঝেছেন কি না দেখুন

1

Corporate 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 মূল।

2

Pool-এ ৪ 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 হয়ে ওঠে।

3

L4 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-ই বাদ দেয়।

4

Global 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 কারণ।

5

Origin 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-এর প্রামাণ্য ভিত্তি