Запрос по подписке V3: последовательность

Запрос по подписке V3: последовательность A sequence diagram generated by Archify. запрос к нексусу токен (gRPC) клиент, лицензия Check(request_id, client_code, token_uuid, nexus_id) ALLOW; Gateway решает по двум ответам [alt] NOT_AVAILABLE / BLOCKED / RATE_LIMITED отказ до выбора подписки REST: нексус «Сервис подписок» Acquire(request_id, token_uuid, nexus_id, model, session_key) привязка «сессия + вендор» в Redis SMS пригодна: без ранжирования; иначе ранг, выбор, привязка → {sub_id, access_token, lease_id} [alt] no_subscription_in_scope / _supports_model / all_cooling / sms_unavailable 503 по типу; all_cooling = 429, retry-after — оценка запрос вендору: AT в {{AUTH_TOKEN}}, значения подписки в заголовки ответ / поток стрим клиенту (через Gateway) Report(lease_id, ok, заголовки лимитов, usage) message_log: расход + sub_id [alt] 401 до отправки тела Report(lease_id, 401_before_send) событие RMQ: подписка «ждёт refresh» новый Acquire, тот же request_id, один раз другая подписка пула запрос с другой подпиской refresh на token endpoint новый AT: RMQ → Gateway → CMS → SMS [alt] 429/503 от token endpoint повтор позже, «нужно переподключение» не ставится [alt] неизвестный исход / refresh_token_reused / invalid_grant нужно переподключение: подписка выходит из пула [alt] 429 Too Many Requests до первого байта: окно не исчерпано штатные повторы: до 3, с паузой, в ту же подписку (привязка и кэш сохраняются) [alt] повторы не помогли: снова 429 Report(lease_id, 429_scoped{rate}) один переход в другую подписку пула, без перепривязки запрос с другой подпиской [alt] 429 окна или кредитов до первого байта: лимит исчерпан Report(lease_id, 429_scoped{window | credits}) → cooldown переезд: ранг, новая привязка «сессия + вендор» (credits — «Исчерпан кредит») запрос с новой подпиской [alt] 5xx / connect_timeout до первого байта Report(lease_id, 5xx | connect_timeout) другая подписка пула, один раз; привязка не меняется; Bypass — вне MVP [opt] обрыв потока после первого байта Report(stream_broken_after_first_byte): без повтора клиенту — обрыв; резерв в hold, апстрим дренируется [opt] 403 gate клиента / edge Report(client_gate_403): состояние и привязка не меняются, алерт Штатный допуск alt: отказ допуска Выбор подписки (липкая сессия) alt: нет кандидата Исполнение Завершение и учёт alt: 401 до отправки тела alt: refresh не удался alt: 429 по частоте (привязка не меняется) alt: исчерпан лимит → переезд alt: 5xx или connect_timeout (привязка не меняется) opt: обрыв после первого байта opt: 403 шлюза клиента вендора Клиент · API-токен · Sequence participant Клиент API-токен API Gateway · nginx, TLS · Sequence participant API Gateway nginx, TLS Auth · gRPC · Sequence participant Auth gRPC LMS · Check · Sequence participant LMS Check Proxy · тип авторизации · Sequence participant Proxy тип авторизации SMS · новое · Sequence participant SMS новое Провайдер · вендор · Sequence participant Провайдер вендор Ainima · OAuth, RT · Sequence participant Ainima OAuth, RT Биллинг · RabbitMQ · Sequence participant Биллинг RabbitMQ Legend основной вызов ответ вызов SMS и refresh альтернатива и события

Порядок решений

  • • Gateway опрашивает Auth и LMS, решает по двум ответам; отказ допуска приходит до выбора подписки
  • • Proxy вызывает SMS по gRPC (Acquire/Report); SMS недоступна — fail-closed 503
  • • Расход провайдера идёт в биллинг с sub_id
  • • Липкая сессия: ключ = token_uuid (HTTP) или client_code (из SimpleOne по RMQ); SMS сначала берёт привязку «ключ + вендор → подписка» из Redis SMS, ранжирует только при первой привязке и переезде

Повторы

  • • Штатные повторы Proxy остаются только для 429 Too Many Requests: до 3 раз с паузой в ту же подписку; Bypass — вне MVP
  • • 401 до тела: SMS помечает «ждёт refresh», Proxy делает новый Acquire и берёт другую подписку пула, один раз
  • • 429 по частоте не прошёл после повторов, 5xx, connect_timeout до первого байта: один переход в другую подписку пула без перепривязки; 429 окна или кредитов — cooldown и переезд с перепривязкой
  • • Обрыв после первого байта: без повтора, резерв в hold
  • • Привязка меняется только при исчерпании лимита (429 окна или кредитов), 401 с ожиданием refresh, смене пула; 5xx, таймаут, короткий 429 и 403 шлюза клиента привязку не меняют

Refresh в Ainima

  • • Ainima единственный владелец refresh token; новый AT уходит в SMS цепочкой RabbitMQ → Gateway → CMS → SMS, задержка needs-verification
  • • 429/503 от token endpoint: повтор позже, без «нужно переподключение»
  • • Неизвестный исход, refresh_token_reused, invalid_grant после перечитывания: «нужно переподключение»
  • • 403 шлюза клиента вендора: состояние не меняется