محدودیت نرخ درخواست
نحوه کار و مدیریت آحصار کردن درخواستها
مستندات
نحوه کار
- محدودیتها برای هر کاربر و هر مدل جداگانه اعمال میشوند
- الگوریتم Sliding Window استفاده میشود
- پنجره زمانی پیشفرض: 1 دقیقه (قابل تنظیم)
- نقض مکرر محدودیتها منجر به مسدود شدن موقت/دائمی میشود
هدرهای پاسخ
| هدر | توضیح |
|---|---|
| X-RateLimit-Limit | حداکثر درخواست در پنجره |
| X-RateLimit-Remaining | درخواستهای باقیمانده |
| X-RateLimit-Window-Seconds | مدت زمان پنجره (ثانیه) |
| Retry-After | ثانیههایی برای صبر (فقط 429) |
پاسخ محدودیت (429)
{ "error": { "message": "محدودیت نرخ درخواست تجاوز شده. 100 درخواست برای 60 ثانیه مجاز است.", "type": "rate_limit_error", "code": "rate_limited" }}استراتژی Retry
import timeimport random def call_with_exponential_backoff(func, max_retries=5): for attempt in range(max_retries): try: response = func() if response.status_code == 429: retry_after = int(response.headers.get("Retry-After", 60)) print(f"صبر {retry_after} ثانیه...") time.sleep(retry_after) continue response.raise_for_status() return response except Exception as e: if attempt == max_retries - 1: raise # Exponential backoff با تصادف wait_time = (2 ** attempt) + random.uniform(0, 1) print(f"تلاش {attempt + 1} ناموفق. دوباره تلاش در {wait_time:.1f}ث...") time.sleep(wait_time)پیش از نوشتن حلقهٔ تلاش مجدد، کلید یکتاسازی را هم بخوانید: بدون آن، هر تلاش مجدد میتواند یک پردازش و یک هزینهٔ تازه باشد.
کلید یکتاسازی (Idempotency)
یکتاسازی حالا صفحهٔ خودش را دارد. هدر Idempotency-Key، پاسخ ذخیرهشده، هدر Idempotent-Replayed، خطای 409 و طرز ترکیب همهٔ اینها با Retry-After آنجاست.