> For the complete documentation index, see [llms.txt](https://mominur.gitbook.io/mominur-notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://mominur.gitbook.io/mominur-notes/system-design/scalability.md).

# Scalability

Scalability বলতে বোঝায় একটি system-এর সেই ক্ষমতা, যা তাকে সময়ের সাথে সাথে বাড়তে থাকা load এবং resource-এর সাথে মানিয়ে নিতে সাহায্য করে। সহজ ভাষায়, যদি একটি system তার performance ধরে রেখে বেশি সংখ্যক user handle করতে পারে, তাহলে তাকে scalable বলা হয়।

Scalability-এর প্রয়োজনীয়তা বোঝার জন্য, কল্পনা করুন আপনি একটি **e-commerce website** তৈরি করেছেন। প্রথমদিকে আপনার website-এ প্রতিদিন মাত্র ১০০ জন visitor আসে, কিন্তু জনপ্রিয় হওয়ার পর daily visitor সংখ্যা ১ মিলিয়নে পৌঁছে যায়। এখন প্রশ্ন হলো—আপনার system কি এই বাড়তি load সামলাতে পারবে? যদি না পারে, তাহলে আপনার system **scalability problem** এ ভুগছে।

### **Scalability-এর ধরন**

Scalability দুই ধরনের হতে পারে—

#### **১. Vertical Scalability (Scaling Up)**

এতে system-এর **existing hardware (server, RAM, CPU, storage)** upgrade করা হয়। অর্থাৎ, ভালো configuration-এর server ব্যবহার করে load সামলানো হয়।

**উদাহরণ:**\
আপনার website-এর server যদি **8GB RAM এবং 4-core CPU** দিয়ে চলে, এবং এটি যদি ধীর হয়ে যায়, তাহলে আপনি এটিকে **16GB RAM ও 8-core CPU** দিয়ে upgrade করতে পারেন।

**সুবিধা:**

* Simple implementation
* Existing codebase পরিবর্তন করতে হয় না

**অসুবিধা:**

* Hardware-এর সীমাবদ্ধতা রয়েছে (একটা সময়ের পর upgrade করা সম্ভব নয়)
* অনেক ব্যয়বহুল হয়ে যায়

#### **২. Horizontal Scalability (Scaling Out)**

এতে নতুন hardware/server যোগ করে load ভাগ করা হয়। অর্থাৎ, একাধিক server-এ কাজ ভাগ করে দেওয়া হয়।

**উদাহরণ:**\
ধরুন, আপনার system-এর উপর load বেশি হয়ে গেছে। তখন **একটি server বড় করার পরিবর্তে** আপনি নতুন server যুক্ত করে load ভাগ করে দিতে পারেন।

**সুবিধা:**

* Load balancing-এর মাধ্যমে efficient performance
* Practically limitless scaling

**অসুবিধা:**

* System complexity বাড়ে
* Load balancing এবং distributed architecture প্রয়োজন

### **Scalability কীভাবে নিশ্চিত করা যায়?**

Scalable system design করার জন্য কিছু principle অনুসরণ করতে হয়—

#### **১. Load Balancing**

যখন multiple server ব্যবহার করা হয়, তখন Load Balancer request গুলো বিভিন্ন server-এ ভাগ করে দেয়, যাতে কোনো একটিতে বেশি চাপ না পড়ে।

**উদাহরণ:**

{% code lineNumbers="true" %}

```python
from flask import Flask
import random

app = Flask(__name__)

@app.route("/")
def home():
    servers = ["Server-1", "Server-2", "Server-3"]
    assigned_server = random.choice(servers)
    return f"Request served by {assigned_server}"

if __name__ == "__main__":
    app.run(debug=True)
```

{% endcode %}

এই উদাহরণে, প্রতিবার যখন request আসবে, তা random ভাবে একটি server-এ পাঠানো হবে।

#### **২. Caching**

Bar bar database query করে data আনলে system ধীর হয়ে যায়। তাই frequently used data cache করে রাখা হয়।

**উদাহরণ:** **Redis caching**

{% code lineNumbers="true" %}

```python
import redis

cache = redis.Redis(host='localhost', port=6379, db=0)

def get_data(key):
    if cache.exists(key):
        return cache.get(key)  # Cached data return
    else:
        data = "Fetched from DB"  # Database থেকে data আনতে হবে
        cache.set(key, data)  # Cache-এ সংরক্ষণ
        return data
```

{% endcode %}

এতে **প্রতিবার database hit না করে** cache থেকে দ্রুত response দেওয়া যায়।

#### **৩. Database Scalability**

Database-এর ক্ষেত্রেও scaling দরকার হয়, যা নিম্নলিখিত উপায়ে করা যায়—\
**Database Replication:** একাধিক database server ব্যবহার করে data distribute করা হয়।\
**Sharding:** Data-কে ছোট ছোট অংশে ভাগ করে বিভিন্ন server-এ সংরক্ষণ করা হয়।

Scalability নিশ্চিত করা না হলে, system বড় হলে তা ধীরগতির হয়ে পড়ে এবং crash করতে পারে। তাই শুরু থেকেই **scalable architecture** design করা প্রয়োজন। Load balancing, caching, database sharding ইত্যাদি কৌশল ব্যবহার করে system-এর performance ভালো রাখা যায়।
