Introduction of System Design
System Design আসলে কী ?
ধরেন আপনি এমন একটা নাইস এপ্লিকেশন বানালেন যেটা প্রতিদিন নতুন নতুন ইউজার পাচ্ছে এবং লক্ষ লক্ষ মানুষ এটা ব্যবহার করছে। প্রথমদিকে এপ্লিকেশন খুব ভালো পারফর্ম করতেছিলো, কিন্তু কিছু দিন যেতেই আপনার এপ্লিকেশনের ইউজার সংখ্যা কয়েকশ থেকে কয়েক হাজারে পৌঁছালো এবং তখন থেকেই কিছু ইউজার বলছে যে তাদের এপ্লিকেশন টি স্লো মনে হচ্ছে। এরপর আরও কিছুদিন পর যখন কয়েক লক্ষে পৌঁছালো তখন অবস্থা আরো খারাপ, এপ চলছেনা, স্লো হয়ে যাচ্ছে, এমনকি আপ্লিকেশন ক্রাশ করছে, ডেটা লস হচ্ছে, ডেটা ইনকনসিসটেন্ট হচ্ছে, ডেটা করাপ্ট হচ্ছে, ডেটা সিকিউরিটি ইস্যু তৈরি হচ্ছে, এবং ইউজাররা রেগে গিয়ে ভালো রেটিং না দিয়ে চলে যাচ্ছে।

এইখানেই আসলে আপনার সিস্টেম ডিজাইনের প্রয়োজনীয়তা দেখা যায়। আপনি যদি শুরু থেকেই সিস্টেম ডিজাইন মাথায় রেখে এপ্লিকেশনটি তৈরি করতেন তবে এই সমস্যাগুলোর অনেক গুলোই সমাধান করা সম্ভব ছিল। কারণ আপনি তখন চিন্তা করতেন যে আমার এপ্লিকশনে যদি ১ লক্ষ ইউজার হয় তাহলে কিভাবে সিস্টেম ডিজাইন করব, কিভাবে ডেটা হ্যান্ডেল করব, কিভাবে ইউজারদের ডেটা সিকিউরিটির বিষয়টি নিশ্চিত করব, কিভাবে সিস্টেমের লোড হ্যান্ডেল করব, কিভাবে সিস্টেমের স্কেলিং করব ইত্যাদি। এইযে শুরু থেকেই কিছু বিষয় প্ল্যান করে কাজ করা এটাকেই সিস্টেম ডিজাইন বলা হয়।
সহজ কথায় বলতে গেলে, সিস্টেম ডিজাইন হলো এমন একটি প্রক্রিয়া যার মাধ্যমে আমরা একটি সফটওয়্যার বা অ্যাপ্লিকেশনকে এমনভাবে পরিকল্পনা করে তৈরি করি যাতে সেটি লক্ষ লক্ষ ইউজারের চাপ সামলাতে পারে এবং কোনো সমস্যা ছাড়াই কাজ করতে পারে।
এটি অনেকটা একটি বিশাল বিল্ডিং বা ব্রিজ তৈরি করার আগেই যেই প্লান বা নকশা করা হয় তার মতো । আপনি যদি জানেন যে আপনার বিল্ডিং এ ১০ জন থাকবে, তবে তার ডিজাইন একরকম হবে। আবার যদি জানেন ১০ হাজার লোক থাকবে, তবে তার ডিজাইন হবে সম্পূর্ণ আলাদা।
সিস্টেম ডিজাইন কেন শিখবেন?
আপনি যদি শুধু ভালো কোড করতে জানেন, তবেই কি আপনি একজন Software Engineer ? অনেকের হয়তো মনে হতে পারে,ভালো কোড লেখতে পারলেই হয়তো সফটওয়ার ইঞ্জিনিয়ার হয়ে যাওয়া যায়। অবশ্য আমাদের দেশে কিছুটা ওইরকমই মনে করা হয়। তবে আপনি যদি সফটওয়ার ইঞ্জিনিয়ারিং কে একটা বিশাল বিল্ডিং এর মতো ভাবেন তাহলে কোড লেখাটা হল সেই বিল্ডিং এর ইটের মতো। আপনি যদি শুধু ইট গেঁথেই একটা বিল্ডিং তৈরি করেন তবে হয়তো আপনি কোনমতো একটা এক তলা বিল্ডিং বানাতে পারবেন, কিন্তু কখনওই সেই বিশাল বিল্ডিং বানাতে পারবেন না। বিশাল বিল্ডিং বানানোর জন্য দরকার হয় আর্কিটেক্ট এর। ঠিক তেমনি আপনি যদি শুধু ভালো কোড লেখতে পারেন, তবে আপনি একজন সাধারণ ডেভেলপার, সফটওয়ার ইঞ্জিনিয়ার নন । কারণ আপনি আর্কিটেক্ট জানেন না ।
আর তাই যদি বড় এপ্লিকেশন বানাতে চান তবে আপনাকে সিস্টেম ডিজাইন শিখতে হবে। আপনাকে জানতে হবে কি ভাবে ডেটাবেস ডিজাইন করতে হয় , কি ভাবে লোড ব্যালেন্সার ব্যবহার করতে হয়, কি ভাবে ক্যাশিং ব্যবহার করতে হয়, কি ভাবে স্কেলিং করতে হয়, কি ভাবে সিকিউরিটি ইমপ্লিমেন্ট করতে হয় ইত্যাদি। আর এই জিনিশগুলো মাথায় রেখে এপ্লিকেশন ডিজাইন করাই মূলত সিস্টেম ডিজাইন করা ।
তাই নিজেকে একজন সফটওয়ার ইঞ্জিনিয়ার হিসেবে গড়তে চাইলে সিস্টেম ডিজাইন শিখতে হবেই।
Career Growth
Building Reliable Apps
স্ক্যালিং (Scaling) কী?
স্ক্যালিং মানে হলো আপনার সিস্টেমের ক্ষমতা বাড়ানো। ইউজার বাড়লে সিস্টেম যেন ডাউন না হয়, তার জন্য আমরা দুইভাবে স্ক্যালিং করি: Vertical Scaling আর Horizontal Scaling। একটা কুইক কমপারিজন দেখি চলেন।
| ধরণ | Vertical Scaling (Up) | Horizontal Scaling (Out) |
|---|---|---|
| মূল ধারণা | একটি মেশিনের ক্ষমতা বাড়ানো (RAM/CPU) | অনেকগুলো নতুন মেশিন যোগ করা |
| খরচ | অনেক বেশি (High-end hardware expensive) | সাশ্রয়ী (ছোট ছোট অনেক মেশিন) |
| সীমাবদ্ধতা | লিমিট আছে (একটা মেশিনের সর্বোচ্চ ক্ষমতা আছে) | আনলিমিটেড (যত খুশি মেশিন যোগ করা যায়) |
| উদাহরণ | পিসি আপডেট করা (৮ থেকে ১৬ জিবি র্যাম) | অফিসে লোক বাড়ানো (১ জন কর্মীর বদলে ১০ জন) |
তাহলে কোনটা বেছে নেবো ?
শুরুতে Vertical Scaling সহজ মনে হলেও, বড় স্কেলে Horizontal Scaling-ই হলো আসল সমাধান। কেননা বিশ্বের সবচাইতে বড় কম্পিউটারেরও কিন্তু হার্ডওয়ার লিমিট রয়েছে। তাছাড়া সিঙ্গেল পয়েন্ট অফ ফেইলারের ব্যাপারও আছে। আমরা সামনের দিনগুলোতে এগুলো বিস্তারিত জানবো ।
সিস্টেম ডিজাইনের মূল হাতিয়ারসমূহ
Load Balancer
এটি ইনকামিং ট্রাফিককে বিভিন্ন সার্ভারে সুষমভাবে ভাগ করে দেয় যাতে কোনো নির্দিষ্ট সার্ভার ওভারলোড না হয়।
Caching
বারবার প্রয়োজন হয় এমন ডেটা দ্রুত দেখানোর জন্য মেমোরিতে (যেমন: Redis) সাময়িকভাবে জমা রাখা।
Database Sharding
একটি বিশাল ডেটাবেসকে ছোট ছোট টুকরো করে বিভিন্ন সার্ভারে ছড়িয়ে দেওয়া যাতে কুয়েরি দ্রুত হয়।
CDN
ছবি, ভিডিও বা স্ট্যাটিক ফাইলগুলো ইউজারের ভৌগোলিক অবস্থানের সবচেয়ে কাছের সার্ভার থেকে দ্রুত পৌঁছে দেওয়া।
Message Queues
সময়সাপেক্ষ কাজগুলো (যেমন: ইমেইল পাঠানো) ব্যাকগ্রাউন্ডে প্রসেস করার জন্য সারিবদ্ধভাবে সাজিয়ে রাখা।
Microservices
একটি বড় অ্যাপ্লিকেশনকে অনেকগুলো ছোট এবং স্বাধীন সার্ভিসে ভাগ করা যাতে মেইনটেন্যান্স সহজ হয়।
API Gateway
সিস্টেমের সব রিকোয়েস্টের একক প্রবেশদ্বার যা সিকিউরিটি, অথেন্টিকেশন এবং রাউটিং নিয়ন্ত্রণ করে।
DNS
ইউজারের টাইপ করা ডোমেইন নেমকে (যেমন: google.com) মেশিনের বোধগম্য IP অ্যাড্রেসে রূপান্তর করা।
SUMMARY — আজকে যা শিখলাম
| Concept | এক লাইনে |
|---|---|
| System Design | বড় স্কেলের সফটওয়্যার তৈরির ব্লুপ্রিন্ট। |
| Vertical Scaling | মেশিনকে আরও শক্তিশালী করা। |
| Horizontal Scaling | আরও মেশিন যোগ করা। |
| Load Balancer | ট্রাফিক ভাগ করে দেওয়ার ট্রাফিক পুলিশ। |