রেট লিমিটিং API: অ্যালগরিদম এবং বাস্তবায়ন

Security2026-09-20TryQuickToolBox

আপনার API আক্রমণের শিকার। উন্নত হ্যাকারদের দ্বারা নয়, বরং একটি সাধারণ স্ক্রিপ্ট দ্বারা যা আপনার এন্ডপয়েন্টগুলিকে সেকেন্ডে হাজার হাজার বার আঘাত করে, রিসোর্স গ্রাস করে এবং বৈধ ব্যবহারকারীদের জন্য পরিষেবা খারাপ করে। রেট লিমিটিং ছাড়া, একটি অসদাচরণকারী ক্লায়েন্ট আপনার সম্পূর্ণ অ্যাপ্লিকেশনটি ডাউন করতে পারে। এই গাইডটি মূল অ্যালগরিদমগুলি ব্যাখ্যা করে এবং আপনার API রক্ষা করার জন্য Node.js এবং Nginx-এ ব্যবহারিক বাস্তবায়ন দেখায়।

রেট লিমিটিং কেন গুরুত্বপূর্ণ

রেট লিমিটিং নিয়ন্ত্রণ করে একটি ক্লায়েন্ট একটি নির্দিষ্ট সময় উইন্ডোতে কতগুলি অনুরোধ করতে পারে। এটি আপনার প্রথম প্রতিরক্ষা স্তর:

নিরাপত্তার বাইরে, রেট লিমিটিং ন্যায্য ব্যবহার নিশ্চিত করে এবং আপনাকে ব্যবসায়িক নিয়ম প্রয়োগ করতে সহায়তা করে, যেমন স্তরযুক্ত মূল্য পরিকল্পনা।

রেট লিমিটিং অ্যালগরিদম

চারটি অ্যালগরিদম API রেট লিমিটিং-এ প্রাধান্য পায়। প্রতিটির নির্ভুলতা, মেমরি ব্যবহার এবং বার্স্ট হ্যান্ডলিংয়ে আপস রয়েছে।

1. ফিক্সড উইন্ডো

নির্দিষ্ট সময়ের ব্যবধানে অনুরোধ গণনা করুন (যেমন, প্রতি মিনিটে ১০০ অনুরোধ)। উইন্ডো রিসেট হলে কাউন্টার রিসেট হয়।

2. স্লাইডিং উইন্ডো

প্রতিটি অনুরোধের টাইমস্ট্যাম্প ট্র্যাক করুন এবং শেষ N সেকেন্ডের মধ্যে কতগুলি পড়ে তা গণনা করুন। এটি বার্স্টগুলিকে মসৃণ করে।

3. টোকেন বাকেট

একটি বাকেট টোকেন ধারণ করে। টোকেন একটি নির্দিষ্ট হারে যোগ করা হয়। প্রতিটি অনুরোধ একটি টোকেন খরচ করে। বাকেট খালি থাকলে অনুরোধ প্রত্যাখ্যান করা হয়।

4. লিকি বাকেট

অনুরোধগুলি একটি সারিতে (বাকেট) প্রবেশ করে এবং একটি ধ্রুবক হারে প্রক্রিয়া করা হয়। সারি পূর্ণ হলে অনুরোধগুলি বাদ দেওয়া হয়।

অ্যালগরিদমবার্স্ট হ্যান্ডলিংমেমরিব্যবহারের ক্ষেত্র
ফিক্সড উইন্ডোদুর্বলকমসাধারণ API
স্লাইডিং উইন্ডোভালমধ্যমসাধারণ উদ্দেশ্য
টোকেন বাকেটচমৎকারমধ্যমবার্স্ট সহনশীলতা সহ API
লিকি বাকেটকোনটি নয়মধ্যমট্রাফিক মসৃণকরণ

Node.js-এ রেট লিমিটিং বাস্তবায়ন

আমরা Express এবং Redis ব্যবহার করে একটি টোকেন বাকেট রেট লিমিটার বাস্তবায়ন করব বিতরণকৃত অবস্থার জন্য। যখন আপনার একাধিক সার্ভার ইনস্ট্যান্স থাকে তখন Redis অপরিহার্য।

ধাপ ১: নির্ভরতা ইনস্টল করুন

npm install express redis

ধাপ ২: রেট লিমিটার মিডলওয়্যার তৈরি করুন

const redis = require('redis');
const client = redis.createClient();

async function tokenBucketLimiter(req, res, next) {
  const key = `rate_limit:${req.ip}`;
  const capacity = 10; // max tokens
  const refillRate = 1; // tokens per second

  const now = Date.now();
  const data = await client.hGetAll(key);
  let tokens = data.tokens ? parseFloat(data.tokens) : capacity;
  let lastRefill = data.lastRefill ? parseInt(data.lastRefill) : now;

  // Refill tokens based on elapsed time
  const elapsed = (now - lastRefill) / 1000;
  tokens = Math.min(capacity, tokens + elapsed * refillRate);

  if (tokens < 1) {
    return res.status(429).json({ error: 'Too many requests' });
  }

  tokens -= 1;
  await client.hSet(key, {
    tokens: tokens.toString(),
    lastRefill: now.toString()
  });
  await client.expire(key, 60); // auto-cleanup

  next();
}

app.use(tokenBucketLimiter);

এই মিডলওয়্যারটি পারমাণবিকভাবে টোকেন সংখ্যা পরীক্ষা এবং আপডেট করে। প্রোডাকশনের জন্য, রেস কন্ডিশন এড়াতে Redis ট্রানজ্যাকশন বা Lua স্ক্রিপ্ট ব্যবহার করুন।

Nginx-এ রেট লিমিটিং বাস্তবায়ন

Nginx limit_req মডিউল সহ বিল্ট-ইন রেট লিমিটিং অফার করে। এটি একটি লিকি বাকেট অ্যালগরিদম ব্যবহার করে।

ধাপ ১: একটি রেট লিমিট জোন সংজ্ঞায়িত করুন

nginx.conf-এর http ব্লকে:

limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

এটি api নামে একটি 10MB জোন তৈরি করে যা প্রতি IP-তে প্রতি সেকেন্ডে 10টি অনুরোধের অনুমতি দেয়।

ধাপ ২: সীমা প্রয়োগ করুন

আপনার location ব্লকে:

location /api/ {
    limit_req zone=api burst=20 nodelay;
    proxy_pass http://backend;
}

burst=20 20টি অনুরোধ পর্যন্ত ছোট বার্স্টের অনুমতি দেয়। nodelay বার্স্ট অনুরোধগুলি সারিবদ্ধ করার পরিবর্তে অবিলম্বে প্রক্রিয়া করে।

API রেট লিমিটিংয়ের জন্য সেরা অনুশীলন

সাধারণ জিজ্ঞাসা

রেট লিমিটিং এবং থ্রটলিংয়ের মধ্যে পার্থক্য কী?

রেট লিমিটিং একটি থ্রেশহোল্ডের বাইরে অনুরোধ ব্লক করে, যখন থ্রটলিং সেগুলিকে ধীর করে (যেমন, সারিবদ্ধ বা বিলম্বিত করে)। রেট লিমিটিং বাইনারি; থ্রটলিং ধীরে ধীরে।

আমি কোন রেট লিমিটিং অ্যালগরিদম ব্যবহার করা উচিত?

বেশিরভাগ API-এর জন্য, টোকেন বাকেট একটি ভাল ভারসাম্য দেয়: এটি বার্স্টের অনুমতি দেয় তবে একটি গড় হার প্রয়োগ করে। যদি আপনার কঠোর মসৃণকরণ প্রয়োজন হয়, লিকি বাকেট ব্যবহার করুন। সরলতার জন্য, ফিক্সড উইন্ডো কম-ট্রাফিক API-এর জন্য কাজ করে।

প্রমাণিত বনাম বেনামী ব্যবহারকারীদের জন্য আমি কীভাবে রেট লিমিটিং পরিচালনা করব?

বেনামী ব্যবহারকারীদের (যেমন, IP দ্বারা) কঠোর সীমা প্রয়োগ করুন এবং প্রমাণিত ব্যবহারকারীদের (যেমন, API কী দ্বারা) আরও উদার সীমা প্রয়োগ করুন। আপনি সাবস্ক্রিপশন পরিকল্পনার উপর ভিত্তি করে স্তরযুক্ত সীমাও প্রয়োগ করতে পারেন।

আপনার API ট্রাফিক বিশ্লেষণ করতে প্রস্তুত? লগ পার্স করতে, রেট লিমিট লঙ্ঘন সনাক্ত করতে এবং আপনার থ্রেশহোল্ড অপ্টিমাইজ করতে আমাদের Nginx Log Analyzer ব্যবহার করুন।