본문으로 건너뛰기

속도 제한

Chastify는 잠금 세션, 스토리지, 장치 및 알림 시스템을 보호하기 위해 확장 API 트래픽에 대한 속도 제한을 설정합니다.

속도 제한은 Chastify를 통해 라우팅되는 iframe 브리지 트래픽과 개발자 API 키를 사용하여 수행되는 백엔드 호출 모두에 적용됩니다.

현재 확장 버킷

버킷제한일반적인 엔드포인트
읽기300/minsession.get, state.get, metadata.get, 파일 읽기, 일반 작업 상태
쓰기120/min백엔드 상태 쓰기, 메타데이터 업데이트, 정기 작업 구성, 서버 검증 실행 생성
업로드10/min런타임 및 설치 파일 업로드
작업30/min잠금 작업, 장치 명령, 사용자 지정 로그, 사용자 지정 알림, 서버 검증 결과 정산
토큰30/miniframe 세션 시작/인증 토큰 생성

제한치는 1분 동안 평가됩니다.

노트

이는 플랫폼 기본 설정입니다. Chastify 관리자/사이트 소유자는 공식 확장 프로그램이나 사용량이 많은 확장 프로그램에 대해 확장 프로그램별 재정의 설정을 구성할 수 있습니다. 재정의 설정은 확장 프로그램 앱 구성에 저장되며, 빠른 요청 경로 조회를 위해 Redis에 잠시 캐시됩니다.

정보

업로드 및 작업 버킷은 읽기/상태 버킷보다 의도적으로 더 엄격하게 관리됩니다. 업로드는 저장 공간과 대역폭을 소모합니다. 작업은 잠금 상태, 기기, 알림 및 사용자에게 표시되는 기록에 영향을 미칠 수 있습니다.

열쇠 개수 세는 방법

속도 제한 키에는 다음이 포함됩니다.

  • 자사 UI가 엔드포인트를 호출할 때 인증된 Chastify 사용자 ID
  • 백엔드에서 확장 프로그램 세션 엔드포인트를 호출할 때 사용되는 개발자 API 키 ID
  • 익명 또는 인증되지 않은 경로에 대한 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 브리지 클라이언트의 경우:

  • 새로운 잠금 데이터가 필요하지 않은 경우 페이지 수명 동안 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를 사용하여 멱등성(idempotential)을 갖도록 만드세요.
  • 사용자가 명시적으로 파일을 제출하는 경우에만 파일을 업로드하십시오.
  • 더 높은 빈도의 원격 측정 데이터가 필요한 경우, 자체적으로 외부 저장소에 데이터를 저장하십시오.
경고

검증되지 않은 브라우저 호출을 보완하기 위해 액션 제한을 절대 높이지 마십시오. 브라우저 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 처리가 일반적인 방식으로 이루어지도록 하고, 특정 버킷 이름이나 고정된 플랫폼 기본값에 의존하지 않도록 하십시오.