CRUD-এর বাইরে project করতে গেলে সাধারণত real-time chat, calling বা map আসে। কিন্তু আমি ভাবলাম, আমরা যে প্রায় প্রতিদিন YouTube, Facebook, Instagram-এ use করি, ভিডিও দেখি; সেই ভিডিও স্ট্রিমিং নিয়ে কাজ করলে কেমন হয়। তাই scaling মাথায় রেখে কিছু article, documentation পড়ে system design করে একটি PoC বানানো শুরু করেছি।
ভিডিও স্ট্রিমিং-এ বেশিরভাগ মানুষ ভিডিও দেখে (consumer), আর খুব কম মানুষ ভিডিও upload করে। তাই শুরুটা করা যাক consumer-এর দিক থেকে, কিভাবে তাদের experience আরও smooth করা যায়। ধরুন, আপনি এখন একটি ভিডিও দেখছেন, যার duration ১০ মিনিট এবং file size ৫০০ MB। যদি সার্ভার থেকে পুরো ফাইল একসাথে লোড করতে হয়, তাহলে ৫০০ MB download না হওয়া পর্যন্ত ভিডিও চালু হবে না(Buffering)। এতে user experience খারাপ হয়ে যায়। তাই পুরো ভিডিও একসাথে পাঠানো হয় না, বরং ছোট ছোট chunk আকারে পাঠানো হয়, এটাই streaming। উদাহরণ হিসেবে ধরুন, ১০ সেকেন্ডের একটি chunk ৫ MB। এতে download হতে কম সময় লাগে, এবং আপনি ওই ১০ সেকেন্ড দেখার সময় পরের chunk লোড হয়ে যাবে। ইউটিউবের timeline-এ যে সাদা দাগ দেখা যায়, সেটিই আসলে দেখায কতটুকু ভিডিও লোড হয়েছে।
এভাবে প্রাথমিক সমস্যা সমাধান হলেও, গ্রাম বা দুর্বল ইন্টারনেটের এলাকায় এখনো সমস্যা থেকে যায়। এর জন্য ব্যবহার করা হয় adaptive bitrate streaming, যা user-এর ইন্টারনেট স্পিড অনুযায়ী ভিডিও quality intelligentভাবে adjust করে, low speed হলে low quality এবং ভালো speed হলে high quality। এজন্য DASH ব্যবহার করা হয়, ফলে end user-এর বড় সমস্যা অনেকাংশে মিটে যায়।
এবার আসা যাক uploading প্রসঙ্গে। Uploader যখন ভিডিও upload করে, তখন সেটি সরাসরি server-এ পাঠানো হয় না। প্রথমে client ভিডিও metadata নিয়ে server-এ request পাঠায়। Server সেটি verify করে (ভিডিওর format, size ইত্যাদি চেক করে), তারপর S3 থেকে একটি pre-signed URL তৈরি করে client-কে দেয়। Client সেই URL ব্যবহার করে ভিডিও সরাসরি S3-এ upload করে। এতে server-কে বড় ভিডিও ফাইল handle করতে হয় না।
Upload শেষ হলে ভিডিও store ও stream করা expensive হয়ে পড়ে, বিশেষ করে যদি ভিডিও বড় হয় (ধরা যাক ১ GB)। তাই ভিডিও compress করা হয়। এতে quality ঠিক রেখে file size নেমে আসে প্রায় ৩০০–৪০০ MB এ। এরপর ভিডিওকে বিভিন্ন resolution (1080p, 720p, 480p ইত্যাদি) এ convert করা হয় এবং প্রতিটি resolution ছোট ছোট chunk-এ ভাগ করা হয়। সবশেষে একটি manifest mpd file তৈরি হয়, যেখানে সব resolution আর chunk-এর reference থাকে।
পুরো pipeline-এর কাজ করার ধাপগুলো এমন: user ভিডিও upload করলে server থেকে pre-signed URL নিয়ে S3-এ upload করে। Upload শেষ হলে S3 একটি মেসেজ SQS-এ পাঠায়। SQS থেকে মেসেজ এলে Lambda trigger হয়। Lambda সরাসরি প্রসেস না করে ECS-এ একটি task launch করে। ওই task, ECR থেকে একটি custom container image pull করে, যা ffmpeg ব্যবহার করে ভিডিও process করার জন্য তৈরি করা হয়েছে, তারপর S3 থেকে ভিডিও নামিয়ে compress করে, বিভিন্ন resolution-এ convert করে, chunk বানায় এবং manifest mpd তৈরি করে। সবকিছু আবার S3-এ upload হয় এবং তারপর task শেষ হয়। এই পুরো সময়ে upload আর processing-এর প্রতিটি ধাপে user real-time status update পায় (socket ব্যবহার করে)।
এছাড়াও কিছু optimization করা হয়েছে। যেমন, S3-এ lifecycle policies ব্যবহার করা হয়েছে cost optimization-এর জন্য, যাতে নির্দিষ্ট সময় পর ভিডিও storage class পরিবর্তন হয় এবং খরচ কম হয়। Hot data-এর জন্য CDN ব্যবহার করা হয়েছে। ECS-এর জন্য custom policy লেখা হয়েছে, ভিডিও যদি ১GB-এর কম হয়, তবে ECS Fargate-এ process হয়। Spot এবং Regular instance-এর ratio configurable, এবং যদি Spot instance fail করে (যেমন resource unavailable), task স্বয়ংক্রিয়ভাবে Regular instance-এ retry হয়, ফলে reliability বজায় থাকে। আর ভিডিও যদি ১GB-এর বেশি হয়, তখন সরাসরি Regular Fargate ব্যবহার করা হয়। ছোট jobs-এর জন্য ECS batch mode ব্যবহার করা হয়েছে, যাতে lightweight কাজগুলো দ্রুত ও সাশ্রয়ীভাবে শেষ করা যায়।
Socket-এর backplane, caching আর rate limiting-এর জন্য Redis ব্যবহার করা হয়েছে। Backend Auto Scaling Group-এ রাখা হয়েছে, যা load অনুযায়ী auto scale in/out করে। MongoDB cluster-এ একটি Primary আর দুটি read replica আছে। Backend instance, MongoDB, Redis সব private subnet-এ রাখা হয়েছে। পুরো infrastructure Pulumi দিয়ে তৈরি করা হয়েছে এবং MongoDB cluster setup, Redis installation, frontend ও backend-এর image ECR থেকে pull করে run করাসহ অনেক automation Ansible দিয়ে করা হয়েছে।
এমন প্রজেক্ট করতে গেয়ে cloud এ কিছু টাকা-পয়সা খরচ হয়, কিন্তু infrastructure provisioning, automation, system design, scaling ইত্যাদিতে কাজ করতে যে আনন্দ পাই, তার কাছে সব পোষায়ে যায়।
This is how I collect happiness—by building stuff!
Top comments (0)