প্রীতম প্রচন্ড উগান্ডা বিদ্বেষী। যে কোন পোস্টের কমেন্ট সেকশনে গিয়ে সে সমানে কমেন্ট করা শুরু করলো “উগান্ডার ধ্বংস চাই।” প্রথমে তাকে ফেসবুক থেকে ওয়ার্নিং দিলো। কিন্তু সে সেটা ইগনোর করে কমেন্ট করতেই থাকলো “উগান্ডার ধ্বংস চাই।” অতঃপর ফেসবুক তার থেকে কমেন্ট করার পারমিশন ছিনিয়ে নিলো। এখানে সে দমে থাকলো না। এবার সে নিয়মিত “উগান্ডার ধ্বংস চাই।” লিখে ১০/২০ খানা হ্যাশট্যাগ সহ নিজের ওয়ালের পাশাপাশি বিভিন্ন গ্রুপে পোস্ট করতে থাকলো। এবং ফেসবুক অবশেষে স্পামিং এর অপরাধে তার একাউন্ট ব্লক করে দিলো।
এই যে উপরের ঘটনা বললাম, এখানে যে আইডিয়াটি ব্যবহার করা হয়েছে সেটা হলো রেট লিমিটার ( Rate Limiter)। আমার আজকের এই পোস্ট এই রেট লিমিটার নিয়েই।
কোন নেটওয়ার্ক সিস্টেমে ক্লায়েন্ট বা সারভিস থেকে কতোগুলো ট্রাফিক আসবে তার রেট / সংখ্যা নিয়ন্ত্রণ করার জন্য Rate Limiter (রেট লিমিটার) ব্যবহার করা হয়ে থাকে। HTTP এর ক্ষেত্রে রেট লিমিটারের কাজ হলো একটা নির্দিষ্ট সময়ে ক্লায়েন্ট থেকে কতোগুলো রিকুয়েস্ট আমাদেরে এপিআই সারভার এক্সসেপ্ট করবে। নির্দিষ্ট সীমার বাইরের রিকুয়েস্টগুলো ব্লক করে দেওয়া হয়। উদাহরনস্বরূপ আমরা একটি সোস্যাল নেটওয়ার্ক সাইট কল্পনা করতে পারি, যেখানে লিমিট গুলো হলোঃ
- একজন ইউজার প্রতি মিনিটে ২ টির বেশি পোস্ট করতে পারবে না।
- একটি আইপি এড্রেস থেকে দিনে সর্বোচ্চ ৫ টি একাউন্ট তৈরী করা যাবে।
- একজন ইউজার প্রতি ১০ সেকেন্ডে ১টির বেশি কমেন্ট করতে পারবে না।
এখন আমাদের সিস্টেমে যদি কোন রেট লিমিটার বসানো থাকে তাহলে, একজন ইউজার মিনিটে ৩য় পোস্ট করতে গেলেই তাকে আর পোস্ট করতে দিবে না।
এখন প্রশ্ন হলো, রেট লিমিটারের সুবিধা কি? কেন ব্যবহার করবো? প্রথমত, Rate Limiter ডেনিয়াল অফ সারভিস (DoS) এটাকের সময় রিসোর্স স্টারভেশন করা থেকে বিরত রাখতে পারে। যখন, DDoS এটাক হয়, তখন যদি দেখা যায় নির্দিষ্ট লিমিটের বাইরে রিকুয়েস্ট আসছে, সে সময় সেই অতিরিক্ত রিকুয়েস্ট নিয়ে কাজই করবে না। রেট লিমিটারের আরেকটি সুবিধা হলো, সারভার ওভারলোড থেকে রক্ষা করে এবং লিমিটের ফলে অনেক সারভিস কম ব্যবহার হয় বিধায় রিসোর্সের জন্য খরচও কমে যায়।
বুঝলাম তো রেট লিমিটার ভালো জিনিস। তা এটা কোথায় ইম্প্লিমেন্ট করবো? ওয়েল, রেট লিমিটার আমরা ফ্রন্ট এন্ড ও ব্যকএন্ড দু যায়গাতেই ইম্প্লিমেন্ট করতে পারি। কিন্তু ফ্রন্ট এন্ড এ আসলে রেট লিমিটার বসানো সেরকম কার্যকর না, কারণ, আমাদের ক্লায়েন্টের উপর কোন নিয়ন্ত্রণ নেই।
তাহলে ব্যাকএন্ডেই আমরা এই রেট লিমিটার বসাতে পারি। এক্ষেত্রে আমরা আমাদের API Service এই লিমিট বসাতে পারি কিন্তুে এর চইতে ভালো যায়গা হলো আমাদের Client এবং API Service এর মাঝামাঝি একটি মিডলওয়্যার বসানো, যেখানে রেট লিমিটার থাকবে। এই রেট লিমিটার পাস করে গেলে API Service এ হিট করবে, অন্যথা HTTP Error Code 429 রিটার্ন করবে, যার মানে হলো “Too many requests.”
Rate limit করার জন্য বেশ কিছু অ্যালগোরিদম আছে। এর মধ্যে জনপ্রিয় কিছু অ্যালগোরিদম হলোঃ
- Token bucket
- Leaking bucket
- Fixed window counter
- Sliding window log
- Sliding window counter
এই রেট লিমিটার অ্যালগোরিদমগুলো সাধারণত প্রতিটি কন্ডিশন এর জন্য একটা করে কাউন্টার সেট করে, এবং নির্দিষ্ট সময় পরপর এই কাউন্টারগুলো রিসেট করে দেয়।
তাহলে আমরা যদি হাই লেভেলের একটা সিস্টেম ডিজাইন চিন্তা করি তাহলে তা অনেকটা এরকম হবেঃ
ক্লায়েন্ট -> রেট লিমিটার মিডলওয়্যার -> এপিআই সারভার
ক্লায়েন্ট থেকে রেট লিমিটার মিডলওয়্যারে রিকুয়েস্ট যাবে, এটা যদি এলাও করে তাহলে Api server এ কল যাবে অন্যথা 429 কোড রিটার্ন করবে।
এখন প্রশ্ন থাকে কাউন্টার রাখার জন্য আমরা কি কোন পারসিসটেন্ট ডাটাবেজ ব্যবহার করবো? অবশ্যই এটা না। কারন ডাটাবেজ থেকে রিড রাইট অপারেশন অনেক কস্টলি। এক্ষেত্রে আমরা ইন মেমোরি ক্যাশ যেমন রেডিস (Redis) ব্যবহার করতে পারি। রেডিসে খুব সহজেই আমরা ইউজারনেম বা আইপি এড্রেস এর বিপরীতে কাউন্টার ব্যবহার করতে পারবো। এবং এই কাউন্টারের অটো এক্সপায়ার টাইম বলে দিতে পারবো। ফলে নির্দিষ্ট সময় পর পর কাউন্টার ক্লিয়ার হয়ে যাবে।
Leave a Reply