System Design শেখো
সব কেস স্টাডি

Video Streaming (YouTube/Netflix) ডিজাইন

15 মিনিটadvanced
এক নজরে
  • Upload হওয়া video একটা transcoding pipeline-এ একাধিক resolution-এ রূপান্তরিত হয় এবং ছোট chunk-এ ভাঙা হয়।
  • Adaptive bitrate streaming (HLS/DASH) দিয়ে user-এর net speed অনুযায়ী quality নিজে থেকে বদলায়।
  • Video নিজে blob storage + CDN-এ থাকে, আর metadata আলাদা DB-তে — যাতে scale করা যায়।

YouTube-এ একটা video upload করে দিলে কয়েক মিনিট পর সেটা 144p থেকে 4K পর্যন্ত নানা quality-তে, পৃথিবীর যেকোনো প্রান্তে, যেকোনো net speed-এ smooth চলে। এর পেছনে আছে বিশাল transcoding pipeline আর global CDN। চলো একজন senior engineer-এর দৃষ্টিতে পুরো system ভেঙে দেখি।

১. সমস্যা বোঝা (Requirements)

Functional Requirements:

  • Video upload করা।
  • Upload হওয়া video কে নানা resolution-এ process করা (240p, 480p, 720p, 1080p, 4K)।
  • Video stream/playback করা, যেকোনো ডিভাইসে।
  • Adaptive quality — net speed অনুযায়ী quality বদলানো।
  • View count, like, comment।
  • Search ও basic recommendation

Non-functional Requirements:

  • High availability — সার্ভিস কখনো বন্ধ হবে না।
  • Low latency playback — video শুরু হতে যেন দেরি না হয়।
  • Scalability — কোটি কোটি ঘণ্টা video, কোটি দর্শক।
  • Durability — upload হওয়া video কখনো হারাবে না।
  • Read-heavy — দেখা হয় লেখার চেয়ে হাজার গুণ বেশি।
সহজ উদাহরণ

ভাবো একটা রেস্টুরেন্ট। রাঁধুনি একবার বড় হাঁড়িতে রান্না করে রাখে (transcoding — একবার process)। তারপর ঢাকা, চট্টগ্রাম, সিলেটের শাখা থেকে কাছের গ্রাহককে গরম গরম পরিবেশন করা হয় (CDN — কাছের edge থেকে serve)। কেউ central রান্নাঘরে যায় না।

২. স্কেল আন্দাজ (Estimation)

ধরি:
DAU                            = 100 কোটি = 1B
গড়ে প্রতি user/দিন video দেখে   = 5 টি
মোট view/দিন                   = 5 বিলিয়ন
read QPS গড়                   = 5B / 86400 ≈ 58,000 view/sec
পিক (×3)                       ≈ 175,000 view/sec

Upload:
প্রতি মিনিটে upload            ≈ 500 ঘণ্টা video (YouTube-এর কাছাকাছি)
প্রতি ঘণ্টা raw video (1080p)  ≈ 2 GB

Storage (transcoding-এর পর সব resolution মিলে ~2× source):
প্রতি মিনিটে                   = 500 ঘণ্টা × 2 GB × 2 ≈ 2 TB/মিনিট
প্রতি দিন                      ≈ 2 TB × 60 × 24 ≈ 2.8 PB/দিন

Bandwidth (delivery):
175,000 concurrent stream × 5 Mbps ≈ 875 Gbps পিক

মূল শিক্ষা: storage ও bandwidth দুটোই বিশাল — তাই blob storage + CDN ছাড়া উপায় নেই, আর এটা প্রবলভাবে read-heavy।

৩. API ডিজাইন

// Upload (বড় ফাইল, তাই resumable/multipart)
POST /v1/videos/upload-url        // pre-signed upload URL চাওয়া
PUT  <pre-signed-url>             // সরাসরি blob storage-এ chunk আপলোড
POST /v1/videos                   // metadata জমা (title, desc)

// Playback
GET  /v1/videos/{id}             // metadata + manifest URL
GET  /v1/videos/{id}/manifest.m3u8   // HLS manifest (quality list)
GET  <cdn>/segments/{id}/720p/seg_003.ts  // আসল video chunk

// Engagement
POST /v1/videos/{id}/view        // view count
GET  /v1/feed                    // recommendation feed

৪. ডেটা মডেল

Table/Collectionমূল field
videos (metadata)video_id, user_id, title, description, status, duration, created_at
video_assetsvideo_id, resolution, codec, manifest_path, storage_url
usersuser_id, name, channel_info
views / countersvideo_id, view_count, like_count
commentscomment_id, video_id, user_id, text, created_at

SQL vs NoSQL choice: Video নিজে (বাইনারি ফাইল) কখনো DB-তে রাখা হয় না — সেটা যায় blob storage (S3/GCS), DB-তে থাকে শুধু path/URL। Metadata (title, owner, duration) structured ও relational, তাই SQL (sharded MySQL/Postgres) ভালো। কিন্তু view count-এর মতো প্রচণ্ড high-write counter-এর জন্য NoSQL/Redis + পরে aggregate ব্যবহার করা হয়, কারণ প্রতিবার DB row lock করলে স্কেল করবে না।

৫. হাই-লেভেল ডিজাইন

মূল components:

  • Client/Player: HLS/DASH চালায়, quality বদলায়।
  • Load Balancer + API servers: metadata ও request সামলায়।
  • Blob Storage (S3/GCS): raw upload ও সব transcoded chunk রাখে।
  • Transcoding Pipeline: message queue + worker fleet।
  • Metadata DB: video info।
  • CDN: global delivery।
  • Cache (Redis): hot metadata ও counter।

Upload flow:

  1. Client pre-signed URL নিয়ে video সরাসরি blob storage-এ upload করে (API server-কে bypass করে)।
  2. Upload শেষ হলে একটা message queue (Kafka)-তে যায়: "এই video process করো"।
  3. Transcoding workers raw video নেয়, chunk-এ ভাঙে, প্রতিটি resolution-এ encode করে, আবার blob storage-এ রাখে এবং HLS/DASH manifest তৈরি করে।
  4. Metadata DB-তে status ready হয়।

Playback flow:

  1. Client video খোলে → API থেকে metadata + manifest URL পায়।
  2. Player manifest পড়ে quality-গুলোর তালিকা পায়।
  3. Player তার net speed দেখে উপযুক্ত quality-র chunk গুলো CDN থেকে একে একে টানে।
  4. Net বদলালে পরের chunk আলাদা quality-তে নেয় (adaptive)।

৬. গভীরে (Deep Dive)

Transcoding Pipeline ও Chunking

Transcoding হলো একটা source video-কে বিভিন্ন resolution ও codec-এ রূপান্তর করা, যাতে কম-দামি ফোন থেকে 4K টিভি সবখানে চলে। কিন্তু একটা 2 ঘণ্টার video পুরোটা একবারে process করা ধীর। তাই video কে ছোট ছোট chunk (যেমন 4-10 সেকেন্ডের segment) এ ভাঙা হয়, আর প্রতিটি chunk আলাদা worker সমান্তরালে (parallel) process করে। এতে একটা দীর্ঘ video কয়েক মিনিটেই ready হয়ে যায়। পুরো জিনিসটা একটা DAG (ধাপে ধাপে কাজ) হিসেবে চলে: split → transcode → package → manifest তৈরি।

Adaptive Bitrate Streaming (HLS/DASH)

Adaptive Bitrate মানে network অনুযায়ী quality নিজে থেকে বদলানো। কাজটা হয় manifest ফাইল দিয়ে — এতে প্রতিটি quality-র chunk-এর তালিকা থাকে। Player প্রতিটি chunk download-এর গতি মেপে সিদ্ধান্ত নেয় পরের chunk কোন quality-তে নেবে। net ভালো → 1080p; বাফার কমতে শুরু করল → চুপচাপ 480p-তে নেমে যায়, ভিডিও থামে না। HLS (Apple) আর DASH এই দুটোই জনপ্রিয় protocol, দুটোই chunk + manifest ভিত্তিক।

কেন chunk?

chunk না থাকলে slow net-এ পুরো ফাইল download শেষ না হওয়া পর্যন্ত video শুরু হতো না। ছোট chunk মানে — প্রথম chunk এলেই playback শুরু, আর quality switch করাও মসৃণ।

CDN ও Blob Storage

Blob Storage (S3/GCS) হলো বিশাল, সস্তা, durable object store — এখানে raw ও transcoded সব ফাইল থাকে; এটা "origin"। কিন্তু সব দর্শককে origin থেকে serve করলে দূরত্বের কারণে latency বেশি আর origin-এর উপর চাপ অসহনীয়। তাই CDN (Content Delivery Network) — পৃথিবীজুড়ে edge server — জনপ্রিয় video chunk cache করে রাখে এবং দর্শকের কাছের edge থেকেই serve করে।

সাবধান

View count কখনো প্রতিবার সরাসরি একটা DB row-তে UPDATE ... SET count = count + 1 করো না — viral video-তে সেই একটা row-ই hotspot হয়ে DB ফেলে দেবে। বদলে Redis/Kafka-তে increment জমিয়ে periodically aggregate করে DB-তে লেখা হয়।

৭. বটলনেক ও স্কেলিং

  • Delivery bandwidth: সবচেয়ে বড় খরচ ও bottleneck — CDN আর জনপ্রিয় video বেশি edge-এ cache করে সামলানো হয়।
  • Transcoding compute: ভারী CPU/GPU কাজ — auto-scaling worker fleet আর priority queue (জনপ্রিয় creator আগে)।
  • Metadata read: খুব read-heavy — Redis caching + read replica
  • Storage growth: কম-দেখা video নিম্ন resolution-এ রাখা বা cold storage-এ সরানো।
  • Sharding: metadata DB video_id দিয়ে shard করা।
  • Recommendation: আলাদা একটা ML pipeline — watch history, similar video থেকে feed তৈরি করে; মূল streaming path থেকে decoupled রাখা হয় যাতে একে অপরকে slow না করে।

৮. সারসংক্ষেপ

Video streaming-এর মূল মন্ত্র — একবার process, বহুবার serve। Upload যায় blob storage-এ, একটা parallel transcoding pipeline নানা resolution-এ chunk বানায়, adaptive bitrate (HLS/DASH) player-কে smart করে তোলে, আর CDN কোটি দর্শকের কাছে দ্রুত পৌঁছে দেয়। Metadata আলাদা DB-তে থাকে, view count আলাদা high-write path-এ, recommendation আলাদা pipeline-এ।

টিপস

Interview-তে interviewer দেখতে চায় তুমি বুঝেছ কিনা — video কখনো DB-তে রাখা হয় না, transcoding কেন offline ও parallel, এবং CDN ছাড়া global delivery অসম্ভব। "upload থেকে playback পর্যন্ত video-র যাত্রা" পরিষ্কার আঁকতে পারলেই তুমি এগিয়ে।

মিনি কুইজ

1. একই video বিভিন্ন quality-তে (240p, 720p, 1080p) তৈরি করার প্রক্রিয়াকে কী বলে?

2. User-এর net slow হলে video নিজে থেকে কম quality-তে নেমে আসে — এটা সম্ভব হয় কীসে?

3. দর্শকের কাছে video দ্রুত পৌঁছানোর জন্য মূলত কোনটি ব্যবহার হয়?