🎯 الگوریتم Token Bucket
🚦 چرا Rate Limiting مهم است؟
هر API یا سیستم، محدودیتهایی دارد.
اگر هیچ کنترلی نباشد، ممکن است یک کاربر با ارسال درخواستهای بیش از حد، سرور را از کار بیندازد.
✅ Rate Limiting
این مشکل را حل میکند. با کنترل تعداد درخواستهایی که در بازهی زمانی مشخص اجازهی عبور دارند.
الگوریتمهای متعددی برای این کار وجود دارند:
📍 Fixed Window
📍 Sliding Window
📍 Leaky Bucket
📍 Token Bucket
در میان آنها، Token Bucket یکی از پرکاربردترینهاست،
چون تعادل خوبی بین کنترل پایدار ترافیک و امکان ارسال «Burst»های کوتاه از درخواستها ایجاد میکند.
💡 Token Bucket چیست؟
فرض کنید یک سطل (bucket) دارید که داخل آن توکنها ریخته میشوند:
🪙 توکنها با نرخ ثابتی اضافه میشوند (مثلاً ۵ توکن در هر ثانیه)
هر درخواست برای عبور، باید یک توکن مصرف کند
اگر توکن در دسترس باشد → ✅ درخواست مجاز است
اگر سطل خالی باشد → ❌ درخواست رد (یا معلق) میشود
سطل ظرفیت محدودی دارد، پس تعداد توکنها نمیتواند بینهایت زیاد شود
🔁 نتیجه؟
این روش اجازه میدهد سیستم برای مدت کوتاهی درخواستهای بیشتری بپذیرد (burst)،
اما در بازهی بلندمدت، نرخ کلی همچنان کنترلشده باقی بماند.
🧮 فرمول ریاضی پشت Token Bucket
🪣 C = ظرفیت سطل
⚡️ R = نرخ پر شدن (تعداد توکن در هر ثانیه)
⏱️ T = مدتزمان سپریشده از آخرین پر شدن
در هر لحظه، تعداد توکنها برابر است با:
tokens = min(C, tokens + R * T)
وقتی درخواستی وارد میشود:
if tokens > 0 → allow and tokens -= 1
else → reject
📊 مثال اجرا
• ظرفیت سطل = 10
• نرخ پر شدن = 1 توکن در ثانیه
🕒 زمانبندی رخدادها:
• در زمان 0s → سطل پر است (10 توکن)
• کاربر 5 درخواست فوری میفرستد → 5 توکن باقی میماند
• پس از 5 ثانیه → 5 توکن جدید اضافه میشود → سطل دوباره پر (10 توکن)
• کاربر 15 درخواست میفرستد → فقط 10 درخواست مجاز، 5 درخواست رد میشوند
الگوریتم Token Bucket اجازهی ارسال ناگهانی درخواستها (burst) را تا سقف ظرفیت سطل میدهد،
اما در بلندمدت، نرخ کلی ارسال درخواستها را محدود نگه میدارد.