Building Blocks১০ মিনিট পাঠ

কন্টেন্ট ডেলিভারি নেটওয়ার্ক (Content Delivery Networks)

গুদামের পরিবর্তে সবচেয়ে কাছের তাক থেকে কন্টেন্ট পরিবেশন করুন
scope:বিল্ডিং ব্লকdifficulty:বিগিনার-মাঝারি

CDN কী?

কল্পনা করুন, আপনি নিউইয়র্কে একটি গোডাউন সহ বইয়ের প্রকাশক। টোকিওর একজন গ্রাহক একটি বই অর্ডার করলেন। আপনি প্রশান্ত মহাসাগর পাড়ি দিয়ে এটি পাঠালেন — এতে এক সপ্তাহ সময় লাগে। যা খুবই বাজে অভিজ্ঞতা।

এবার কল্পনা করুন, আপনার প্রতিটি বড় শহরে স্থানীয় বইয়ের দোকান আছে। টোকিওতে স্থানীয় দোকানে আপনার বইগুলো সেলফে রাখা আছে। গ্রাহক দোকানে ঢুকে কয়েক মিনিটের মধ্যে তাদের বইটি পেয়ে যায়। এটাই হলো CDN।

একটি Content Delivery Network (CDN) হলো ভৌগোলিকভাবে বিতরণ করা সার্ভারগুলোর একটি নেটওয়ার্ক (যাদেরকে এজ সার্ভার (edge servers) বা পয়েন্ট অফ প্রেজেন্স (Points of Presence, PoPs) বলা হয়) যা ব্যবহারকারীর কাছের অবস্থান থেকে কন্টেন্ট ক্যাশ করে এবং পরিবেশন করে। প্রতিটি রিকোয়েস্ট আপনার ডাটা-সেন্টারর মূল সার্ভারে (origin server) যাওয়ার পরিবর্তে, সেটি ব্যবহারকারীর শহরের একটি এজ সার্ভার থেকে সার্ভ করা হয়।

CDN গুলো প্রাথমিকভাবে স্ট্যাটিক কন্টেন্ট পরিবেশন করে: যেমন ইমেজ, ভিডিও, CSS, JavaScript, ফন্ট এবং ডাউনলোডযোগ্য ফাইল। কিছু আধুনিক CDN API এর রেসপন্স ক্যাশ করতে পারে এবং এজ ফাংশন (edge functions) (যা এজে এক্সিকিউট হয় এমন কোড) রান করতে পারে।

CDN ছাড়া — উচ্চ ল্যাটেনসি
CDN সহ — কাছাকাছি এজ সার্ভার

CDN কীভাবে কাজ করে

এখানে সাধারণ প্রবাহ বা ফ্লো (flow) দেওয়া হলো:

  1. ঢাকাের একজন ব্যবহারকারী https://cdn.example.com/images/cat.jpg রিকোয়েস্ট করলো।
  2. DNS রেজোলিউশন রিকোয়েস্টটিকে নিকটবর্তী এজ সার্ভারে (প্রায়শই লোড ব্যালান্সিং ব্যবহার করে) (ধরা যাক, সিঙ্গাপুর) রাউট (route) করে।
  3. সিঙ্গাপুরের এজ সার্ভারটি তার ক্যাশ চেক করে। যদি ইমেজটি সেখানে থাকে (ক্যাশ হিট (cache hit)), তবে এটি সাথে সাথে সাধারণত ৫-২০ মিলিসেকেন্ডের মধ্যে সেটি রিটার্ন করে দেয়।
  4. যদি ইমেজটি ক্যাশ করা না থাকে (ক্যাশ মিস (cache miss)), তবে এজ সার্ভারটি অরিজিন সার্ভার (আপনার আসল সার্ভার, যা হয়তো ডাটা-সেন্টারতে অবস্থিত) থেকে এটি ফেচ (fetch) করে আনে, লোকালি ক্যাশ করে রাখে এবং তারপর ব্যবহারকারীর কাছে রিটার্ন করে দেয়।
  5. এরপর ঢাকাে (বা চট্টগ্রামে বা কাছের যেকোনো শহরে) পরের ব্যবহারকারী এই ক্যাশ করা চিত্রটিই পাবে — এর জন্য ডাটা-সেন্টার পর্যন্ত আর যাওয়ার কোনো প্রয়োজন নেই।

ফলাফল কী? দ্রুত লোড টাইম, অরিজিন সার্ভারে ব্যান্ডওয়াইডথের চাপ কমানো এবং বিশ্বব্যাপী একটি দারুণ ইউজার এক্সপেরিয়েন্স বা ব্যবহারকারী অভিজ্ঞতা তৈরি করা।

Click chart to zoom
CDN ক্যাশ হিট বনাম মিস — ক্যাশ মিস হলে এজ সার্ভার অরিজিন সার্ভার থেকে ডেটা নিয়ে আসে, ক্যাশ করে রাখে এবং পরবর্তীতে আসা রিকোয়েস্টগুলোকে সাথে সাথে ডেটা পরিবেশন করে
ক্যাশ মিস এবং তারপর ক্যাশ হিট ফ্লো

Push CDN বনাম Pull CDN

এজ সার্ভারগুলোতে কীভাবে কন্টেন্ট পৌঁছায় তার দুটি মডেল রয়েছে:

পুল CDN (Pull CDN - Lazy)

  • যখন ব্যবহারকারী কোনো কন্টেন্টের রিকোয়েস্ট করে, তখন অন-ডিমান্ড (on demand) তা মূল সার্ভার বা অরিজিন থেকে আনা হয়।
  • প্রথম রিকোয়েস্টটি ধীরগতির হয় (ক্যাশ মিস → অরিজিন থেকে ফেচ করে আনা)। পরবর্তী রিকোয়েস্টগুলো দ্রুত হয় (ক্যাশ হিট)।
  • কন্টেন্টের মেয়াদ TTL (time-to-live) হেডারের ওপর ভিত্তি করে শেষ হয়ে যায়।
  • আপনাকে ক্যাশ পরিচালনা করার দরকার হয় না — CDN এটি নিজে থেকেই পরিচালনা করে।
  • উপযুক্ত ব্যবহার: এমন ওয়েবসাইটগুলোর জন্য যেখানে প্রচুর কন্টেন্ট আছে কিন্তু কোন কন্টেন্টটি বেশি জনপ্রিয় হবে তা আগে থেকে ধারণা করা যায় না।

পুশ CDN (Push CDN)

  • কেউ রিকোয়েস্ট করার আগেই আপনি নিজে থেকে বা প্রোঅ্যাকটিভভাবে (proactively) CDN-এ কন্টেন্ট আপলোড করে দেন।
  • এতে প্রতিটি রিকোয়েস্ট শুরু থেকেই ক্যাশ হিট হয়। কোনো কোল্ড স্টার্ট সমস্যা (cold start problem) থাকে না।
  • কন্টেন্টের লাইফসাইকেল আপনি পরিচালনা করেন — নতুন ভার্সন আপলোড করা এবং পুরানোটি ডিলিট করা।
  • উপযুক্ত ব্যবহার: এমন কন্টেন্টের জন্য যা নিশ্চিতভাবেই জনপ্রিয় হবে (যেমন কোনো ভিডিওিলিজ, সফটওয়্যার ডাউনলোড) অথবা যেখানে গ্যারান্টিযুক্ত অ্যাভেইলেবিলিটি প্রয়োজন।

বেশিরভাগ ওয়েবসাইট পুল CDN ব্যবহার করে কারণ সেগুলো সহজ এবং সেলফ-ম্যানেজিং। অন্যদিকে নেটফ্লিক্সের মতো বড় মিডিয়া কোম্পানি বা সফটওয়্যার আপডেট বন্টন করার জন্য পুশ CDN ব্যবহার করা হয়।

CDN-এর জন্য Cache-Control হেডার

from flask import Flask, send_file, make_response
app = Flask(__name__)
# Example: Serving static assets with CDN-friendly cache headers
@app.route("/images/<filename>")
def serve_image(filename):
response = make_response(send_file(f"images/{filename}"))
# Cache for 1 year in CDN and browser (immutable assets with hash)
# Use this for files: styles.a1b2c3.css, app.x7y8z9.js
response.headers["Cache-Control"] = "public, max-age=31536000, immutable"
return response
@app.route("/api/profile/<user_id>")
def user_profile(user_id):
response = make_response({"id": user_id, "name": "Anika"})
# Cache in CDN for 60 seconds, but always revalidate with the browser
# CDN serves stale content briefly, then refreshes from origin
response.headers["Cache-Control"] = "public, s-maxage=60, max-age=0"
response.headers["Vary"] = "Accept-Encoding, Authorization"
return response
@app.route("/api/checkout")
def checkout():
response = make_response({"status": "processing"})
# Never cache sensitive or dynamic content in CDN
response.headers["Cache-Control"] = "private, no-store, no-cache"
return response
# Common Cache-Control directives:
# public — CDN can cache this
# private — Only the user's browser can cache (not CDN)
# max-age — Browser cache duration (in seconds)
# s-maxage — CDN cache duration (overrides max-age for CDN)
# no-cache — Must revalidate before using cached version
# no-store — Do not cache at all
# immutable — Content will never change (fingerprinted assets)
Output
# /images/cat.a1b2c3.jpg → Cached for 1 year (immutable)
# /api/profile/42 → CDN caches for 60s, browser always revalidates
# /api/checkout → Never cached anywhere
বিশ্বজুড়ে একাধিক এজ লোকেশন

এজে ক্যাশ ইনভ্যালিডেশন

CDN ব্যবহারের সবচেয়ে কঠিন কাজ হলো ইনভ্যালিডেশন (invalidation) — অর্থাৎ, এজ সার্ভারগুলোকে পুরানো কন্টেন্ট পরিবেশন বন্ধ করতে বলা। উদাহরণস্বরূপ, আপনি আপনার লোগো আপডেট করেছেন, কিন্তু CDN এখনও পুরানো লোগোটাই দেখাচ্ছে কারণ সেটির মেয়াদ শেষ হয়নি।

কৌশলসমূহ:

  • TTL-ভিত্তিক ইনভ্যালিডেশন: একটি মানানসই বা যৌক্তিক TTL নির্ধারণ করুন (ক্যাশিংয়ের একটি মূল ধারণা)। এর মেয়াদ শেষ হওয়ার পর এজ সার্ভারটি একটি নতুন বা সতেজ ডেটার কপি ফেচ করে আনবে। এটি ব্যবহার করা সহজ, তবে একটি উইন্ডো থেকে যায় যেখানে ডেটা পুরানো হতে পারে।
  • ফিঙ্গারপ্রিন্টের মাধ্যমে ক্যাশ বাস্টিং (Cache busting with fingerprints): ফাইলের নামের সাথে একটি কন্টেন্ট হ্যাশ যুক্ত করুন, যেমন: styles.a1b2c3.css। কন্টেন্ট পরিবর্তিত হলে ফাইলের নামও পরিবর্তিত হয়ে যায়, তাই CDN এটিকে সম্পূর্ণ নতুন রিসোর্স হিসেবে ধরে নেয়। স্ট্যাটিক সম্পদের জন্য এটি গোল্ড স্ট্যান্ডার্ড (gold standard)।
  • Purge API: বেশিরভাগ CDN নির্দিষ্ট ইউআরএল (URL) বা প্যাটার্ন তাৎক্ষণিকভাবে মুছে ফেলার জন্য একটি API প্রদান করে। যেমন: POST /purge {"url": "/images/logo.png"}। এটি জরুরি ক্ষেত্রে খুব কাজের, তবে এটি সব এজ সার্ভারে ছড়িয়ে যেতে বা প্রোপাগেট করতে কিছুটা সময় নিতে পারে।
  • সফট পার্জ (Soft purge) / stale-while-revalidate: কন্টেন্টটিকে পুরানো (stale) হিসেবে চিহ্নিত করুন কিন্তু ব্যাকগ্রাউন্ডে নতুন কপি ফেচ করার সময় এটি সার্ভ করতে থাকুন। এতে ব্যবহারকারীদের কখনোই অপেক্ষা করতে হয় না; তবে তারা এক মুহুর্তের জন্য সামান্য পুরানো কন্টেন্ট দেখতে পারে।
ক্যাশ ইনভ্যালিডেশন কৌশলগুলো
Note: প্রো টিপস: স্ট্যাটিক সম্পদের (JS, CSS, ছবি) জন্য কন্টেন্ট-ভিত্তিক ফাইলের নাম (fingerprinting) ব্যবহার করুন এবং একটি দীর্ঘ TTL (যেমন ১ বছর) নির্ধারণ করুন। যখন কন্টেন্টে পরিবর্তন আসে, তখন আপনার বিল্ড টুল নতুন অনন্য ফাইলের নাম তৈরি করে। এটি আপনাকে একদিকে একদম পারফেক্ট ক্যাশ দেয়, অন্যদিকে আপনাকে তাৎক্ষণিক আপডেটের সুবিধাও দেয় — যা দুই দিক থেকেই সবচেয়ে সেরা।

প্রধান CDN প্রোভাইডারসমূহ

CloudFront (AWS) — অ্যামাজনের CDN। এটি S3, EC2 এবং Lambda@Edge এর সাথে খুব ভালোভাবে যুক্ত হয় বা ইন্টিগ্রেট করে। বিশ্বব্যাপী এর ৪০০-এর বেশি এজ লোকেশন রয়েছে। যারা ইতোমধ্যে AWS ইকোসিস্টেমে অভ্যস্ত বা আগে থেকেই ব্যবহার করে তাদের জন্য এটি দারুণ।

Cloudflare — এটি এর বড় স্পেসের ফ্রি টিয়ার এবং বিল্ট-ইন DDoS প্রোটেকশনের জন্য বেশ জনপ্রিয়। এটি অন্যতম বৃহত্তম নেটওয়ার্ক পরিচালনা করে (৩০০+ শহর)। এছাড়াও এটি Workers (এজে সার্ভারলেস ফিয়েচার) এবং জিরো-ট্রাস্ট সিকিউরিটি অফার করে।

Akamai — সবচেয়ে পুরানো এবং বৃহত্তম CDN। এটি প্রায় ৩০% ওয়েব ট্র্যাফিক নিয়ন্ত্রণ করে। বড় বড় এন্টারপ্রাইজ, ব্যাংক এবং মিডিয়া কোম্পানিগুলো এটি ব্যবহার করে। এটি ব্যাপকভাবে ব্যবহৃত হলেও বেশ ব্যয়বহুল।

Fastly — এর ক্যাশ পার্জ করার (cache purging) দ্রুততার জন্য এটি পরিচিত (বিশ্বব্যাপী < ১৫০ মিলিসেকেন্ড)। গিটহাব, স্ট্রাইপ এবং নিউইয়র্ক টাইমস-এর মতো কোম্পানিগুলোর রিয়েল-টাইম কন্টেন্টকে এটি পাওয়ার দেয়। এটি কাস্টম ক্যাশ লজিকের জন্য VCL (Varnish Configuration Language) এর সুবিধা দিয়ে থাকে।

কখন CDN ব্যবহার করা উচিত (আর কখন নয়)

যেসব ক্ষেত্রে CDN ব্যবহার করবেন:

  • যখন বিশ্বব্যাপী ইউজারদের কাছে স্ট্যাটিক সম্পদ (ছবি, ভিডিও, JS, CSS) পরিবেশন করা প্রয়োজন।
  • আপনার অরিজিন সার্ভার একটি অঞ্চলে আছে কিন্তু আপনার গ্রাহক সারা বিশ্ব জুড়ে রয়েছে।
  • আপনি ব্যান্ডউইথ খরচ কমাতে চান (অরিজিনের ব্যান্ডউইথের চেয়ে CDN এর ব্যান্ডউইথ সস্তা)।
  • আপনার DDoS প্রটেকশন দরকার (রেট লিমিটিংও এখানে সাহায্য করে) (CDN এজ থেকে আসা আক্রমণের ট্র্যাফিক আটকে দেয়)।
  • আপনি দ্রুত পেজ লোড করতে চান (দূরের অরিজিনের ১০০-৩০০ মি.সে. ল্যাটেন্সির তুলনায় CDN সাধারণত মাত্র ৫-৩০ মি.সে. সময় নেয়)।

যেসব ক্ষেত্রে CDN ব্যবহার এড়িয়ে চলবেন:

  • আপনার কন্টেন্ট অত্যন্ত ডায়নামিক এবং ব্যক্তিগতকৃত (যেমন রিয়েল-টাইম ড্যাশবোর্ড)।
  • আপনার সকল ব্যবহারকারী আপনার সার্ভারের নিকটবর্তী ভৌগোলিক অবস্থানে রয়েছে।
  • আপনি আর্থিকভাবে সংবেদনশীল (যেমন পেমেন্ট ট্রানজেকশন) এমন ডেটা পরিবেশন করছেন যা ক্যাশ করা ঠিক না।
  • আপনি ডেভেলপমেন্টের একদম প্রাথমিক পর্যায়ে আছেন এবং আপনার ট্র্যাফিক খুবই কম — সেক্ষেত্রে শুরুতেই জটিলতা এড়িয়ে সহজ উপায় অনুসরণ করা ভালো।
Note: মজার তথ্য: CDN না থাকলে ইন্টারনেট অসহ্য রকমের ধীরগতির হতো। আপনি যখন একটি ইউটিউব ভিডিও দেখেন, সেটি আসলে গুগলের সদর দপ্তর থেকে স্ট্রিমিং হয় না — এটি সম্ভবত আপনার বাড়ির মাত্র ২০ মাইল দূরে থাকা একটি CDN এজ সার্ভার থেকে আসে। বর্তমানে ইন্টারনেটের মোট ট্রাফিকের ৫০% এর বেশি এই CDN এর মাধ্যমেই সরবরাহ হয়।

Key Metrics

CDN ক্যাশ হিট
কাছাকাছি এজ সার্ভার থেকে সার্ভ করা হয়
৫-৩০ ms \(O(1)\)
CDN ক্যাশ মিস (অরিজিন থেকে আনা)
এজ সার্ভার → অরিজিন সার্ভারের রাউন্ড ট্রিপ
৫০-৩০০ ms \(O(1)\)
কোনো CDN ছাড়া (সরাসরি অরিজিন)
ব্যবহারকারী → দূরের অরিজিন সার্ভার
১০০-৫০০ ms \(O(1)\)
ক্যাশ পার্জ প্রোপাগেশন
প্রোভাইডার ভেদে ভিন্ন হয়
১-৬০ sec —
Fastly পার্জ প্রোপাগেশন
ইন্ডাস্ট্রির সবচেয়ে দ্রুতগতিসম্পন্ন
< ১৫০ ms —
CDN ব্যান্ডউইথ খরচ
অরিজিন সার্ভারের চেয়ে অনেক সস্তা
~$০.০১-০.০৮/GB —

ছোট কুইজ

টোকিওর একজন ব্যবহারকারী একটি ইমেজের জন্য রিকোয়েস্ট করেন। ওসাকার নিকটবর্তী CDN এজ সার্ভারে সেটি ক্যাশ করা নেই। এখন কী ঘটবে?

পড়া চালিয়ে যান