Social & Communication১৪ মিনিট পাঠ

ভিডিও স্ট্রিমিং সার্ভিস ডিজাইন

বিলিয়ন বিলিয়ন মানুষের জন্য ভিডিও আপলোড, ট্রান্সকোডিং (transcoding) এবং স্ট্রিমিং করা — যেমন ইউটিউব (YouTube)
scope:রিয়েল-ওয়ার্ল্ড সিস্টেম (Real-World System)difficulty:অ্যাডভান্সড (Advanced)

সমস্যাটি বোঝা (Understanding the Problem)

আমরা ইউটিউব (YouTube) বা নেটফ্লিক্সের (Netflix) মতো একটি ভিডিও স্ট্রিমিং সার্ভিস ডিজাইন করছি। ব্যবহারকারীরা এখানে ভিডিও আপলোড করবেন, সিস্টেম সেগুলোকে বিভিন্ন রেজোলিউশনে ট্রান্সকোড (transcode) করবে এবং লক্ষ লক্ষ দর্শক কোনো বাফারিং (buffering) ছাড়াই সেগুলো স্ট্রিম (stream) করবেন বা দেখতে পাবেন।

ফাংশনাল প্রয়োজনীয়তা (Functional Requirements):

  • ভিডিও আপলোড (Upload videos): ক্রিয়েটররা (Creators) র (raw) ভিডিও ফাইল আপলোড করবেন (যা গিগাবাইট সাইজের হতে পারে)।
  • ভিডিও স্ট্রিম (Stream videos): দর্শকরা স্মুথ বা নিরবচ্ছিন্ন প্লেব্যাকের (playback) মাধ্যমে ভিডিও দেখবেন।
  • সার্চ এবং ডিসকভারি (Search & discovery): ব্যবহারকারীরা টাইটেল (title), ট্যাগ (tags) এবং ডেসক্রিপশনের (description) ওপর ভিত্তি করে ভিডিও সার্চ করতে পারবেন।
  • রিকমেন্ডেশন (Recommendations): দেখার ইতিহাস (watch history) এবং পছন্দের ওপর ভিত্তি করে প্রাসঙ্গিক ভিডিও সাজেস্ট করা বা দেখানো।

নন-ফাংশনাল প্রয়োজনীয়তা (Non-Functional Requirements):

  • লো-বাফারিং (Low buffering): ২ সেকেন্ডের মধ্যে ভিডিও চলা শুরু হতে হবে। রিবাফারিংয়ের অনুপাত (Rebuffering ratio) ১%-এর কম হতে হবে।
  • অ্যাডাপ্টিভ বিটরেট (Adaptive bitrate): দর্শকের ইন্টারনেট স্পিড বা ব্যান্ডউইথের ওপর ভিত্তি করে ভিডিওর কোয়ালিটি স্বয়ংক্রিয়ভাবে অ্যাডজাস্ট বা মানিয়ে নেবে — ম্যানুয়ালি ৭২০পি (720p)/১০৮০পি (1080p) পরিবর্তন করার দরকার নেই।
  • গ্লোবাল ডেলিভারি (Global delivery): বিশ্বের সব প্রান্তের দর্শকরা যেন CDN এজ সার্ভারগুলোর (edge servers) মাধ্যমে দ্রুত এবং সামঞ্জস্যপূর্ণ প্লেব্যাক (playback) পান।
  • ফল্ট টলারেন্স (Fault tolerance): আংশিক কোনো ফেইলিউরের কারণে প্লেব্যাক বন্ধ হওয়া উচিত নয়। প্রয়োজনে সিস্টেমটি গ্রেসফুলি ডিগ্রেড (gracefully degrade) করবে — অর্থাৎ কালো স্ক্রিন দেখানোর বদলে কোয়ালিটি কমিয়ে দেবে।
মূল ধারণা: আপলোড → ট্রান্সকোড → স্ট্রিম

অ্যাস্টিমেশন (Estimation)

চলুন এই সিস্টেমের সাইজ পরিমাপ করি:

  • প্রতিদিন ৫০০ মিলিয়ন সক্রিয় ব্যবহারকারী (DAU) — যারা প্রতিদিন গড়ে ৫টি করে ভিডিও দেখেন
  • প্রতিদিন ৫ মিলিয়ন আপলোড — প্রতিটি র (raw) ভিডিওর সাইজ গড়ে প্রায় ২০০ মেগাবাইট (MB)
  • ট্রান্সকোডিং (Transcoding): প্রতিটি ভিডিও ৪টি রেজোলিউশনে (৩৬০পি, ৪৮০পি, ৭২০পি, ১০৮০পি) ট্রান্সকোড করা হয়। ভিডিও প্রতি মোট আউটপুট ≈ র (raw) ভিডিওর সাইজের ১.৫ গুণ = ট্রান্সকোড করা ভেরিয়েন্টগুলোর সাইজ প্রায় ৩০০ MB।
  • প্রতিদিনের আপলোড স্টোরেজ: ৫ মিলিয়ন × ২০০ MB = ১ পেটাবাইট/দিন (1 PB/day) র ডেটা + ১.৫ PB ট্রান্সকোড করা ডেটা
  • একইসাথে স্ট্রিম (Concurrent streams): পিক টাইমে (Peak) একইসাথে গড়ে প্রায় ১ মিলিয়ন বা ১০ লক্ষ দর্শক ভিডিও দেখেন
  • ব্যান্ডউইথ (Bandwidth): ১ মিলিয়ন স্ট্রিম × ৪ Mbps (গড়ে 720p হিসেব করে) = ৪ Tbps এগ্রেস ব্যান্ডউইথ (egress bandwidth)

এটি একটি স্টোরেজ-হেভি (storage-heavy) এবং ব্যান্ডউইথ-হেভি (bandwidth-heavy) সিস্টেম। এখানকার মূল চ্যালেঞ্জগুলো হলো ইফিষিয়েন্ট ট্রান্সকোডিং, স্মার্ট সিডিএন ক্যাশিং (CDN caching) এবং অ্যাডাপ্টিভ স্ট্রিমিং (adaptive streaming)।

এপিআই ডিজাইন (API Design)

সাধারণ REST-এর বাইরে ভিডিও স্ট্রিমিং বিশেষ কিছু প্রোটোকল ব্যবহার করে:

আপলোড (চাঙ্কড - Chunked Upload)

EndpointPOST /api/v1/upload/init
Request{"title": "My Video", "description": "...", "tags": ["tech"]}
Response{"upload_id": "abc123", "chunk_size": 5242880}
EndpointPUT /api/v1/upload/:upload_id/chunk/:n
Bodyবাইনারি চাঙ্ক ডেটা (Binary chunk data) (প্রতিটি চাঙ্ক ৫ MB করে)
Response{"chunk_n": 3, "status": "received"}

স্ট্রিমিং (HLS/DASH)

ManifestGET /videos/:id/manifest.m3u8 (HLS) অথবা .mpd (DASH)
SegmentGET /videos/:id/segment/:quality/:n.ts

চাঙ্কড আপলোড (chunked upload) কেন? বড় ভিডিওগুলো (১ GB+) একটি রিকোয়েস্টের মাধ্যমে আপলোড করা যায় না — নেটওয়ার্ক ড্রপ, টাইমআউট এবং মেমোরি লিমিটের কারণে এটি অবাস্তব। চাঙ্কিংয়ের মাধ্যমে রিজুমেবল বা পুনরায় শুরু করা যায় এমন আপলোড (resumable uploads) সম্ভব হয়: যদি ২০০টি চাঙ্কের মধ্যে ৪৭ নম্বর চাঙ্ক আপলোড হয়ে যাওয়ার পর কানেকশন বা সংযোগ বিচ্ছিন্ন হয়ে যায়, তবে প্রথম থেকে শুরু না করে ৪৮ নম্বর চাঙ্ক থেকেই পুনরায় আপলোড শুরু করা যায়।

আপলোড ও ট্রান্সকোডিং পাইপলাইন
Click chart to zoom
আপলোড ফ্লো: চাঙ্কড আপলোড → অবজেক্ট স্টোর → অ্যাসিনক্রোনাস ট্রান্সকোড → CDN ডিস্ট্রিবিউশন
অ্যাডাপ্টিভ বিটরেট স্ট্রিমিং (Adaptive bitrate streaming)

HLS / DASH: ভিডিও স্ট্রিমিং আসলে যেভাবে কাজ করে

আধুনিক ভিডিও স্ট্রিমিং কখনো একটি বিশাল ফাইল পাঠায় না। এর বদলে এটি অ্যাডাপ্টিভ বিটরেট স্ট্রিমিং (adaptive bitrate streaming - ABR) ব্যবহার করে:

  1. সেগমেন্টেশন (Segmentation): প্রতিটি ট্রান্সকোড করা ভিডিও ছোট ছোট খণ্ডে (segments) ভাগ করা হয় (সেকেন্ড ২-১০)। ৪টি কোয়ালিটি লেভেলে ১০ মিনিটের একটি ভিডিও তৈরি করতে মোট প্রায় ৬০০টি সেগমেন্ট লাগে।
  2. মেনিফেস্ট ফাইল (Manifest file): একটি .m3u8 (HLS) বা .mpd (DASH) ফাইলে সমস্ত উপলব্ধ কোয়ালিটি লেভেল এবং তাদের সেগমেন্ট ইউআরএল (URLs) তালিকাভুক্ত থাকে। ভিডিও প্লেয়ার বা ক্লায়েন্ট (Client) সবার প্রথমে এটি ডাউনলোড করে।
  3. অ্যাডাপ্টিভ সুইচিং (Adaptive switching): মিডিয়া প্লেয়ার রিয়েল টাইমে ডাউনলোড স্পিড মনিটর বা পর্যবেক্ষণ করে। স্লো-ইন্টারনেট? তাহলে ৩৬০পি সেগমেন্টে সুইচ করে। ফাস্ট ওয়াই-ফাই? তাহলে ১০৮০পি-তে জাম্প করে। সেগমেন্টগুলোর মধ্যে এই সুইচিংটা অবিচ্ছিন্নভাবে বা স্মুথলি ঘটে — এর জন্য কোনো বাফারিং লাগে না, ভিডিও পুনরায় চালু বা রিস্টার্টও করতে হয় না।

HLS (HTTP Live Streaming): এটি অ্যাপল (Apple)-এর তৈরি। এতে .m3u8 প্লেলিস্ট এবং .ts সেগমেন্ট ব্যবহৃত হয়। এটি ইউনিভার্সালি বা প্রায় সব প্ল্যাটফর্মেই সাপোর্টেড বা সমর্থিত।

DASH (Dynamic Adaptive Streaming over HTTP): এটি একটি ওপেন স্ট্যান্ডার্ড (Open standard)। এতে .mpd মেনিফেস্ট এবং .m4s সেগমেন্ট ব্যবহৃত হয়। এটি আরও ফ্লেক্সিবল বা নমনীয়, তবে ব্রাউজার সাপোর্ট কিছুটা কম।

উভয়ই সাধারণ HTTP/HTTPS-এর ওপর কাজ করে — এর জন্য কোনো বিশেষ প্রোটোকলের প্রয়োজন নেই। এ কারণেই ভিডিওর ক্ষেত্রে CDN ক্যাশিং চমৎকার কাজ দেয়।

সম্পূর্ণ আর্কিটেকচার: আপলোড + স্ট্রিমিং ট্র্যাক

CDN কৌশল (Strategy): গ্লোবাল স্ট্রিমিংয়ের মূল চাবিকাঠি

বিশাল স্কেলে ভিডিও সার্ভ (Serve) করা মূলত একটি CDN সম্পর্কিত সমস্যা। এর কৌশলটি নিচে দেওয়া হলো:

জনপ্রিয় কনটেন্ট বা টপ ১০% (Popular content): এগুলো বিশ্বজুড়ে এজ সার্ভারগুলোতে (edge servers) আগে থেকেই বা প্রি-ওয়ার্মড (Pre-warmed) করে রাখা হয়। যখন কোনো ভিডিও ভাইরাল হয়, তখন সেটি ব্যবহারকারীদের কাছাকাছি অঞ্চলে ক্যাশ (Cached) করা থাকে। এটি সিস্টেমের মোট ভিউয়ের বা ট্রাফিকের প্রায় ৮০% হ্যান্ডেল করে।

লং-টেইল কনটেন্ট বা বটম ৯০% (Long-tail content): এগুলোকে রিকোয়েস্টের ওপর ভিত্তি করে বা অন-ডিমান্ড (On-demand) অরিজিন সার্ভার (Origin Server) থেকে ফেচ বা সংগ্রহ করা হয়। প্রথম দর্শকের ক্ষেত্রে এখানে কোল্ড ক্যাশ মিস (cold cache miss) ঘটে (যার কারণে প্রায় ৫০০ ms অতিরিক্ত ল্যাটেন্সি বা বাফারিং হতে পারে), এরপর থেকে ওই এলাকার পরবর্তী দর্শকরা এজ ক্যাশ থেকেই সরাসরি ভিডিওটি পেয়ে যান।

মাল্টি-টিয়ার ক্যাশিং (Multi-tier caching):

  • L1 — এজ লোকেশন বা PoPs (২০০+ লোকেশন): ব্যবহারকারীদের সবথেকে কাছাকাছি থাকে। শুধুমাত্র হট সেগমেন্টগুলো (hot segments) ক্যাশ করে।
  • L2 — রিজিওনাল হাব (২০-৩০ লোকেশন): এগুলোর স্টোরেজ ক্যাপাসিটি আরও বেশি। হট বা ওয়ার্ম এবং লুকওয়ার্ম কনটেন্টগুলো ক্যাশ করে।
  • L3 — অরিজিন: সকল কনটেন্টসহ অবজেক্ট স্টোরেজ (যেমন S3)। শুধুমাত্র পুরোপুরি ক্যাশ মিস (full cache miss) হলেই এটি হিট করে।

প্রি-ওয়ার্মিং (Pre-warming): ১০ মিলিয়ন সাবস্ক্রাইবার বা অনুসরণকারীর কোনো চ্যানেল একটি নতুন ভিডিও আপলোড করলে, সিস্টেমটি ক্যাশ মিসের জন্য অপেক্ষা করে না। বরং এটি আগে থেকেই ট্রান্সকোড করা সেগমেন্টগুলোকে সেইসব লোকেশনের এজ PoPs-গুলোতে পুশ করে যেখানে সাধারণত সাবস্ক্রাইবাররা বেশি থাকেন।

সেগমেন্ট-লেভেল ক্যাশিং (Segment-level caching): যেহেতু ভিডিওগুলো ২-১০ সেকেন্ডের ছোট ছোট সেগমেন্টে বিভক্ত থাকে, তাই CDN সেগমেন্ট লেভেলেও ক্যাশ করতে পারে। একটি ভিডিওর প্রথম ৩০ সেকেন্ড (সেগমেন্ট ১-৫) খুব তাড়াতাড়ি ক্যাশ হয়ে যায় কারণ বেশির ভাগ দর্শক অন্তত এইটুকু সময় ভিডিওটি দেখেন।

Note: ইন্টারভিউ টিপস: ভিডিও স্ট্রিমিংয়ের সাথে অন্যান্য সিস্টেম ডিজাইনের কিছু মূল পার্থক্য রয়েছে। ইন্টারভিউতে যেসব বিষয় নিয়ে আলোচনা করতে পারেন: (১) বড় ফাইলের জন্য চাঙ্কড বা পুনরায় শুরু করা যায় এমন আপলোডের সুবিধা, (২) একাধিক আউটপুট রেজোলিউশনের জন্য অ্যাসিনক্রোনাস ট্রান্সকোডিং পাইপলাইন, (৩) HLS/DASH-এর মাধ্যমে অ্যাডাপ্টিভ বিটরেট কীভাবে কাজ করে এবং মেনিফেস্ট (Manifest)-এর ভূমিকা, (৪) বিভিন্ন স্তরের ক্যাশিংয়ের জন্য CDN-কে প্রাইমারি সার্ভিং লেয়ার (primary serving layer) হিসেবে ব্যবহার। সেগমেন্ট-লেভেল ক্যাশিং এবং প্রি-ওয়ার্মিং (pre-warming) নিয়ে আলোচনা করলে তারা বুঝবে এই বিষয়ে আপনার গভীর জ্ঞান রয়েছে।

Key Metrics

আপলোড + ট্রান্সকোড ল্যাটেন্সি
ভিডিওর দৈর্ঘ্য এবং রেজোলিউশনের ওপর নির্ভরশীল
২–১০ মিনিট —
স্ট্রিমিং শুরু হওয়ার সময়
মেনিফেস্ট ফেচ + CDN এজ থেকে পাওয়া প্রথম সংযোগ
< ২ সে. \(O(1)\)
প্রতিদিন র (raw) ভিডিও আপলোডের স্টোরেজ
৫ মিলিয়ন আপলোড × গড়ে ২০০ MB
~১ PB / দিন —
পিক সময়ে CDN-এর এগ্রেস ব্যান্ডউইথ (egress bandwidth)
১ মিলিয়ন স্ট্রিম একসাথে × ৪ Mbps গড়ে
~৪ Tbps —
CDN ক্যাশ হিট রেট (জনপ্রিয় কনটেন্ট)
টপ ১০% কনটেন্ট আগে থেকেই এজ সার্ভারে রেডি থাকে
> ৯৫% —
অ্যাডাপ্টিভ বিটরেট সুইচ (Adaptive bitrate switch)
পরবর্তী সেগমেন্ট বাফার হওয়ার সাথে সাথে কোয়ালিটি চেঞ্জ হয়
< ১ সেগমেন্ট \(O(1)\)

ছোট কুইজ

একটি ভিডিও ফাইলকে একসাথে স্ট্রিম না করে ছোট ছোট সেগমেন্টে (২–১০ সেকেন্ড) ভাগ করা হয় কেন?

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