এই ব্যাপক নির্দেশিকাটিতে, আপনি একটি উচ্চ-ট্রাফিক পরিবেশে ব্যবহারকারীর অনুরোধগুলি নিয়ন্ত্রণ করতে Redis এবং Lua স্ক্রিপ্টিং ব্যবহার করে একটি বিতরণকৃত হার লিমিটার তৈরি করবেন৷
অপব্যবহার রোধ করতে, ট্র্যাফিক পরিচালনা করতে এবং আপনার সংস্থানগুলিকে সুরক্ষিত করতে যে কোনও সিস্টেমে হার সীমাবদ্ধ করা অত্যন্ত গুরুত্বপূর্ণ। Redis এবং Lua ব্যবহার করে, আপনি একটি দক্ষ, মাপযোগ্য হার সীমিত করার সিস্টেম তৈরি করবেন যা আপনার ব্যাকএন্ড পরিষেবাগুলিকে সুরক্ষিত রাখার সময় বিপুল সংখ্যক অনুরোধগুলি পরিচালনা করতে পারে৷
আমরা একটি ইন্টারেক্টিভ ডেমোও অন্তর্ভুক্ত করব যেখানে ব্যবহারকারীরা ট্র্যাফিক অনুকরণ করতে পারে, রেট সীমা কার্যকর করা হচ্ছে এবং অবরুদ্ধ অনুরোধগুলির লগ দেখতে পারে৷
আপনি যা শিখবেন
-
কিভাবে Redis ব্যবহার করে একটি রেট লিমিটিং সিস্টেম তৈরি করবেন।
-
পারমাণবিক ক্রিয়াকলাপ অর্জনের জন্য রেডিসের সাথে লুয়া স্ক্রিপ্টগুলি কীভাবে ব্যবহার করবেন।
-
দক্ষ অনুরোধ ট্র্যাকিংয়ের জন্য রেডিস ডেটা স্ট্রাকচার বোঝা।
-
একটি বিতরণ সিস্টেমে উচ্চ ট্রাফিক পরিচালনার জন্য কৌশল।
-
ডিস্ট্রিবিউটেড রেট লিমিটার সিমুলেট এবং স্কেল করার জন্য ডকার ব্যবহার করে।
পূর্বশর্ত
শুরু করার আগে, নিশ্চিত করুন যে আপনি নিম্নলিখিত ইনস্টল করেছেন:
-
Node.js (v14 বা উচ্চতর)
-
রেডিস
-
ডকার (একটি বিতরণ করা পরিবেশের অনুকরণের জন্য)
-
Node.js, Redis, এবং Lua স্ক্রিপ্টিংয়ের প্রাথমিক বোঝাপড়া।
সূচিপত্র
-
আপনি কি শিখবেন
-
পূর্বশর্ত
-
প্রকল্প ওভারভিউ
-
ধাপ 1:কিভাবে প্রজেক্ট সেট আপ করবেন
-
ধাপ 2:কিভাবে রেডিস সেট আপ করবেন
-
ধাপ 3:রেডিস এবং লুয়া
দিয়ে রেট লিমিটার কিভাবে প্রয়োগ করবেন -
ধাপ 4:কিভাবে Node.js API সার্ভার তৈরি করবেন
-
ধাপ 5:রেট লিমিটার কিভাবে পরীক্ষা করবেন
-
ধাপ 6:রেট লিমিটিং মেট্রিক্স কিভাবে ভিজ্যুয়ালাইজ করবেন
-
ধাপ 7:ডকারের সাথে কীভাবে স্থাপন করবেন
-
উপসংহার:আপনি যা শিখেছেন
প্রকল্প ওভারভিউ
এই টিউটোরিয়ালে, আপনি করবেন:
-
অনুরোধ কোটা প্রয়োগ করতে Redis এবং Lua ব্যবহার করে একটি রেট লিমিটার তৈরি করুন।
-
পারমাণবিক ক্রিয়াকলাপ নিশ্চিত করতে লুয়া স্ক্রিপ্ট ব্যবহার করুন, জাতি পরিস্থিতি এড়িয়ে চলুন।
-
হার সীমিত করার জন্য একটি টোকেন বাকেট অ্যালগরিদম প্রয়োগ করুন।
-
একটি ইন্টারেক্টিভ ডেমো তৈরি করুন যাতে উচ্চ ট্র্যাফিকের অনুকরণ করা যায় এবং কর্মে সীমিত হারকে কল্পনা করা যায়৷
সিস্টেম আর্কিটেকচার
আপনি নিম্নলিখিত উপাদানগুলির সাথে সিস্টেমটি তৈরি করবেন:
-
API সার্ভার :আগত ব্যবহারকারীর অনুরোধগুলি পরিচালনা করে৷
-
রিডিস :স্টোর করে ডেটা অনুরোধ করে এবং রেট সীমা বলবৎ করে।
-
লুয়া স্ক্রিপ্ট :হার সীমিত করার জন্য Redis-এ পারমাণবিক আপডেট নিশ্চিত করে।
-
ডকার :একাধিক দৃষ্টান্ত সহ একটি বিতরণ করা পরিবেশ অনুকরণ করে৷
ধাপ 1:কিভাবে প্রজেক্ট সেট আপ করবেন
আমাদের Node.js প্রজেক্ট সেট আপ করে শুরু করা যাক:
mkdir distributed-rate-limiter
cd distributed-rate-limiter
npm init -y
এরপরে, প্রয়োজনীয় নির্ভরতাগুলি ইনস্টল করুন:
npm install express redis dotenv
-
এক্সপ্রেস :একটি লাইটওয়েট ওয়েব সার্ভার ফ্রেমওয়ার্ক।
-
পুনরায় করা :রেডিসের সাথে ইন্টারঅ্যাক্ট করার জন্য।
-
dotenv :পরিবেশ ভেরিয়েবল পরিচালনার জন্য।
একটি .env তৈরি করুন নিম্নলিখিত বিষয়বস্তু সহ ফাইল:
REDIS_HOST=localhost
REDIS_PORT=6379
PORT=3000
RATE_LIMIT=5
TIME_WINDOW=60
এই ভেরিয়েবলগুলি Redis হোস্ট, পোর্ট, হার সীমা (অনুমোদিত অনুরোধের সংখ্যা), এবং সময় উইন্ডো (সেকেন্ডে) সংজ্ঞায়িত করে।
ধাপ 2:কিভাবে Redis সেট আপ করবেন
আমরা কোডে ডুব দেওয়ার আগে, নিশ্চিত করুন যে Redis আপনার সিস্টেমে ইনস্টল এবং চলছে। আপনার যদি রেডিস ইনস্টল না থাকে, আপনি দ্রুত এটি সেট আপ করতে ডকার ব্যবহার করতে পারেন:
docker run -p 6379:6379 --name redis-rate-limiter -d redis
ধাপ 3:Redis এবং Lua এর সাথে রেট লিমিটার কিভাবে প্রয়োগ করবেন
দক্ষতার সাথে হার সীমিত করার জন্য, আমরা একটি টোকেন বাকেট অ্যালগরিদম ব্যবহার করব। এই অ্যালগরিদমে:
-
প্রতিটি ব্যবহারকারীর একটি "বালতি" টোকেন রয়েছে৷
৷ -
প্রতিটি অনুরোধ একটি টোকেন গ্রহণ করে৷
৷ -
টোকেন নির্দিষ্ট হারে পর্যায়ক্রমে রিফিল করে।
পারমাণবিকতা নিশ্চিত করতে এবং রেসের অবস্থা এড়াতে, আমরা Redis এর সাথে Lua স্ক্রিপ্টিং ব্যবহার করব। Redis-এ লুয়া স্ক্রিপ্টগুলি পারমাণবিকভাবে চালায়, যার অর্থ চালানোর সময় অন্যান্য ক্রিয়াকলাপগুলির দ্বারা সেগুলিকে বাধা দেওয়া যায় না৷
দর সীমিত করার জন্য কীভাবে একটি লুয়া স্ক্রিপ্ট তৈরি করবেন
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
-
ইনপুট :
-
কী[1] :Redis কী ব্যবহারকারীর অনুরোধের সংখ্যার প্রতিনিধিত্ব করে।
-
ARGV[1] :হারের সীমা (অনুমোদিত অনুরোধের সর্বাধিক সংখ্যা)।
-
ARGV[2] :হারের সীমার জন্য সময় উইন্ডো (সেকেন্ডে)।
-
-
যুক্তি :
-
ব্যবহারকারী যদি হারের সীমায় পৌঁছে যায়, তাহলে
0ফেরত দিন (অনুরোধ ব্লক করা হয়েছে)। -
ব্যবহারকারী সীমার মধ্যে থাকলে, তাদের অনুরোধের সংখ্যা বৃদ্ধি করুন বা মেয়াদ শেষ হওয়ার সাথে একটি নতুন গণনা সেট করুন যদি এটি প্রথম অনুরোধ হয়।
-
রিটার্ন 1 (অনুরোধ অনুমোদিত)।
-
ধাপ 4:কিভাবে 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);
// Middleware for rate limiting
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}`);
});
-
রেট লিমিটার মিডলওয়্যার :
-
ক্লায়েন্টের আইপি ঠিকানা পুনরুদ্ধার করে এবং তারা লুয়া স্ক্রিপ্ট ব্যবহার করে রেট সীমার মধ্যে আছে কিনা তা পরীক্ষা করে।
-
ব্যবহারকারী সীমা অতিক্রম করলে, একটি
429প্রতিক্রিয়া পাঠানো হয়েছে৷
-
-
API এন্ডপয়েন্ট :
- রুট এন্ডপয়েন্টটি হার-সীমিত, তাই ব্যবহারকারীরা নির্দিষ্ট উইন্ডোর মধ্যে সীমিত সংখ্যক বার এটি অ্যাক্সেস করতে পারে।
ধাপ 5:রেট লিমিটার কিভাবে পরীক্ষা করবেন
-
Redis শুরু করুন :
docker start redis-rate-limiter -
Node.js সার্ভার চালান :
node server.js -
অনুরোধ অনুকরণ করুন :
-
curlব্যবহার করুন অথবা পোস্টম্যান রেট লিমিটার পরীক্ষা করতে:curl http://localhost:3000 -
কর্মে হার সীমিত দেখতে দ্রুত একাধিক অনুরোধ পাঠান।
-
ধাপ 6:হার সীমিত মেট্রিক্স কিভাবে ভিজ্যুয়ালাইজ করবেন
ক্যাশে হিট এবং অবরুদ্ধ অনুরোধের মত হার সীমিত মেট্রিক নিরীক্ষণ করতে, আমরা 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' });
}
}
পদক্ষেপ 7:ডকারের সাথে কীভাবে স্থাপন করবেন
একটি বিতরণ করা পরিবেশে চালানোর জন্য অ্যাপ্লিকেশনটিকে কন্টেইনারাইজ করা যাক।
একটি Dockerfile তৈরি করুন :
FROM node:14
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3000
CMD ["node", "server.js"]
ডকার কন্টেইনার তৈরি করুন এবং চালান:
docker build -t rate-limiter .
docker run -p 3000:3000 rate-limiter
এখন আপনি একাধিক দৃষ্টান্ত চালিয়ে রেট লিমিটার স্কেল করতে পারেন।
উপসংহার:আপনি যা শিখেছেন
অভিনন্দন! আপনি Redis এবং Lua স্ক্রিপ্ট ব্যবহার করে সফলভাবে একটি বিতরণকৃত হার লিমিটার তৈরি করেছেন। এই টিউটোরিয়াল জুড়ে, আপনি শিখেছেন কিভাবে:
-
ডিস্ট্রিবিউটেড সিস্টেমে ব্যবহারকারীর অনুরোধ নিয়ন্ত্রণে সীমিত হার প্রয়োগ করুন।
-
পারমাণবিক ক্রিয়াকলাপ সম্পাদন করতে Redis-এ Lua স্ক্রিপ্ট ব্যবহার করুন।
-
অনুরোধ কোটা পরিচালনা করতে একটি টোকেন বাকেট অ্যালগরিদম প্রয়োগ করুন৷
৷ -
কর্মক্ষমতা অপ্টিমাইজ করতে মেট্রিক্স সীমিত হার নিরীক্ষণ করুন।
-
একটি স্কেলযোগ্য বিতরণ পরিবেশ অনুকরণ করতে ডকার ব্যবহার করুন৷
পরবর্তী ধাপ:
-
ব্যবহারকারী আইডি দ্বারা হার সীমাবদ্ধতা যোগ করুন :ব্যবহারকারী প্রতি হার সীমা সমর্থন করার জন্য সিস্টেম প্রসারিত করুন৷
৷ -
Nginx এর সাথে একীভূত করুন :রেডিস-ব্যাকড রেট লিমিটিং সহ একটি বিপরীত প্রক্সি হিসাবে Nginx ব্যবহার করুন৷
-
কুবারনেটসের সাথে স্থাপন করুন :উচ্চ প্রাপ্যতার জন্য Kubernetes ব্যবহার করে আপনার রেট লিমিটার স্কেল করুন।
শুভ কোডিং!
বিনামূল্যে কোড শিখুন. freeCodeCamp-এর ওপেন সোর্স পাঠ্যক্রম 40,000-এরও বেশি লোককে ডেভেলপার হিসেবে চাকরি পেতে সাহায্য করেছে। শুরু করুন