Ліміти запитів
Бюджети на принципала за групами ендпоїнтів — і як 429 просить пригальмувати.
Ліміти застосовуються після автентифікації, з ключем за перевіреною ідентичністю — атакувальник із поганим токеном не витрачає нічого, а принципали ніколи не конкурують між собою. Вичерпаний бюджет відповідає 429 RATE_LIMITED із заголовком Retry-After, що тримає секунди до наступного слота.
Бюджети
| Група | Стосується | За замовчуванням | Ключ |
|---|---|---|---|
| resolve | POST /internal/v1/credentials/resolve |
100 r/s, burst 200 | сервісний client_id |
| user read | усі GET користувацької площини (каталог, credentials, статус) | 120/min | sub токена |
| user mutations | POST/PATCH/DELETE користувацької площини на credentials | 30/min | sub токена |
| admin | /v1/admin/* та /internal/v1/admin/* |
60/min | sub, плюс мітка X-Admin-Actor на сервісній площині |
| reveal | POST .../credentials/{id}/reveal |
10/min | sub + мітка оператора |
| health | /health/* |
без ліміту | — |
Числа — це конфігурація деплойменту (ліміт 0 вимикає свою групу); значення вище — за замовчуванням, і їх наведено для кожного ендпоїнта в довіднику ReDoc.
Три деталі, які варто знати:
- Персональні credentials і credentials організації ділять один бюджет. Ключ — ваш
sub, тож мутації на/v1/credentialsі/v1/org-credentialsтягнуть з одних 30/min. - Оператори адмін-панелі не тротлять одне одного. На внутрішній адмін-площині ключ включає мітку
X-Admin-Actor, тож кожен названий оператор отримує власні 60/min. - Reveal навмисно дефіцитний. Десять reveal на хвилину на оператора — це людина, що інспектує ключі, а не скрипт, що обходить сховище; в цьому й суть (Reveal).
Обробка 429
import time
import httpx
def call_with_backoff(request):
while True:
response = request()
if response.status_code != 429:
return response
time.sleep(int(response.headers.get("Retry-After", "1")))
Бюджети — на репліку, і поповнюються вони неперервно; одного дотриманого Retry-After зазвичай досить.