রেট লিমিটিং API: অ্যালগরিদম এবং বাস্তবায়ন
আপনার API আক্রমণের শিকার। উন্নত হ্যাকারদের দ্বারা নয়, বরং একটি সাধারণ স্ক্রিপ্ট দ্বারা যা আপনার এন্ডপয়েন্টগুলিকে সেকেন্ডে হাজার হাজার বার আঘাত করে, রিসোর্স গ্রাস করে এবং বৈধ ব্যবহারকারীদের জন্য পরিষেবা খারাপ করে। রেট লিমিটিং ছাড়া, একটি অসদাচরণকারী ক্লায়েন্ট আপনার সম্পূর্ণ অ্যাপ্লিকেশনটি ডাউন করতে পারে। এই গাইডটি মূল অ্যালগরিদমগুলি ব্যাখ্যা করে এবং আপনার API রক্ষা করার জন্য Node.js এবং Nginx-এ ব্যবহারিক বাস্তবায়ন দেখায়।
রেট লিমিটিং কেন গুরুত্বপূর্ণ
রেট লিমিটিং নিয়ন্ত্রণ করে একটি ক্লায়েন্ট একটি নির্দিষ্ট সময় উইন্ডোতে কতগুলি অনুরোধ করতে পারে। এটি আপনার প্রথম প্রতিরক্ষা স্তর:
- লগইন বা API কী এন্ডপয়েন্টে ব্রুট-ফোর্স আক্রমণ
- অতিরিক্ত অনুরোধ থেকে ডিনায়াল-অফ-সার্ভিস (DoS)
- ডাটাবেস কোয়েরি বা ফাইল প্রসেসিংয়ের মতো ব্যয়বহুল অপারেশন থেকে রিসোর্স ক্ষয়
- স্ক্র্যাপার বা বট দ্বারা ফ্রি টিয়ারের অপব্যবহার
নিরাপত্তার বাইরে, রেট লিমিটিং ন্যায্য ব্যবহার নিশ্চিত করে এবং আপনাকে ব্যবসায়িক নিয়ম প্রয়োগ করতে সহায়তা করে, যেমন স্তরযুক্ত মূল্য পরিকল্পনা।
রেট লিমিটিং অ্যালগরিদম
চারটি অ্যালগরিদম API রেট লিমিটিং-এ প্রাধান্য পায়। প্রতিটির নির্ভুলতা, মেমরি ব্যবহার এবং বার্স্ট হ্যান্ডলিংয়ে আপস রয়েছে।
1. ফিক্সড উইন্ডো
নির্দিষ্ট সময়ের ব্যবধানে অনুরোধ গণনা করুন (যেমন, প্রতি মিনিটে ১০০ অনুরোধ)। উইন্ডো রিসেট হলে কাউন্টার রিসেট হয়।
- সুবিধা: সহজ, কম মেমরি (প্রতি ক্লায়েন্টে একটি কাউন্টার)।
- অসুবিধা: উইন্ডো সীমানায় বার্স্ট। একটি ক্লায়েন্ট 12:00:59 এ ১০০টি অনুরোধ পাঠাতে পারে এবং 12:01:00 এ আরও ১০০টি, কার্যত দুই সেকেন্ডে ২০০টি অনুরোধ।
2. স্লাইডিং উইন্ডো
প্রতিটি অনুরোধের টাইমস্ট্যাম্প ট্র্যাক করুন এবং শেষ N সেকেন্ডের মধ্যে কতগুলি পড়ে তা গণনা করুন। এটি বার্স্টগুলিকে মসৃণ করে।
- সুবিধা: নির্ভুল, কোন সীমানা স্পাইক নেই।
- অসুবিধা: উচ্চ মেমরি ব্যবহার (টাইমস্ট্যাম্প সংরক্ষণ) বা ওয়েটেড এভারেজ সহ একটি স্লাইডিং উইন্ডো কাউন্টার ব্যবহার করুন।
3. টোকেন বাকেট
একটি বাকেট টোকেন ধারণ করে। টোকেন একটি নির্দিষ্ট হারে যোগ করা হয়। প্রতিটি অনুরোধ একটি টোকেন খরচ করে। বাকেট খালি থাকলে অনুরোধ প্রত্যাখ্যান করা হয়।
- সুবিধা: বাকেট আকার পর্যন্ত বার্স্টের অনুমতি দেয়, তারপর গড় হার প্রয়োগ করে।
- অসুবিধা: প্রতি ক্লায়েন্টে টোকেন সংখ্যা এবং শেষ রিফিল সময় সংরক্ষণ প্রয়োজন।
4. লিকি বাকেট
অনুরোধগুলি একটি সারিতে (বাকেট) প্রবেশ করে এবং একটি ধ্রুবক হারে প্রক্রিয়া করা হয়। সারি পূর্ণ হলে অনুরোধগুলি বাদ দেওয়া হয়।
- সুবিধা: ট্রাফিককে একটি স্থির হারে মসৃণ করে, ডাউনস্ট্রিম পরিষেবাগুলি রক্ষার জন্য আদর্শ।
- অসুবিধা: লেটেন্সি যোগ করে; রিয়েল-টাইম API-এর জন্য উপযুক্ত নয়।
| অ্যালগরিদম | বার্স্ট হ্যান্ডলিং | মেমরি | ব্যবহারের ক্ষেত্র |
|---|---|---|---|
| ফিক্সড উইন্ডো | দুর্বল | কম | সাধারণ 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 রেট লিমিটিংয়ের জন্য সেরা অনুশীলন
- সঠিক স্ট্যাটাস কোড ফেরত দিন:
429 Too Many Requestsব্যবহার করুন এবংRetry-Afterহেডার অন্তর্ভুক্ত করুন। - ক্লায়েন্টদের সঠিকভাবে চিহ্নিত করুন: সম্ভব হলে IP ঠিকানার পরিবর্তে API কী বা ব্যবহারকারী আইডি ব্যবহার করুন, কারণ IP গুলি শেয়ার করা (NAT) বা স্পুফ করা যেতে পারে।
- অবস্থা বিতরণ করুন: মাল্টি-ইনস্ট্যান্স ডিপ্লয়মেন্টের জন্য Redis বা অনুরূপ স্টোর ব্যবহার করুন।
- লগ এবং মনিটর করুন: আক্রমণ সনাক্ত করতে এবং থ্রেশহোল্ড সামঞ্জস্য করতে রেট লিমিট হিট ট্র্যাক করুন। Nginx Log Analyzer এর মতো সরঞ্জামগুলি 429 প্রতিক্রিয়া বিশ্লেষণ করতে এবং অপব্যবহারকারী IP সনাক্ত করতে সহায়তা করতে পারে।
- সীমা যোগাযোগ করুন: আপনার API ডক্সে রেট সীমা নথিভুক্ত করুন এবং
X-RateLimit-Limit,X-RateLimit-Remainingএর মতো হেডার অন্তর্ভুক্ত করুন।
সাধারণ জিজ্ঞাসা
রেট লিমিটিং এবং থ্রটলিংয়ের মধ্যে পার্থক্য কী?
রেট লিমিটিং একটি থ্রেশহোল্ডের বাইরে অনুরোধ ব্লক করে, যখন থ্রটলিং সেগুলিকে ধীর করে (যেমন, সারিবদ্ধ বা বিলম্বিত করে)। রেট লিমিটিং বাইনারি; থ্রটলিং ধীরে ধীরে।
আমি কোন রেট লিমিটিং অ্যালগরিদম ব্যবহার করা উচিত?
বেশিরভাগ API-এর জন্য, টোকেন বাকেট একটি ভাল ভারসাম্য দেয়: এটি বার্স্টের অনুমতি দেয় তবে একটি গড় হার প্রয়োগ করে। যদি আপনার কঠোর মসৃণকরণ প্রয়োজন হয়, লিকি বাকেট ব্যবহার করুন। সরলতার জন্য, ফিক্সড উইন্ডো কম-ট্রাফিক API-এর জন্য কাজ করে।
প্রমাণিত বনাম বেনামী ব্যবহারকারীদের জন্য আমি কীভাবে রেট লিমিটিং পরিচালনা করব?
বেনামী ব্যবহারকারীদের (যেমন, IP দ্বারা) কঠোর সীমা প্রয়োগ করুন এবং প্রমাণিত ব্যবহারকারীদের (যেমন, API কী দ্বারা) আরও উদার সীমা প্রয়োগ করুন। আপনি সাবস্ক্রিপশন পরিকল্পনার উপর ভিত্তি করে স্তরযুক্ত সীমাও প্রয়োগ করতে পারেন।
আপনার API ট্রাফিক বিশ্লেষণ করতে প্রস্তুত? লগ পার্স করতে, রেট লিমিট লঙ্ঘন সনাক্ত করতে এবং আপনার থ্রেশহোল্ড অপ্টিমাইজ করতে আমাদের Nginx Log Analyzer ব্যবহার করুন।