> 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/security/rate-limiting.md).

# Rate Limiting

একবার ভাবুন, আপনি একটি **Website** বা **API** চালাচ্ছেন, যেখানে লক্ষ লক্ষ **User Request** আসছে প্রতি সেকেন্ডে। যদি হঠাৎ এক বা একাধিক **User** অস্বাভাবিক পরিমাণ **Request** পাঠাতে থাকে, তাহলে আপনার **Server** অতিরিক্ত লোডের কারণে **Crash** করতে পারে!

এই সমস্যার সমাধান হচ্ছে **Rate Limiting**। এটি নিশ্চিত করে যে, নির্দিষ্ট সময়ের মধ্যে নির্দিষ্ট পরিমাণ **Request** গ্রহণ করা হবে এবং এর বেশি হলে **Block** বা **Delay** করা হবে।

***

### **Rate Limiting কী?**

**Rate Limiting** হলো একটি **System Design Technique**, যা **User** বা **Client** কতবার একটি নির্দিষ্ট সময়ের মধ্যে **Request** পাঠাতে পারবে তা নিয়ন্ত্রণ করে। এটি **API Security**, **Server Protection**, এবং **Fair Usage Policy** বজায় রাখতে ব্যবহৃত হয়।

### **কেন Rate Limiting গুরুত্বপূর্ণ?**

✅ **Server Overload প্রতিরোধ:** একসঙ্গে অনেক **Request** আসলে **Server** ধীর হয়ে যেতে পারে বা **Down** হয়ে যেতে পারে।\
✅ **DDoS Attack প্রতিরোধ:** যদি কেউ ইচ্ছাকৃতভাবে হাজার হাজার **Request** পাঠায়, তাহলে **Rate Limiting** এটিকে **Block** করতে পারে।\
✅ **Fair Usage নিশ্চিতকরণ:** কিছু **User** যদি বেশি **Resource** ব্যবহার করে, তাহলে অন্য **User** ঠিকমতো **Service** পাবে না।\
✅ **Cost Management:** ক্লাউড **Service** ব্যবহার করলে অতিরিক্ত **Request** অর্থ খরচ বাড়িয়ে দিতে পারে।

***

### **Rate Limiting কীভাবে কাজ করে?**

সাধারণত, **Rate Limiting** কয়েকটি পদ্ধতিতে কাজ করে:

#### **1. Token Bucket Algorithm**

এই পদ্ধতিতে, প্রত্যেক **User** বা **Client** এর জন্য একটি **Bucket (বালতি)** থাকে, যেখানে নির্দিষ্ট সংখ্যক **Token (টোকেন)** থাকে। প্রত্যেকটি **Request** করতে হলে একটি **Token** ব্যবহার করতে হয়।

* যদি **Bucket**-এ **Token** থাকে, তাহলে **Request** অনুমোদিত হবে।
* যদি **Bucket খালি** হয়ে যায়, তাহলে **Request** **Reject** বা **Delay** করা হবে।

🔹 **Example:**\
একজন **User** প্রতি মিনিটে **10টি API Call** করতে পারবে।

```python
import time
from collections import deque

class TokenBucket:
    def __init__(self, capacity, refill_rate):
        self.capacity = capacity
        self.tokens = capacity
        self.refill_rate = refill_rate
        self.last_refill_time = time.time()

    def allow_request(self):
        current_time = time.time()
        elapsed_time = current_time - self.last_refill_time
        self.tokens += elapsed_time * self.refill_rate
        self.tokens = min(self.capacity, self.tokens)
        self.last_refill_time = current_time

        if self.tokens >= 1:
            self.tokens -= 1
            return True
        else:
            return False

# Example Usage
bucket = TokenBucket(capacity=10, refill_rate=1)

for i in range(15):
    if bucket.allow_request():
        print(f"Request {i+1}: Allowed ✅")
    else:
        print(f"Request {i+1}: Blocked ❌")
    time.sleep(0.2)
```

***

#### **2. Leaky Bucket Algorithm**

এটি **Token Bucket** এর মতোই, তবে এখানে **Request Queue** হিসাবে কাজ করে।

* **Requests** একটি **Queue** তে জমা হয়।
* একটি নির্দিষ্ট **Rate** এ **Server** থেকে **Requests** প্রক্রিয়াজাত করা হয়।
* **Queue** ভরে গেলে নতুন **Request** **Drop** করা হয়।

***

#### **3. Fixed Window Algorithm**

এই পদ্ধতিতে **Request Counting** করা হয় নির্দিষ্ট সময়ের **Fixed Window** এর মধ্যে।

🔹 **Example:**\
একজন **User** প্রতি মিনিটে **100টি Request** পাঠাতে পারবে।

```python
from collections import defaultdict
import time

class FixedWindowRateLimiter:
    def __init__(self, limit, window_size):
        self.limit = limit
        self.window_size = window_size
        self.requests = defaultdict(int)
        self.start_time = int(time.time())

    def allow_request(self, user_id):
        current_window = int(time.time()) // self.window_size
        if self.start_time != current_window:
            self.start_time = current_window
            self.requests[user_id] = 0
        
        if self.requests[user_id] < self.limit:
            self.requests[user_id] += 1
            return True
        return False

# Example Usage
rate_limiter = FixedWindowRateLimiter(limit=5, window_size=10)

for i in range(7):
    if rate_limiter.allow_request("user_1"):
        print(f"Request {i+1}: Allowed ✅")
    else:
        print(f"Request {i+1}: Blocked ❌")
    time.sleep(2)
```

***

#### **4. Sliding Window Algorithm**

এটি **Fixed Window** এর উন্নত সংস্করণ। এখানে **Request** গুলো একটি **Rolling Window** বা **Moving Time Frame** এ গণনা করা হয়।

***

### **Rate Limiting কোথায় ব্যবহৃত হয়?**

✅ API Gateway (Ex: Nginx, Kong, AWS API Gateway)\
✅ Web Applications (Ex: Login Attempt Limiting)\
✅ Cloud Services (Ex: AWS, Google Cloud)\
✅ CDN & Load Balancer (Ex: Cloudflare, Akamai)

***

### **Rate Limiting বাস্তব জীবনে উদাহরণ**

📌 **Example 1:**\
আপনি যদি **Gmail** বা **Facebook** এ **বারবার** ভুল **Password** দিয়ে **Login** করার চেষ্টা করেন, তাহলে কিছুক্ষণ পর **"Try again later"** লেখা আসে। এটি **Rate Limiting** এর ফলাফল।

📌 **Example 2:**\
অনেক **API Services** (যেমন OpenAI API, Twitter API) **Free Tier Users**-দের **Per Minute / Per Hour API Request** Limited করে রাখে।

📌 **Example 3:**\
YouTube, Netflix, বা Facebook এর মতো **Streaming Platforms** যদি **Unlimited Requests** গ্রহণ করতো, তাহলে সার্ভার **Crash** করতো! তাই তারা **Rate Limiting** ব্যবহার করে।

***

**Rate Limiting** সিস্টেম ডিজাইনের অন্যতম গুরুত্বপূর্ণ **Technique**। এটি শুধু **Server Overload** প্রতিরোধ করে না, বরং **Security**, **Fair Usage**, এবং **Cost Optimization** নিশ্চিত করে। **Different Algorithms** এবং **Implementation Techniques** বুঝে আপনাকে **Use Case** অনুযায়ী বেছে নিতে হবে।

আপনার **System Design** এ **Rate Limiting** সঠিকভাবে প্রয়োগ করতে পারলে এটি **Performance এবং Security** দুটোই বাড়াবে!&#x20;
