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ík | Limit | Typické koncové body |
|---|---|---|
| Čtení | 300/min | session.get, state.get, metadata.get, čtení souborů, stav regulární akce |
| Zápis | 120/min | Zápisy stavu backendu, aktualizace metadat, konfigurace s běžnými akcemi, vytvoření spuštění ověřeného serverem |
| Nahrát | 10/min | Nahrávání běhových a instalačních souborů |
| Akce | 30/min | Akce uzamčení, příkazy zařízení, vlastní protokoly, vlastní oznámení, vypořádání výsledků ověřených serverem |
| Token | 30/min | Spuštění relace iframe/generování tokenu pro autorizaci |
Limity se vyhodnocují během jedné minuty.
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.
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
sessionIdnebolockId, 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.
Doporučené chování klienta
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.getdo 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/statepouze 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.
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/:sessionIdpoužívá čtecí kontejner.GET /api/extensions/sessions/:sessionId/statepoužívá čtecí kontejner.PUT/PATCH /api/extensions/sessions/:sessionId/statepoužívá zápisový kontejner.POST /api/extensions/sessions/:sessionId/filespoužívá odesílací kontejner.POST /api/extensions/sessions/:sessionId/actionpoužívá akční bucket.POST /api/extensions/sessions/:sessionId/device-commandpoužívá akční bucket.POST /api/extensions/sessions/:sessionId/logs/custompoužívá akční bucket.POST /api/extensions/sessions/:sessionId/notifications/custompoužívá akční bucket.GET /api/extensions/sessions/:sessionId/authpouží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.writemetadata.writelock.actionnotifications.customdevice.commandfiles.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.