レート制限
Chastifyは、ロックセッション、ストレージ、デバイス、および通知システムを保護するために、拡張APIトラフィックのレート制限を行います。
レート制限は、Chastifyを経由してルーティングされるiframeブリッジトラフィックと、開発者APIキーを使用して行われるバックエンド呼び出しの両方に適用されます。
現在の拡張バケット
| バケット | 制限 | 一般的なエンドポイント |
|---|---|---|
| 読み取り | 300/min | session.get、state.get、metadata.get、ファイル読み取り、通常アクションステータス |
| 書き込み | 120/min | バックエンド状態の書き込み、メタデータの更新、定期アクションの設定、サーバー検証済み実行の作成 |
| アップロード | 10/min | ランタイムおよびセットアップファイルのアップロード |
| アクション | 30/min | ロックアクション、デバイスコマンド、カスタムログ、カスタム通知、サーバー検証済み結果決済 |
| トークン | 30/min | Iframe セッション起動/認証トークン生成 |
制限値は1分間の時間枠内で評価されます。
これらはプラットフォームのデフォルト設定です。Chastify の管理者/サイト所有者は、公式拡張機能または特にアクセス数の多い拡張機能に対して、拡張機能ごとのオーバーライドを設定できます。オーバーライドは拡張機能アプリの設定ファイルに保存され、リクエストパスの高速検索のために Redis に一時的にキャッシュされます。
アップロードとアクションのバケットは、読み取り/状態バケットよりも意図的に制限が厳しくなっています。アップロードはストレージと帯域幅を消費します。アクションは、ロック状態、デバイス、通知、およびユーザーに表示される履歴に影響を与える可能性があります。
鍵の数え方
レート制限キーには以下が含まれます。
- ファーストパーティUIがエンドポイントを呼び出す際に、認証されたユーザーID Chastify
- バックエンドが拡張機能セッションエンドポイントを呼び出す際に使用する開発者APIキーID
- 匿名または認証されていないパスのIPアドレス
- ターゲット
sessionIdまたはlockId(利用可能な場合)
これは、1つのノイズの多い拡張セッションが、グローバルな拡張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ブリッジクライアントの場合:
- 最新のロックデータが必要な場合を除き、
session.getの結果をページの有効期間中キャッシュします。 - 一時的なUI変更はローカルに保存し、信頼できる変更をバックエンドに送信します。
- 高速なポーリングループは避けてください。ユーザーによる読み取りトリガー、または低速な更新間隔を推奨します。
デバウンス処理されたバックエンドの保存例:
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は、開発者API認証情報を使用して、バックエンドからのみ使用してください。- 最初の試みが成功した可能性がある場合は、ロック操作をむやみに再試行しないでください。
- ゲーム/チャレンジの決済を、実行IDを使用して冪等にする。
- ユーザーが明示的にファイルを送信した場合にのみ、ファイルをアップロードします。
- より高頻度のテレメトリが必要な場合は、独自の外部記録を保存してください。
検証されていないブラウザ呼び出しを補うために、アクション制限を引き上げないでください。ブラウザの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はトークンバケットを使用します。
将来の粒状バケット
現在の分類は広範です。開発者APIの拡大に伴い、Chastifyは分類をさらに細分化する可能性があります。例えば、次のようになります。
state.writemetadata.writelock.actionnotifications.customdevice.commandfiles.upload
拡張機能ごとの制限は、公式または承認済みの高ボリューム拡張機能に正当な必要性がある場合、管理者/サイト所有者によって増やすことができます。クライアントの設計は、処理が汎用的であり、正確なバケット名や固定のプラットフォームデフォルトに依存しないようにします。