تصور کن تو یک مهمونی  گرفتی و فقط به دوستان نزدیکت (Authenticated Users) اجازه ورود دادی. همه چیز امنه. اما یکی از دوستانت (بیاییم اسمش رو بذاریم "بابک") که خیلی هم آدم خوبیه، از شدت هیجان هر ۲ ثانیه یک بار میاد پیشت و میگه: "شام کی حاضر میشه؟ شام کی حاضر میشه؟..." بابک دزد نیست، مجوز حضور هم داره، ولی داره با حجم بالای درخواست‌ هاش اعصاب تو رو خرد میکنه و باعث میشه نتونی به بقیه مهمون‌ ها سرویس بدی.

توی دنیای API، این "بابک" میتونه یک اسکریپت باگ‌ دار باشه که اشتباهی توی حلقه افتاده، یا یک رقیب که میخواد با ارسال هزاران درخواست در ثانیه سرور تو رو از کار بندازه (DDOS). اینجاست که ما به Throttling (کنترل نرخ درخواست) نیاز داریم. توی این مقاله میخوایم یاد بگیریم چطور سرعت مجاز رو در اتوبانِ API تنظیم کنیم.

تفاوت Throttling با Permission

تفاوت Throttling با Permission

خیلی‌ها این دو تا رو با هم اشتباه میگیرن، پس بذار با همون مثال بانک روشن ‌ش کنیم:

۱. سطح دسترسی (Permission): نگهبان بانک چک میکنه که "آیا تو اجازه داری وارد گاو صندوق بشی؟" (آیا مجازی؟). ۲. کنترل نرخ (Throttling): رئیس بانک میگه "آقای مشتری عزیز، شما اجازه داری پول برداشت کنی، اما فقط ۳ بار در روز میتونی از دستگاه عابر بانک استفاده کنی، نه ۱۰۰۰ بار!"

در واقع:

  • Permission میگه: "آیا میتونی این کار رو انجام بدی؟"

  • Throttling میگه: "چند بار در دقیقه/روز میتونی این کار رو انجام بدی؟"

دقیقاً مثل پرمیشن ‌ها، Throttling هم قبل از اینکه درخواست به ویو (View) برسه چک میشه. اگر کاربر بیشتر از حد مجاز درخواست فرستاده باشه، جنگو رست بی‌ رحمانه درخواست رو رد میکنه و کد 429 Too Many Requests رو برمیگردونه. معمولاً هم توی هدر پاسخ میگه که "چقدر باید صبر کنی تا دوباره بتونی درخواست بدی".

شما میتونید این محدودیت‌ ها رو به دو صورت اعمال کنید: ۱. Global (سراسری): توی settings.py بگی هر کاربر (چه مهمان، چه عضو) کلاً روزی ۱۰۰ تا درخواست بیشتر نتونه بفرسته. ۲. Per View (برای هر ویو): بگی صفحه اصلی آزاده، ولی دکمه "ارسال پیامک تایید" فقط دقیقه ای ۱ بار کار کنه (برای جلوگیری از هزینه اضافی).

انواع کنترل‌کننده‌های آماده (Built-in Throttles)

جنگو رست فریمورک چند کلاس آماده داره که ۹۰٪ نیاز های ما رو پوشش میدن:

۱. AnonRateThrottle (مخصوص غریبه‌ها)

این کلاس برای کاربرانی هست که لاگین نکردن (Unauthenticated).

  • چطور میشناسه؟ بر اساس IP کاربر.

  • کاربرد: فرض کن یک API عمومی داری که قیمت دلار رو میده. نمیخوای یک نفر با یک ربات بیاد و کل پهنای باند سرورت رو اشغال کنه. میگی هر IP ناشناس، فقط ۱۰ بار در دقیقه اجازه داره درخواست بده.

۲. UserRateThrottle (مخصوص خودی‌ها)

این کلاس برای کاربرانی هست که لاگین کردن.

  • چطور میشناسه؟ بر اساس User ID (و اگر لاگین نکرده باشه بر اساس IP).

  • کاربرد: توی یک شبکه اجتماعی، شاید بخوای بگی هر کاربر فقط میتونه روزی ۵۰ تا پست جدید بذاره تا دیتابیس منفجر نشه.

۳. ScopedRateThrottle (مخصوص نقاط حساس)

این یکی خیلی کاربردیه! فرض کن کل سایتت محدودیت ۱۰۰۰ درخواست در روز داره، اما بخش "فراموشی رمز عبور" یا "آپلود فایل" خیلی حساسه و میخوای محدودیت شدیدتری داشته باشه. با استفاده از scope میتونی برای ویو های خاص، قوانین خاص بذاری.

نمونه تنظیمات در settings.py:

REST_FRAMEWORK = {
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',  # غریبه ها: ۱۰۰ تا در روز
        'user': '1000/day', # خودی ها: ۱۰۰۰ تا در روز
        'uploads': '5/min', # آپلود فایل: ۵ تا در دقیقه
    }
}

چرا باید از Throttling استفاده کنیم؟

شاید بگی "سایت من که هنوز شلوغ نیست، ولش کن!" اما اشتباه نکن:

۱. جلوگیری از حملات (Security): حملات Brute Force (حدس زدن پسورد) با Throttling عملاً غیرممکن میشن چون بعد از ۵ بار تلاش غلط، کاربر بلاک میشه. ۲. پایداری سرور (Stability): اگر کدی بنویسی که سنگینه، و ۱۰ نفر همزمان اون رو صد بار صدا بزنن، سرور میخوابه. Throttling مثل سوپاپ اطمینان عمل میکنه. ۳. مدل درآمدی (Monetization): خیلی از APIها (مثل API هواشناسی یا نقشه) پولشون رو از همین راه در میارن. "میخوای بیشتر درخواست بدی؟ پول بده!"

جمع‌بندی

همیشه یادت باشه، منابع سرور (CPU، RAM، پهنای باند) محدود و گرون هستن. Throttling در جنگو رست فریمورک به تو کمک میکنه تا این منابع رو عادلانه بین کاربرها تقسیم کنی. با این ابزار، تو دیگه نگران نیستی که "بابک" یا یک ربات مخرب کل سایتت رو پایین بیاره. تو الان پلیسی رو استخدام کردی که با کورنومتر دم در وایساده و نظم رو برقرار میکنه.