এই ব্যাপক গাইডে, আপনি Redis এবং Lua স্ক্রিপ্টিং ব্যবহার করে একটি ডিস্ট্রিবিউটেড রেট লিমিটার বিল্ড করবেন হাই-ট্রাফিক এনভায়রনমেন্টে ইউজার রিকোয়েস্ট কন্ট্রোল করার জন্য।
রেট লিমিটিং যেকোনো সিস্টেমে অত্যন্ত গুরুত্বপূর্ণ যাতে এবিউজ প্রিভেন্ট করা যায়, ট্রাফিক ম্যানেজ করা যায়, এবং আপনার রিসোর্সগুলো রক্ষা করা যায়। Redis এবং Lua-এর ক্ষমতা ব্যবহার করে, আপনি একটি দক্ষ, স্কেলেবল রেট লিমিটিং সিস্টেম বিল্ড করবেন যা বড় পরিমাণ রিকোয়েস্ট হ্যান্ডেল করতে পারে আপনার ব্যাকএন্ড সার্ভিসগুলো সेफ রাখতে।
আমরা একটি ইন্টারেক্টিভ ডেমোও অন্তর্ভুক্ত করব যেখানে ইউজাররা ট্রাফিক সিমুলেট করতে পারবেন, রেট লিমিট إنফোর্স হচ্ছে কিনা ব'Empireレコード, এবং ব্লক করা রিকোয়েস্টের লগ দেখতে পারবেন।
আপনি কী শিখবেন
Redis ব্যবহার করে রেট লিমিটিং সিস্টেম কীভাবে বিল্ড করতে হয়।
Redis-এ Lua স্ক্রিপ্ট কীভাবে ব্যবহার করতে হয় اتমিক অপারেশনের জন্য।
রেডিস ডেটা স্ট্রাকচার বোঝা ইফিশিয়েন্ট রিকোয়েস্ট ট্র্যাকিং-এর জন্য।
ডিস্ট্রিবিউটেড সিস্টেমে হাই ট্রাফিক হ্যান্ডেল করার টেকনিক।
Docker ব্যবহার করে ডিস্ট্রিবিউটেড রেট লিমিটার সিমুলেট এবং স্কেল করা।
পূর্বশর্ত
শুরু করার আগে, নিচের موارد ইনস্টলড আছে কিনা নিশ্চিত করুন:
Node.js (v14 বা উচ্চতর)
Redis
Docker (ডিস্ট্রিবিউটেড এনভায়রনমেন্ট সিমুলেট করার জন্য)
Node.js, Redis, এবং Lua স্ক্রিপ্টিং-এর বেসিক বোঝাপড়া।
সূচিপত্র
আপনি কী শিখবেন
পূর্বশর্ত
প্রজেক্ট ওভারভিউ
স্টেপ ১: প্রজেক্ট সেট আপ করা
স্টেপ ২: Redis সেট আপ করা
স্টেপ ৩: Redis এবং Lua দিয়ে রেট লিমিটার ইমপ্লিমেন্ট করা
স্টেপ ৪: Node.js API সার্ভার তৈরি করা
স্টেপ ৫: রেট লিমিটার টেস্ট করা
স্টেপ ৬: রেট লিমিটিং মেট্রিক্স ভিজ্যুয়ালাইজ করা
স্টেপ ৭: Docker-এ ডিপ্লয় করা
উপসংহার: আপনি কী শিখলেন
প্রজেক্ট ওভারভিউ
এই টিউটোরিয়ালে, আপনি:
Redis এবং Lua ব্যবহার করে একটি রেট লিমিটার বিল্ড করবেন রিকোয়েস্ট কোটা ইনফোর্স করার জন্য।
Lua স্ক্রিপ্ট ব্যবহার করবেন اتমিক অপারেশন নিশ্চিত করার জন্য, রেস কন্ডিশন এড়াতে।
টোকেন বাকেট অ্যালগরিদম ইমপ্লিমেন্ট করবেন রেট লিমিটিং-এর জন্য।
একটি ইন্টারেক্টিভ ডেমো তৈরি করবেন হাই ট্রাফিক সিমুলেট করার জন্য এবং রেট লিমিটিং একশনে দেখার জন্য।
সিস্টেম আর্কিটেকচার
আপনি সিস্টেমটি নিচের কম্পোনেন্টগুলো দিয়ে বিল্ড করবেন:
API সার্ভার: ইনকামিং ইউজার রিকোয়েস্ট হ্যান্ডেল করে।
Redis: রিকোয়েস্ট ডেটা স্টোর করে এবং রেট লিমিট ইনফোর্স করে।
Lua স্ক্রিপ্টস: রেট লিমিটিং-এর জন্য Redis-এ اتমিক আপডেট নিশ্চিত করে।
Docker: মাল্টিপল ইন্সট্যান্স দিয়ে একটি ডিস্ট্রিবিউটেড এনভায়রনমেন্ট সিমুলেট করে।
স্টেপ ১: প্রজেক্ট সেট আপ করা
Node.js প্রজেক্ট সেট আপ করি:
mkdir distributed-rate-limiter
cd distributed-rate-limiter
npm init -y
এরপর, প্রয়োজনীয় ডিপেন্ডেন্সি ইনস্টল করুন:
npm install express redis dotenv
express: একটি লাইটওয়েট ওয়েব সার্ভার ফ্রেমওয়ার্ক।
redis: Redis-এ ইন্টারঅ্যাক্ট করার জন্য।
dotenv: এনভায়রনমেন্ট ভেরিয়েবল ম্যানেজ করার জন্য।
নিচের কন্টেন্টের সাথে একটি .env ফাইল তৈরি করুন:
REDIS_HOST=localhost
REDIS_PORT=6379
PORT=3000
RATE_LIMIT=5
TIME_WINDOW=60
এই ভেরিয়েবলগুলো Redis হোস্ট, পোর্ট, রেট লিমিট (অনুমোদিত রিকোয়েস্টের সংখ্যা), এবং টাইম উইন্ডো (সেকেন্ডে) ডিফাইন করে।
স্টেপ ২: Redis সেট আপ করা
কোডে যাওয়ার আগে, নিশ্চিত করুন আপনার সিস্টেমে Redis ইনস্টলড এবং রানিং আছে। আপনার যদি Redis ইনস্টলড না থাকে, তবে Docker দিয়ে দ্রুত সেট আপ করতে পারেন:
docker run -p 6379:6379 --name redis-rate-limiter -d redis
স্টেপ ৩: Redis এবং Lua দিয়ে রেট লিমিটার ইমপ্লিমেন্ট করা
দক্ষতার সাথে রেট লিমিটিং হ্যান্ডেল করার জন্য, আমরা একটি টোকেন বাকেট অ্যালগরিদম ব্যবহার করব। এই অ্যালগরিদমে:
প্রতিটি ইউজারের একটি "বাকেট" থাকে টোকেনের।
প্রতিটি রিকোয়েস্ট একটি টোকেন কনসাম করে।
টোকেনগুলো একটি সেট রেটে পিরিয়ডিক্যালি রিফিল হয়।
অটোমিসিটি নিশ্চিত করতে এবং রেস কন্ডিশন এড়াতে, আমরা Redis-এ Lua স্ক্রিপ্টিং ব্যবহার করব। Redis-এ Lua স্ক্রিপ্ট اتমিক্যালি এক্সিকিউট হয়, অর্থাৎ রানিং অবস্থায় সেগুলো অন্য অপারেশন দ্বারা ইন্টাররপ্ট করা যায় না।
রেট লিমিটিং-এর জন্য Lua স্ক্রিপ্ট তৈরি করা
rate_limiter.lua নামে একটি ফাইল তৈরি করুন:
local key = KEYS[1]
local limit = tonumber(ARGV[1])
local window = tonumber(ARGV[2])
local current = redis.call("get", key)
if current and tonumber(current) >= limit then
return 0
else
if current then
redis.call("incr", key)
else
redis.call("set", key, 1, "EX", window)
end
return 1
end
ইনপুটস:
KEYS[1]: ইউজারের রিকোয়েস্ট কাউন্ট রিপ্রেজেন্ট করা Redis কী।
ARGV[1]: রেট লিমিট (ম্যাক্সিমাম অনুমোদিত রিকোয়েস্টের সংখ্যা)।
ARGV[2]: রেট লিমিটের জন্য টাইম উইন্ডো (সেকেন্ডে)।
লজিক:
যদি ইউজার রেট লিমিট পৌঁছে যায়,
0রিটার্ন করুন (রিকোয়েস্ট ব্লক করা)۔যদি ইউজার লিমিটের মধ্যে থাকে, তাদের রিকোয়েস্ট কাউন্ট ইনক্রিমেন্ট করুন বা প্রথম রিকোয়েস্ট হলে এক্সপায়ারেশন সহ নতুন কাউন্ট সেট করুন।
1 রিটার্ন করুন (রিকোয়েস্ট অনুমোদিত)।
স্টেপ ৪: Node.js API সার্ভার তৈরি করা
server.js নামে একটি ফাইল তৈরি করুন:
require('dotenv').config();
const express = require('express');
const redis = require('redis');
const fs = require('fs');
const path = require('path');
const app = express();
const client = redis.createClient({ host: process.env.REDIS_HOST, port: process.env.REDIS_PORT });
const rateLimitScript = fs.readFileSync(path.join(__dirname, 'rate_limiter.lua'), 'utf8');
const RATE_LIMIT = parseInt(process.env.RATE_LIMIT);
const TIME_WINDOW = parseInt(process.env.TIME_WINDOW);
// রেট লিমিটিং-এর জন্য মিডলওয়্যার
async function rateLimiter(req, res, next) {
const ip = req.ip;
try {
const allowed = await client.eval(rateLimitScript, 1, ip, RATE_LIMIT, TIME_WINDOW);
if (allowed === 1) {
next();
} else {
res.status(429).json({ message: 'Too many requests. Please try again later.' });
}
} catch (err) {
console.error('Error in rate limiter:', err);
res.status(500).json({ message: 'Internal server error' });
}
}
app.use(rateLimiter);
app.get('/', (req, res) => {
res.send('Welcome to the Rate Limited API!');
});
const PORT = process.env.PORT;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
রেট লিমিটার মিডলওয়্যার:
ক্লায়েন্টের IP অ্যাড্রেস রিট্রিভ করে এবং Lua স্ক্রিপ্ট ব্যবহার করে চেক করে যে সে রেট লিমিটের মধ্যে আছে কিনা।
যদি ইউজার লিমিট এক্সিড করে, একটি
429রেসপন্স পাঠানো হয়।
API এন্ডপয়েন্ট:
- রুট এন্ডপয়েন্ট রেট-লিমিটেড, তাই ইউজাররা নির্দিষ্ট উইন্ডোর মধ্যে লিমিটেড সংখ্যক বারই এক্সেস করতে পারবে।
স্টেপ ৫: রেট লিমিটার টেস্ট করা
Redis শুরু করুন:
docker start redis-rate-limiterNode.js সার্ভার চালান:
node server.jsরিকোয়েস্ট সিমুলেট করুন:
curlবা Postman ব্যবহার করে রেট লিমিটার টেস্ট করুন:curl https://localhost:3000দ্রুত একাধিক রিকোয়েস্ট পাঠিয়ে রেট লিমিটিং একশনে দেখুন।
স্টেপ ৬: রেট লিমিটিং মেট্রিক্স ভিজ্যুয়ালাইজ করা
রেট লিমিটিং মেট্রিক্স যেমন ক্যাশ হিট এবং ব্লক করা রিকোয়েস্ট মনিটর করার জন্য, আমরা server.js-এ মিডলওয়্যারের লগিং যোগ করব:
async function rateLimiter(req, res, next) {
const ip = req.ip;
try {
const allowed = await client.eval(rateLimitScript, 1, ip, RATE_LIMIT, TIME_WINDOW);
if (allowed === 1) {
console.log(`Allowed request from ${ip}`);
next();
} else {
console.log(`Blocked request from ${ip}`);
res.status(429).json({ message: 'Too many requests. Please try again later.' });
}
} catch (err) {
console.error('Error in rate limiter:', err);
res.status(500).json({ message: 'Internal server error' });
}
}
স্টেপ ৭: Docker-এ ডিপ্লয় করা
আপ্লিকেশনটিকে কন্টেইনারাইজ করি যাতে এটি একটি ডিস্ট্রিবিউটেড এনভায়রনমেন্টে চলে।
একটি Dockerfile তৈরি করুন:
FROM node:14
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3000
CMD ["node", "server.js"]
Docker কন্টেইনার বিল্ড এবং রান করুন:
docker build -t rate-limiter .
docker run -p 3000:3000 rate-limiter
এখন আপনি রেট লিমিটারকে স্কেল করতে পারেন মাল্টিপল ইন্সট্যান্স রান করে।
উপসংহার: আপনি কী শিখলেন
অভিনন্দন! আপনি সফলভাবে একটি ডিস্ট্রিবিউটেড রেট লিমিটার বিল্ড করেছেন Redis এবং Lua স্ক্রিপ্ট ব্যবহার করে। এই টিউটোরিয়ালে, আপনি শিখেছেন কীভাবে:
ডিস্ট্রিবিউটেড সিস্টেমে ইউজার রিকোয়েস্ট কন্ট্রোল করার জন্য রেট লিমিটিং ইমপ্লিমেন্ট করতে হয়।
Redis-এ Lua স্ক্রিপ্ট ব্যবহার করতে হয় اتমিক অপারেশনের জন্য।
টোকেন বাকেট অ্যালগরिदম অ্যাপ্লাই করতে হয় রিকোয়েস্ট কোটা ম্যানেজ করার জন্য।
রেট লিমিটিং মেট্রিক্স মনিটর করতে হয় পারফরম্যান্স অপ্টিমাইজ করার জন্য।
Docker ব্যবহার করতে হয় একটি স্কেলেবল ডিস্ট্রিবিউটেড এনভায়রনমেন্ট সিমুলেট করার জন্য।
নেক্সট স্টেপস:
ইউজার আইডি দিয়ে রেট লিমিটিং যোগ করুন: সিস্টেমকে এক্সটেন্ড করুন প্রতি ইউজার রেট লিমিট সাপোর্ট করার জন্য।
Nginx-এ ইন্টিগ্রেট করুন: Nginx ব্যবহার করুন রিভার্স প্রক্সি হিসেবে Redis-ব্যাকড রেট লিমিটিংসহ।
Kubernetes-এ ডিপ্লয় করুন: Kubernetes ব্যবহার করে আপনার রেট লিমিটার স্কেল করুন হাই অভেইলেবিলিটির জন্য।
হ্যাপি কোডিং!
নিঃশুল্ক কোডিং শিখুন। freeCodeCamp-এর ওপেন সোর্স কারিকুলাম ৪০,০০০-এর বেশি মানুষকে ডেভেলপার হিসেবে জব পেতে সাহায্য করেছে। শুরু করুন