속도 제한
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가 엔드포인트를 호출할 때 인증된 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.writemetadata.writelock.actionnotifications.customdevice.commandfiles.upload
Chastify 관리자/사이트 소유자는 공식 또는 승인된 대용량 확장 프로그램에 정당한 필요성이 있는 경우 확장 프로그램별 제한을 늘릴 수 있습니다. 클라이언트를 설계할 때는 429 처리가 일반적인 방식으로 이루어지도록 하고, 특정 버킷 이름이나 고정된 플랫폼 기본값에 의존하지 않도록 하십시오.