Перейти к основному содержимому

Ограничения скорости

Chastify ограничивает скорость трафика API расширения для защиты сеансов блокировки, хранилища, устройств и систем уведомлений.

Ограничения скорости применяются как к трафику iframe-моста, маршрутизируемому через Chastify, так и к вызовам бэкэнда, выполняемым с использованием ключей API разработчика.

Текущие расширения

КорзинаЛимитТипичные конечные точки
Чтение300/minsession.get, state.get, metadata.get, чтение файлов, статус обычного действия
Запись120/minЗапись состояния бэкэнда, обновление метаданных, конфигурация регулярных действий, создание запуска, проверенного сервером
Загрузка10/minЗагрузка файлов среды выполнения и настроек
Действие30/minДействия блокировки, команды устройства, пользовательские журналы, пользовательские уведомления, подтверждение результатов сервером
Токен30/minГенерация токена для запуска сессии в iframe/авторизации

Пределы оцениваются в течение одной минуты.

примечание

Это настройки платформы по умолчанию. Администраторы/владельцы сайтов могут настраивать переопределения для каждого расширения отдельно, например, для официальных или расширений с необычно большим объемом запросов. Переопределения хранятся в конфигурации приложения расширения и кратковременно кэшируются в Redis для быстрого поиска пути запроса.

к сведению

Разделы для загрузки и действий намеренно более узкие, чем разделы для чтения/состояния. Загрузка потребляет место на диске и пропускную способность. Действия могут влиять на состояние блокировки, устройства, уведомления и историю, видимую пользователю.

Как подсчитываются ключи

К ключам ограничения скорости относятся:

  • Идентификатор аутентифицированного пользователя Chastify, когда пользовательский интерфейс первого уровня вызывает конечную точку.
  • Идентификатор ключа API разработчика, который используется при вызове бэкэндом конечных точек сессии расширения.
  • IP-адрес для анонимных или неаутентифицированных путей
  • целевой код sessionId или lockId (если доступен).

Это означает, что одна «шумная» сессия расширения не должна израсходовать весь глобальный бюджет API расширений.

Ваш iframe или бэкэнд должны рассматривать 429 Too Many Requests как обычную ситуацию, требующую повторной попытки.

Используйте экспоненциальную задержку при повторяющихся сбоях:

async function callWithBackoff<T>(fn: () => Promise<T>, attempts = 4): Promise<T> {
let delayMs = 500;

for (let attempt = 1; attempt <= attempts; attempt += 1) {
try {
return await fn();
} catch (error: any) {
const status = error?.status ?? error?.response?.status;
if (status !== 429 || attempt === attempts) throw error;

await new Promise((resolve) => setTimeout(resolve, delayMs));
delayMs *= 2;
}
}

throw new Error("request_failed");
}

Руководство по использованию моста Iframe

Для клиентов iframe bridge:

  • Результаты session.get будут кэшироваться на протяжении всего времени существования страницы, если вам не требуются новые данные блокировки.
  • Временные изменения пользовательского интерфейса сохраняйте локально, а проверенные изменения отправляйте на бэкэнд.
  • Избегайте быстрых циклов опроса. Отдавайте предпочтение чтению по запросу пользователя или медленным интервалам обновления.

Пример сохранения с задержкой на стороне сервера:

let saveTimer: number | undefined;

function scheduleStateSave(data: Record<string, unknown>) {
window.clearTimeout(saveTimer);
saveTimer = window.setTimeout(() => {
fetch("/your-extension-backend/state", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(data),
}).catch(console.error);
}, 500);
}

Руководство по расширениям бэкэнда

Для вызовов бэкэнда с использованием ключа API разработчика:

  • Необходимо, чтобы привилегированные действия проверялись сервером и запускались пользователем.
  • Используйте PUT/PATCH /api/extensions/sessions/:sessionId/state только из вашей административной панели, используя учетные данные Developer API.
  • Не следует вслепую повторять действия по блокировке, если первая попытка могла быть успешной.
  • Сделайте процесс создания поселения в игре/испытании идемпотентным, используя идентификатор запуска.
  • Загружайте файлы только тогда, когда пользователь явно отправляет файл.
  • Если вам необходима телеметрия с более высокой частотой, храните собственные внешние записи.
warning

Никогда не увеличивайте лимиты действий для компенсации непроверенных вызовов браузера. Код iframe браузера не заслуживает доверия. Конфиденциальные мутации должны быть проверены вашим бэкэндом перед вызовом Chastify.

Какого ведра мне следует ожидать?

Типичные примеры:

  • GET /api/extensions/sessions/:sessionId использует сегмент для чтения.
  • GET /api/extensions/sessions/:sessionId/state использует сегмент для чтения.
  • PUT/PATCH /api/extensions/sessions/:sessionId/state использует сегмент для записи.
  • POST /api/extensions/sessions/:sessionId/files использует контейнер для загрузки.
  • POST /api/extensions/sessions/:sessionId/action использует контейнер действий.
  • POST /api/extensions/sessions/:sessionId/device-command использует контейнер действий.
  • POST /api/extensions/sessions/:sessionId/logs/custom использует контейнер действий.
  • POST /api/extensions/sessions/:sessionId/notifications/custom использует контейнер действий.
  • GET /api/extensions/sessions/:sessionId/auth использует токен-корзину.

Вёдра для гранулированного сырья будущего

Текущие категории достаточно широкие. Chastify может дополнительно разделить их по мере развития API для разработчиков, например:

  • state.write
  • metadata.write
  • lock.action
  • notifications.custom
  • device.command
  • files.upload

Администраторы/владельцы сайтов, имеющие права доступа к Chastify, могут увеличивать лимиты для каждого расширения, если официальное или утвержденное расширение с большим объемом трафика имеет законную необходимость в этом. Разрабатывайте клиенты таким образом, чтобы обработка 429 была универсальной и не зависела от точных имен сегментов или фиксированных настроек платформы по умолчанию.