📌مزایا و معایب
✅️مزایا:
🔹️ امکان ارسال ناگهانی چند درخواست (burst) را فراهم میکند، ولی میانگین نرخ را محدود نگه میدارد.
🔹️ باعث شکلدهی روانتر به ترافیک میشود (smooth traffic shaping).
🔹️ بهطور گسترده در شبکهها و APIها استفاده میشود.
❌️معایب:
🔹️کمی پیچیدهتر از روش Fixed Window Counter است.
🔹️در سیستمهای توزیعشده، نیاز به همگامسازی دقیق دارد.
مثال کد :
using System;
public class TokenBucket
{
private readonly int _capacity; // حداکثر تعداد توکنها
private readonly double _refillRate; // نرخ پر شدن (توکن در هر ثانیه)
private double _tokens; // تعداد توکنهای فعلی
private DateTime _lastRefill; // آخرین زمان پر شدن
public TokenBucket(int capacity, double refillRate)
{
_capacity = capacity;
_refillRate = refillRate;
_tokens = capacity;
_lastRefill = DateTime.UtcNow;
}
private void Refill()
{
var now = DateTime.UtcNow;
var elapsedSeconds = (now - _lastRefill).TotalSeconds;
var addedTokens = elapsedSeconds * _refillRate;
if (addedTokens >= 1)
{
_tokens = Math.Min(_capacity, _tokens + addedTokens);
_lastRefill = now;
}
}
public bool AllowRequest()
{
Refill();
if (_tokens >= 1)
{
_tokens -= 1;
return true;
}
return false;
}
}
public class Program
{
public static void Main()
{
var bucket = new TokenBucket(10, 1); // 10 توکن، پر شدن 1 توکن در هر ثانیه
// شبیهسازی درخواستها در بازههای 200 میلیثانیه
var timer = new System.Timers.Timer(200);
timer.Elapsed += (s, e) =>
{
Console.WriteLine($"Request allowed? {bucket.AllowRequest()}");
};
timer.Start();
Console.WriteLine("Press any key to stop...");
Console.ReadKey();
}
}
🚀 کاربردهای واقعی Token Bucket Algorithm
🔸 دروازههای API مثل AWS API Gateway، Nginx، Envoy از نسخههای مختلف این الگوریتم برای کنترل نرخ درخواستها استفاده میکنند.
🔸 روترهای شبکه (Network Routers) برای Traffic Shaping یا همون تنظیم و کنترل جریان ترافیک به کار میره تا از شلوغی شبکه جلوگیری بشه.
🔸 صفهای پیام (Message Queues) برای جلوگیری از بار بیشازحد روی مصرفکنندهها (Consumers) استفاده میشه.
⚖️ مقایسه با سایر روشها
🪟 Fixed Window Counter →
سادهتره، ولی در مرز بازهها ممکنه رفتار غیرمنصفانه نشون بده و اجازهی Burst زیاد بده.
💧 Leaky Bucket →
نرخ خروج داده رو ثابت نگه میداره، اما انعطافپذیری کمتری برای Burst داره.
🎯 Token Bucket →
ترکیبیه از نرخ ثابت و پشتیبانی از Burst کوتاهمدت — یعنی بهترین تعادل برای کنترل ترافیک در APIها.
🏁 نتیجهگیری
🔹 الگوریتم Token Bucket یکی از کاربردیترین و مؤثرترین روشها برای پیادهسازی Rate Limiting در سیستمهاست.
🔹 پیادهسازی اون سادهه، از ترافیک ناگهانی پشتیبانی میکنه و استفادهی منصفانه از منابع رو تضمین میکنه.
🔹 اگر در حال ساخت API یا سیستم توزیعشده هستی،
حتماً این الگوریتم باید یکی از گزینههای اصلی تو باشه.
🔖هشتگها:
#TokenBucket #RateLimiting #SystemDesign #API #Networking