نتایج گوگل

محدودیت نرخ

سطل توکن در سرویس نتایج گوگل، سه هدر X-RateLimit، رفتار در ۴۲۹ و اینکه چرا باید Retry-After را رعایت کنید نه محاسبهٔ دوباره.

محدودیت نرخ در این سرویس بر اساس هر کلید API است، به شکل سطل توکن، و فقط روی اندپوینت‌های /api/v1/operator اعمال می‌شود.

اگر از مسیرهای قدیمی /api/* استفاده می‌کنید، محدودیت نرخ اعمال نمی‌شود. مهاجرت کنید، ولی تا آن موقع ندانید هدرهای X-RateLimit را می‌گیرید یا نه. جزئیات در مسیرهای قدیمی.

سطل توکن یعنی چه

سطل توکن یعنی هر کلید، ظرفیت انباشتی دارد که به مرور پر می‌شود و با هر درخواست خالی می‌شود.

ویژگیرفتار
واحد حسابهر کلید API، جدا از بقیه
سقفهمان چیزی است که X-RateLimit-Limit می‌گوید
مصرفهر درخواست یک توکن
شارژپیوسته، تا سقف

سقف‌های دقیق را از GET /capabilities بگیرید — عدد ثابتی در این مستندات نیست.

هدرها

روی پاسخ‌های API منابع:

هدریعنی چه
X-RateLimit-Limitسقف سطل، یعنی اندازهٔ جهش (burst)
X-RateLimit-Remainingتوکن باقی‌مانده در سطل همین کلید
X-RateLimit-Resetثانیهٔ epochی که سطل دوباره پر می‌شود

وقتی از بودجه رد شدید

HTTP/1.1 429
Retry-After: 12
X-RateLimit-Remaining: 0

{"detail": "rate limit exceeded"}

Retry-After را رعایت کنید

Retry-After ثانیه است و هرگز 0 نمی‌شود. آن را رعایت کنید، نه اینکه از هدرها دوباره حساب کنید.

چرا محاسبهٔ دوباره کار نمی‌کند: چون این سطل توکن است، نه پنجرهٔ ثابت. اگر از روی هدرها زمان را دوباره حساب کنید، ممکن است درست روی مرز پنجره کل اعتبارتان را در چند درخواست پشت‌سرهم خرج کنید و بعد به 429 بخورید — دقیقاً همان چیزی که سطل برای جلوگیری از آن ساخته شده. Retry-After را بخوانید و صبر کنید.

پیاده‌سازی پیشنهادی

import time

def request_with_backoff(session, method, url, **kw):
    resp = session.request(method, url, **kw)

    if resp.status_code == 429:
        wait = int(resp.headers["Retry-After"])   # ثانیه، هرگز صفر نیست
        time.sleep(wait)
        return session.request(method, url, **kw)

    return resp
تصمیمچرا
صبر بر اساس Retry-Afterتنها عددی که سرویس دربارهٔ سطل اعلام می‌کند
بیشینهٔ تلاش را ۲ یا ۳ نگه داریدیک 429 طولانی یعنی الگوی مصرف شما غلط است، نه اینکه صبر بیشتر جواب دهد
نرخ درخواست را کم کنیدتلاش مجدد فوری فقط زودتر به 429 بعدی می‌رسید
429 را retry کنیدبرخلاف 401 و 403، با زمان حل می‌شود
درخواست‌های بدون کلید معتبر قبل از اینکه از سطل کم شود رد می‌شوند. یعنی یک کلید بد هرگز 429 نمی‌گیرد. اگر 429 می‌بینید، کلیدتان معتبر است و واقعاً از بودجه رد شده‌اید.

پیش‌بینی به‌جای واکنش

هدرها کمک می‌کنند پیش از رسیدن به 429 کمی سرعت را کم کنید:

خواندن هدرمعنی
Remaining نزدیک صفرسطل رو به خالی‌شدن است
Remaining صفر شددرخواست بعدی 429 می‌گیرد
Reset خیلی دور استبودجهٔ شما برای این بازه کم است
برای پردازش پس‌زمینه، GET /usage را ببینید، نه فقط هدرها. شمارنده‌های دوره به شما می‌گویند کار پس‌زمینه‌تان در مقیاس چه اندازه است؛ در مصرف توضیح داده شده.
سقف به معنی اجازهٔ درخواست هم‌زمان نیست. اگر چند کار پس‌زمینهٔ خودتان هم‌زمان با یک کلید درخواست بفرستند، همه از یک سطل برداشت می‌کنند. محدودیت را روی هر کلید حساب کنید، نه روی هر ترد.
Retry-After به ثانیه است، هرگز 0