|
محدودسازی نرخ (rate limiting) سازوکار مهمی برای کنترل مصرف منابع و حفظ کیفیت سرویس است. Go با گوروتینها، کانالها و تیکرها به شکلی زیبا از محدودسازی نرخ پشتیبانی میکند. |
|
![]()
|
|
|
|
|
|
|
اول محدودسازی نرخ ساده را میبینیم. فرض کنید میخواهیم رسیدگی به درخواستهای ورودی را محدود کنیم. این درخواستها را از کانالی به همین نام سرویس میدهیم. |
|
|
کانال |
|
|
با مسدود شدن روی دریافت از کانال |
|
|
ممکن است بخواهیم در طرح محدودسازی نرخ، اجازهٔ
رگبارهای کوتاهی از درخواستها (burst) را بدهیم و در
عین حال محدودیت نرخ کلی حفظ شود. این کار را میتوان
با بافردار کردن کانال limiter انجام داد. کانال
|
|
|
کانال را پر میکنیم تا رگبار مجاز را نشان دهد. |
|
|
هر ۲۰۰ میلیثانیه سعی میکنیم یک مقدار جدید به
|
|
|
حالا ۵ درخواست ورودی دیگر را شبیهسازی میکنیم. ۳
درخواست اول از قابلیت رگبارِ |
|
|
با اجرای برنامه میبینیم که همانطور که میخواستیم، به دستهٔ اول درخواستها هر ~۲۰۰ میلیثانیه یک بار رسیدگی میشود. |
|
|
در دستهٔ دوم درخواستها، به لطف محدودسازی نرخِ رگبارپذیر، به ۳ درخواست اول فوراً رسیدگی میشود و سپس ۲ درخواست باقیمانده هر کدام با ~۲۰۰ms تأخیر. |
|
مثال بعدی: شمارندههای اتمیک.