Přeskočit na hlavní obsah

Limity sazeb

Chastify rozšíření pro omezení rychlosti provozu API pro ochranu relací zámků, úložiště, zařízení a systémů oznámení.

Limity rychlosti se vztahují jak na provoz mostu iframe směrovaný přes Chastify, tak na volání backendu uskutečněná pomocí klíčů vývojářského API.

Aktuální rozpětí rozšíření

KbelíkLimitTypické koncové body
Čtení300/minsession.get, state.get, metadata.get, čtení souborů, stav regulární akce
Zápis120/minZápisy stavu backendu, aktualizace metadat, konfigurace s běžnými akcemi, vytvoření spuštění ověřeného serverem
Nahrát10/minNahrávání běhových a instalačních souborů
Akce30/minAkce uzamčení, příkazy zařízení, vlastní protokoly, vlastní oznámení, vypořádání výsledků ověřených serverem
Token30/minSpuštění relace iframe/generování tokenu pro autorizaci

Limity se vyhodnocují během jedné minuty.

note

Toto jsou výchozí nastavení platformy. Administrátoři/vlastníci webů Chastify mohou konfigurovat přepsání pro jednotlivá rozšíření pro oficiální nebo neobvykle velkoobjemová rozšíření. Přepsání se ukládají do konfigurace aplikace rozšíření a krátce se ukládají do mezipaměti v Redisu pro rychlé vyhledávání cesty k požadavkům.

info

Kontejnery pro nahrávání a akce jsou záměrně omezenější než kontejnery pro čtení/stav. Nahrávání spotřebovává úložiště a šířku pásma. Akce mohou ovlivnit stav zámku, zařízení, oznámení a historii viditelnou pro uživatele.

Jak se počítají klíče

Klíče pro omezení rychlosti zahrnují:

  • ověřené ID uživatele Chastify, když uživatelské rozhraní první strany volá koncový bod
  • ID klíče vývojářského API, když váš backend volá koncové body relace rozšíření
  • IP adresa pro anonymní nebo neověřené cesty
  • cíl sessionId nebo lockId, pokud je k dispozici

To znamená, že jedna hlučná rozšiřující relace by neměla spotřebovat celý globální rozpočet rozšiřujícího API.

Váš iframe nebo backend by měl považovat 429 Too Many Requests za normální podmínku pro opakovaný pokus.

Pro opakované selhání použijte exponenciální odklad:

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");
}

Pokyny k mostu iframe

Pro klienty mostu iframe:

  • Ukládejte výsledky session.get do mezipaměti po celou dobu životnosti stránky, pokud nepotřebujete nová data o zámku.
  • Ukládejte přechodné změny uživatelského rozhraní lokálně a odesílejte důvěryhodné změny do backendu.
  • Vyhněte se rychlým smyčkám dotazování. Upřednostňujte čtení spouštěné uživatelem nebo pomalé intervaly aktualizace.

Příklad uložení z backendu s debounced recordingem:

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);
}

Pokyny k rozšíření backendu

Pro volání backendu s klíčem vývojářského API:

  • Udržujte privilegované akce ověřené serverem a spouštěné uživatelem.
  • Používejte PUT/PATCH /api/extensions/sessions/:sessionId/state pouze z backendu s přihlašovacími údaji vývojářského API.
  • Neopakujte akce uzamčení naslepo, pokud první pokus mohl být úspěšný.
  • Nastavte idempotentní vypořádání hry/výzvy s ID běhu.
  • Nahrát soubory pouze tehdy, když je uživatel explicitně odešle.
  • Pokud potřebujete telemetrii s vyšší frekvencí, ukládejte si vlastní externí záznamy.
warning

Nikdy nezvyšujte limity akcí, abyste kompenzovali neověřená volání prohlížeče. Kód iframe prohlížeče není důvěryhodný. Citlivé mutace by měl váš backend před voláním Chastify ověřit.

Který kbelík mám očekávat?

Běžné příklady:

  • GET /api/extensions/sessions/:sessionId používá čtecí kontejner.
  • GET /api/extensions/sessions/:sessionId/state používá čtecí kontejner.
  • PUT/PATCH /api/extensions/sessions/:sessionId/state používá zápisový kontejner.
  • POST /api/extensions/sessions/:sessionId/files používá odesílací kontejner.
  • POST /api/extensions/sessions/:sessionId/action používá akční bucket.
  • POST /api/extensions/sessions/:sessionId/device-command používá akční bucket.
  • POST /api/extensions/sessions/:sessionId/logs/custom používá akční bucket.
  • POST /api/extensions/sessions/:sessionId/notifications/custom používá akční bucket.
  • GET /api/extensions/sessions/:sessionId/auth používá token bucket.

Budoucí granulované kbelíky

Aktuální kategorie jsou široké. Chastify je může dále rozdělit s tím, jak se vývojářské API rozrůstá, například:

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

Limity pro jednotlivé rozšíření mohou administrátoři/vlastníci webů Chastify zvýšit, pokud má oficiální nebo schválené rozšíření s vysokým objemem provozu legitimní potřebu. Navrhněte klienty tak, aby zpracování 429 bylo generické a nezáviselo na přesných názvech bucketů nebo pevných výchozích nastaveních platformy.