Лимиты скорости — сводная таблица
Единый обзор rate budget’ов всех поставщиков с учётом множественных credentials.
Централизация
Все rate limits конфигурируются в configs/connectors/<n>.yaml и применяются через platform/rate-limiter (Redis token bucket). Бакеты — per credential, не per supplier.
См.:
Шаблон ключа бакета
ratelimit:{supplier_id}:{credential_id}:{endpoint}
Например: ratelimit:etm:cred-uuid-123:goods_read.
ETM
Лимиты на одну credential (учётная запись на стороне ETM):
| Endpoint | Лимит per credential | Бакет |
|---|---|---|
/user/login | 1 req / 2 min | etm:{cred_id}:login |
/goods/{id} | 1 req / sec | etm:{cred_id}:goods_read |
/goods/{id}/price | 1 req / sec | etm:{cred_id}:price_read |
/goods/{id}/remains | 1 req / sec | etm:{cred_id}:stock_read |
/goods/remains?store=X | ≤ 1 / 10 sec рекомендовано | etm:{cred_id}:stock_batch |
/job/* | polling, формального лимита нет | etm:{cred_id}:async_poll |
/info/* | формального лимита нет | etm:{cred_id}:info |
При наличии 1 system + N customer credentials суммарный rate = (1+N) × лимит одной учётки.
Стратегии маршрутизации (важно)
Rate limit per credential — лишь один уровень. Над ним работает routing-стратегия, определяющая какая credential обслуживает данный запрос. Стратегии (фиксируются в configs/connectors/<supplier_id>.yaml):
| Тип запроса | Стратегия | Применимые credentials | Эффект на rate budget |
|---|---|---|---|
Catalog discovery (/goods/{id}, характеристики) | round_robin | все active credentials с features ⊇ catalog | параллельное ускорение × N (где N = число credentials в пуле) |
| Pricing (per customer) | customer_first → system fallback | own credential → group-shared → system | per-credential лимит, без множителя |
| Stock (per customer) | customer_first → system fallback | own credential → group-shared → system | per-credential лимит, без множителя |
| System B2C pricing/stock | system | system credential | per-credential лимит |
| SgGds / async catalog dump | round_robin по shared_for_catalog | system + customer credentials с shared_for_catalog=true | параллельное ускорение |
Дедупликация одинаковых credentials через SupplierCredentialGroup (см. 10-business/contexts/credentials.md) — одна physical-учётка опрашивается один раз; observations доступны всем members группы. На уровне rate limiter группа = один bucket.
Эффективный rate budget для catalog discovery при N системных + M customer-shared credentials:
effective_catalog_rate = (N + M) × per_credential_rate × dedup_factor
где dedup_factor учитывает группировку (= 1, если все credentials с разными fingerprint).
Конкретно для ETM с 1 system + 20 customer-shared: ~21× ускорение полного обхода каталога (~7 часов вместо ~6 суток при single-credential).
Детали: ../30-services/ingestion/connectors/etm/rate-budget.md.
Горячая перезагрузка конфига
Изменения rate limits и routing-стратегий применяются без рестарта:
- Рейт-конфиги хранятся в
configs/connectors/<supplier_id>.yaml, монтируются в pod. - Платформа watch’ит файл (через
fsnotify) + поллит из admin UI override’ы в БД (таблицаconnector_config_override) каждые 30 с. - При изменении — atomic swap бакетов; токены, накопленные в Redis, не сбрасываются (новые лимиты применяются к следующим acquire).
- Аудит изменений — событие
ConnectorConfigChangedвevent_store.
При нештатном падении watch’а — алерт connector_config_reload_failed_total > 0.
(TBD при подключении).
Общие правила
- Захват токенов — блокирующий (с max_wait 60s, после — timeout).
- При 429 / 403 rate-ошибке на конкретной credential — экспоненциальный backoff (base 2s, max 5min) только для этой credential.
- При 5 подряд rate-ошибках на credential — circuit breaker open на 10 min для этой credential, остальные продолжают работать.
- При open breaker — fallback: показать stale данные с пометкой, алерт.
- При 5 подряд auth-ошибках на credential → пометить
failing, уведомить владельца (клиента или админа).