🌐 Detecting your location…
📢 Advertisement — Configure AdSense in Appearance → Customize → AdSense Settings

একটি Node.js API-এ রেট লিমিটিং কীভাবে প্রয়োগ করবেন: সম্পূর্ণ 2026 গাইড

⏱️2 min read  ·  381 words

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

রেট লিমিট কেন?

  • অপব্যবহার রোধ করুন: নৃশংস-শক্তির আক্রমণ এবং স্ক্র্যাপিং বন্ধ করুন
  • ন্যায্যতা নিশ্চিত করুন: কোন একক ক্লায়েন্ট সম্পদ একচেটিয়া করে না
  • নিয়ন্ত্রণ খরচ: ব্যয়বহুল অপারেশন সীমিত করুন (এআই কল, ডিবি প্রশ্ন)
  • স্থিতিশীলতা রক্ষা করুন: দুর্ঘটনাজনিত বা দূষিত ওভারলোড প্রতিরোধ করুন

প্রধান অ্যালগরিদম

অ্যালগরিদম এটা কিভাবে কাজ করে বাণিজ্য বন্ধ
স্থির উইন্ডো এন অনুরোধ প্রতি নির্দিষ্ট সময়ের উইন্ডো সহজ, কিন্তু জানালার প্রান্তে বিস্ফোরণের অনুমতি দেয়
স্লাইডিং উইন্ডো শেষ X সেকেন্ডে N অনুরোধ (রোলিং) মসৃণ, একটু বেশি জটিল
টোকেন বালতি সময়ের সাথে টোকেন রিফিল; প্রতিটি অনুরোধের একটি খরচ নিয়ন্ত্রিত বিস্ফোরণের অনুমতি দেয়, নমনীয়

সরল: প্রকাশ-হার-সীমা

npm install express-rate-limit
const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
  windowMs: 15 * 60 * 1000,   // 15 minutes
  max: 100,                    // 100 requests per window per IP
  standardHeaders: true,       // return RateLimit-* headers
  legacyHeaders: false,
  message: { error: 'Too many requests, please try again later.' },
});

// Apply globally
app.use(limiter);

// Or stricter limits on specific routes
const authLimiter = rateLimit({
  windowMs: 15 * 60 * 1000,
  max: 5,   // only 5 login attempts per 15 min
});
app.post('/login', authLimiter, loginHandler);

উৎপাদন: রেডিস-ব্যাকড রেট লিমিটিং

ইন-মেমরি সীমা একাধিক সার্ভার দৃষ্টান্ত জুড়ে কাজ করে না। Redis সব ক্ষেত্রে সীমা শেয়ার করে:

npm install rate-limit-redis ioredis
const rateLimit = require('express-rate-limit');
const RedisStore = require('rate-limit-redis');
const Redis = require('ioredis');

const redis = new Redis(process.env.REDIS_URL);

const limiter = rateLimit({
  store: new RedisStore({
    sendCommand: (...args) => redis.call(...args),
  }),
  windowMs: 15 * 60 * 1000,
  max: 100,
});

app.use(limiter);
// Now all server instances share the same rate-limit counters

Redis সঙ্গে কাস্টম টোকেন বালতি

async function tokenBucket(key, maxTokens, refillRate) {
  const now = Date.now();
  const bucket = await redis.hgetall(`bucket:${key}`);

  let tokens = parseFloat(bucket.tokens ?? maxTokens);
  let lastRefill = parseInt(bucket.lastRefill ?? now);

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

  if (tokens < 1) {
    return { allowed: false, retryAfter: (1 - tokens) / refillRate };
  }

  tokens -= 1;  // consume one token
  await redis.hset(`bucket:${key}`, { tokens, lastRefill: now });
  await redis.expire(`bucket:${key}`, 3600);

  return { allowed: true, remaining: Math.floor(tokens) };
}

// Middleware
async function rateLimitMiddleware(req, res, next) {
  const result = await tokenBucket(req.ip, 10, 1);  // 10 tokens, 1/sec refill
  if (!result.allowed) {
    res.setHeader('Retry-After', Math.ceil(result.retryAfter));
    return res.status(429).json({ error: 'Rate limit exceeded' });
  }
  res.setHeader('X-RateLimit-Remaining', result.remaining);
  next();
}

প্রতি-ব্যবহারকারী (শুধু প্রতি-আইপি নয়) সীমাবদ্ধতা

// Rate limit by authenticated user ID instead of IP
const userLimiter = rateLimit({
  windowMs: 60 * 1000,
  max: 60,
  keyGenerator: (req) => {
    // Use user ID if authenticated, fall back to IP
    return req.user?.id || req.ip;
  },
  store: new RedisStore({ sendCommand: (...args) => redis.call(...args) }),
});

// Tiered limits based on plan
function getLimitForUser(req) {
  const plan = req.user?.plan || 'free';
  return { free: 100, pro: 1000, enterprise: 10000 }[plan];
}

সঠিক প্রতিক্রিয়া শিরোনাম সেট করা

// Standard rate-limit headers help clients back off gracefully
res.setHeader('RateLimit-Limit', limit);
res.setHeader('RateLimit-Remaining', remaining);
res.setHeader('RateLimit-Reset', resetTimestamp);

// On limit exceeded, always include Retry-After
res.status(429)
   .setHeader('Retry-After', secondsUntilReset)
   .json({ error: 'Too many requests' });

সর্বোত্তম অভ্যাস

  • মাল্টি-ইনস্ট্যান্স অ্যাপের জন্য রেডিস ব্যবহার করুন — ইন-মেমরি সীমা সার্ভার জুড়ে সিঙ্ক হয় না
  • সংবেদনশীল শেষ পয়েন্টে কঠোর সীমা — লগইন, পাসওয়ার্ড রিসেট, এবং পেমেন্ট এন্ডপয়েন্টের জন্য কঠোর সীমা প্রয়োজন
  • পরিষ্কার শিরোনাম ফেরত দিন — RateLimit-* এবং পুনরায় চেষ্টা করুন-আফটার সাহায্য ক্লায়েন্টদের ভালো আচরণ করা
  • প্রমাণীকৃত হলে ব্যবহারকারীর দ্বারা হারের সীমা — শুধুমাত্র আইপি (শেয়ারড আইপি, প্রক্সি) এর চেয়ে সুন্দর টায়ার্ড সীমা বিবেচনা করুন
  • — বিনামূল্যে বনাম অর্থপ্রদানকারী ব্যবহারকারীদের জন্য বিভিন্ন সীমাঅন্যান্য প্রতিরক্ষার সাথে একত্রিত করুন
  • — হার সীমিত করা এক স্তর, সম্পূর্ণ নিরাপত্তা সমাধান নয়প্রায়শই জিজ্ঞাসিত প্রশ্ন

প্রশ্ন: আমি কোন অ্যালগরিদম ব্যবহার করব?

উত্তর: নমনীয়তার জন্য টোকেন বালতি (নিয়ন্ত্রিত বিস্ফোরণের অনুমতি দেয়), মসৃণতার জন্য স্লাইডিং উইন্ডো, সরলতার জন্য নির্দিষ্ট উইন্ডো। বেশিরভাগ API-এর জন্য, এক্সপ্রেস-রেট-লিমিটের ডিফল্ট (স্থির/স্লাইডিং উইন্ডো) ঠিক আছে। টোকেন বাকেট স্যুট API যেখানে মাঝে মাঝে বিস্ফোরণ গ্রহণযোগ্য।
প্রশ্ন: আমার কি আইপি বা ব্যবহারকারীর দ্বারা সীমা রেট করা উচিত?

উত্তর: ব্যবহারকারী আইডি দ্বারা যখন প্রমাণীকরণ করা হয় (ন্যায্যতর, ভাগ করা আইপি পরিচালনা করে), বেনামী অনুরোধের জন্য আইপিতে ফিরে আসা। শুধুমাত্র আইপি সীমাবদ্ধতা শেয়ার করা NATs বা কর্পোরেট প্রক্সিগুলির পিছনে ব্যবহারকারীদের অন্যায়ভাবে প্রভাবিত করতে পারে।
প্রশ্ন: কেন আমার হার সীমা অপ্রত্যাশিতভাবে রিসেট হয়?

উত্তর: একাধিক দৃষ্টান্ত জুড়ে ইন-মেমরি সীমাবদ্ধতার সাথে, প্রতিটি সার্ভারের নিজস্ব কাউন্টার রয়েছে — একটি ক্লায়েন্ট বিভিন্ন দৃষ্টান্তে আঘাত করে অসামঞ্জস্যপূর্ণ সীমা দেখতে পায়। সমস্ত দৃষ্টান্ত জুড়ে রাজ্য ভাগ করতে Redis ব্যবহার করুন.
প্রশ্ন: কি স্ট্যাটাস কোড আমি ফেরত দিতে হবে?

A: 429 একটি
সহ অনেকগুলি অনুরোধ হেডার ক্লায়েন্টকে বলছে কতক্ষণ অপেক্ষা করতে হবে। এটি মানক এবং ভাল আচরণকারী ক্লায়েন্টরা এটিকে সম্মান করে।Retry-Afterপ্রশ্ন: হার সীমিত করা কি DDoS আক্রমণ বন্ধ করতে পারে?

উত্তর: এটি অ্যাপ্লিকেশন-লেয়ার অপব্যবহারের বিরুদ্ধে সাহায্য করে কিন্তু একটি সম্পূর্ণ DDoS প্রতিরক্ষা নয়। বড় আকারের আক্রমণের জন্য, অ্যাপ্লিকেশন হার সীমিত করার পাশাপাশি নেটওয়ার্ক প্রান্তে একটি CDN/WAF (Cloudflare, AWS Shield) ব্যবহার করুন।
উপসংহার

আপনার Node.js API কে অপব্যবহার এবং ওভারলোড থেকে রক্ষা করার জন্য হার সীমিত করা অপরিহার্য। দিয়ে শুরু করুন

এক্সপ্রেস-রেট-সীমা সাধারণ ক্ষেত্রে, এবং যানরেডিস-ব্যাকড লিমিটিং মাল্টি-ইনস্ট্যান্স প্রোডাকশন অ্যাপের জন্য তাই সার্ভার জুড়ে সিঙ্ক সীমিত করে। সংবেদনশীল এন্ডপয়েন্টে (লগইন, পেমেন্ট) কঠোর সীমা প্রয়োগ করুন, প্রমাণীকরণের সময় ব্যবহারকারীর দ্বারা হারের সীমা, এবং সর্বদা পরিষ্কারভাবে ফেরত দিন এবংRateLimit-* শিরোনাম তাই ক্লায়েন্টদের gracefully বন্ধ ফিরে. গভীরভাবে প্রতিরক্ষার জন্য এটি একটি CDN/WAF এর সাথে একত্রিত করুন।Retry-After শিরোনাম তাই ক্লায়েন্টদের gracefully বন্ধ ফিরে. গভীরভাবে প্রতিরক্ষার জন্য এটি একটি CDN/WAF এর সাথে একত্রিত করুন।

✍️ Leave a Comment

Your email address will not be published. Required fields are marked *

🌐 Read in:🇩🇪 Deutsch🇧🇷 Português🇸🇦 العربية🇮🇳 हिन्दी🇧🇩 বাংলা