Лимиты скорости — сводная таблица

Единый обзор rate budget’ов всех поставщиков с учётом множественных credentials.

Централизация

Все rate limits конфигурируются в configs/connectors/<n>.yaml и применяются через platform/rate-limiter (Redis token bucket). Бакеты — per credential, не per supplier.

См.:

  • ADR-0008 — централизованный rate limiter.
  • ADR-0009 — multi-tenant credentials.

Шаблон ключа бакета

ratelimit:{supplier_id}:{credential_id}:{endpoint}

Например: ratelimit:etm:cred-uuid-123:goods_read.

ETM

Лимиты на одну credential (учётная запись на стороне ETM):

EndpointЛимит per credentialБакет
/user/login1 req / 2 minetm:{cred_id}:login
/goods/{id}1 req / secetm:{cred_id}:goods_read
/goods/{id}/price1 req / secetm:{cred_id}:price_read
/goods/{id}/remains1 req / secetm:{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 с featurescatalogпараллельное ускорение × N (где N = число credentials в пуле)
Pricing (per customer)customer_firstsystem fallbackown credential → group-shared → systemper-credential лимит, без множителя
Stock (per customer)customer_firstsystem fallbackown credential → group-shared → systemper-credential лимит, без множителя
System B2C pricing/stocksystemsystem credentialper-credential лимит
SgGds / async catalog dumpround_robin по shared_for_catalogsystem + 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, уведомить владельца (клиента или админа).