Лимиты запросов
Бюджеты на принципала по группам эндпоинтов, и как 429 просит вас притормозить.
Лимиты применяются после аутентификации, с ключом по проверенной identity — атакующий с плохим токеном не расходует ничего, а принципалы никогда не конкурируют друг с другом. Превышение бюджета отвечает 429 RATE_LIMITED с заголовком Retry-After, несущим секунды до следующего слота.
Бюджеты
| Группа | Применяется к | По умолчанию | Ключ |
|---|---|---|---|
| resolve | POST /internal/v1/credentials/resolve |
100 r/s, burst 200 | сервисный client_id |
| чтение пользователя | все GET пользовательской плоскости (каталог, credentials, статус) | 120/мин | sub токена |
| мутации пользователя | POST/PATCH/DELETE пользовательской плоскости на credentials | 30/мин | sub токена |
| админ | /v1/admin/* и /internal/v1/admin/* |
60/мин | sub, плюс метка X-Admin-Actor на сервисной плоскости |
| reveal | POST .../credentials/{id}/reveal |
10/мин | sub + метка оператора |
| health | /health/* |
без лимита | — |
Числа — конфигурация развёртывания (лимит 0 отключает свою группу); значения выше — значения по умолчанию, и они приводятся для каждого эндпоинта в справочнике ReDoc.
Три детали, которые стоит знать:
- Личные и организационные credentials делят один бюджет. Ключ — ваш
sub, поэтому мутации на/v1/credentialsи/v1/org-credentialsчерпают из одних и тех же 30/мин. - Операторы админ-панели не троттлят друг друга. На внутренней админ-плоскости ключ включает метку
X-Admin-Actor, так что каждый названный оператор получает собственные 60/мин. - 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 обычно достаточно.