클래스: AsyncRateLimiter<TFn>
정의 위치: async-rate-limiter.ts:245
비동기 요청률 제한 함수를 생성하는 클래스입니다.
비동기 버전과 동기 버전: 비동기 버전은 동기 RateLimiter보다 다음과 같은 고급 기능을 제공합니다.
- 요청률이 제한된 함수의 결과를 기다릴 수 있도록 프로미스를 반환합니다
- AsyncRetryer 통합을 통해 재시도를 기본으로 지원합니다
- 진행 중인 실행을 취소할 수 있는 중단 기능을 지원합니다
- onError 콜백과 throwOnError 제어 기능으로 포괄적인 오류 처리를 제공합니다
- 실행을 상세히 추적합니다(성공/오류/완료 횟수, 거부 횟수)
- 자동 정리 기능을 갖춘 더욱 정교한 윈도우 관리를 제공합니다
비동기 기능, 반환값 또는 실행 제어가 필요하지 않다면 동기 RateLimiter가 더 가볍고 간단합니다.
요청률 제한이란? 요청률 제한을 사용하면 시간 윈도우 안에서 한도까지 함수를 실행할 수 있으며, 이후에는 윈도우가 지날 때까지 모든 호출을 차단합니다. 이로 인해 모든 실행이 즉시 일어난 뒤 완전히 차단되는 "버스트성" 동작이 발생할 수 있습니다.
윈도우 유형:
- 'fixed': 윈도우 기간이 지나면 재설정되는 엄격한 윈도우입니다. 윈도우 안의 모든 실행이 한도에 포함되며, 기간이 지나면 윈도우가 완전히 재설정됩니다.
- 'sliding': 이전 실행이 만료됨에 따라 새 실행을 허용하는 이동식 윈도우입니다. 시간의 흐름에 따라 더 일정한 실행률을 제공합니다.
요청률 제한을 사용해야 하는 경우: 요청률 제한은 엄격한 API 한도나 리소스 제약에 사용하는 것이 가장 적합합니다. UI 업데이트나 빈번한 이벤트를 완화하는 용도라면 일반적으로 스로틀이나 디바운스가 더 나은 사용자 경험을 제공합니다.
- 스로틀: 실행 사이에 일정한 간격을 보장합니다(예: 200ms당 최대 한 번)
- 디바운스: 호출이 잠시 멈출 때까지 기다린 후 실행합니다(예: 500ms 동안 호출이 없을 때)
상태 관리:
- 반응형 상태 관리에 TanStack Store를 사용합니다
- 요청률 제한기를 생성할 때
initialState를 사용하여 초기 상태 값을 제공합니다 initialState에는 상태 객체의 일부를 지정할 수 있습니다onSuccess콜백을 사용하여 함수 실행 성공에 반응하고 사용자 정의 로직을 구현합니다onError콜백을 사용하여 함수 실행 오류에 반응하고 사용자 정의 오류 처리를 구현합니다onSettled콜백을 사용하여 함수 실행 완료(성공 또는 오류)에 반응하고 사용자 정의 로직을 구현합니다- 요청률 한도를 초과하여 실행이 거부될 때
onReject콜백을 사용하여 반응합니다 - 상태에는 실행 시각, 성공/오류 횟수, 현재 실행 상태가 포함됩니다
- 클래스를 직접 사용할 때는
asyncRateLimiter.store.state를 통해 상태에 접근할 수 있습니다 - 프레임워크 어댑터(React/Solid)를 사용할 때는
asyncRateLimiter.state에서 상태에 접근합니다
오류 처리:
onError핸들러를 제공하면 오류 및 요청률 제한기 인스턴스와 함께 호출됩니다throwOnError가 true이면(onError 핸들러를 제공하지 않았을 때의 기본값) 오류를 던집니다throwOnError가 false이면(onError 핸들러를 제공했을 때의 기본값) 오류를 무시합니다- onError와 throwOnError를 함께 사용할 수 있으며, 오류를 던지기 전에 핸들러를 호출합니다
- 기반 AsyncRateLimiter 인스턴스를 사용하여 오류 상태를 확인할 수 있습니다
- 요청률 한도 초과에 따른 거부는
onReject핸들러를 통해 실행 오류와 별도로 처리됩니다
예시
const rateLimiter = new AsyncRateLimiter(
async (id: string) => await api.getData(id),
{
limit: 5,
window: 1000,
windowType: 'sliding',
onError: (error) => {
console.error('API call failed:', error);
},
onReject: (limiter) => {
console.log(`Rate limit exceeded. Try again in ${limiter.getMsUntilNextWindow()}ms`);
}
}
);
// Will execute immediately until limit reached, then block
// Returns the API response directly
const data = await rateLimiter.maybeExecute('123');
타입 매개변수
TFn
TFn extends AnyAsyncFunction
생성자
생성자
new AsyncRateLimiter<TFn>(fn, initialOptions): AsyncRateLimiter<TFn>;
정의 위치: async-rate-limiter.ts:254
매개변수
fn
TFn
initialOptions
AsyncRateLimiterOptions<TFn>
반환값
AsyncRateLimiter<TFn>
속성
asyncRetryers
asyncRetryers: Map<number, AsyncRetryer<TFn>>;
정의 위치: async-rate-limiter.ts:251
fn
fn: TFn;
정의 위치: async-rate-limiter.ts:255
key
key: string | undefined;
정의 위치: async-rate-limiter.ts:249
options
options: AsyncRateLimiterOptions<TFn>;
정의 위치: async-rate-limiter.ts:250
store
readonly store: Store<Readonly<AsyncRateLimiterState<TFn>>>;
정의 위치: async-rate-limiter.ts:246
메서드
abort()
abort(): void;
정의 위치: async-rate-limiter.ts:540
내부 중단 컨트롤러로 진행 중인 모든 실행을 중단합니다. 실행 시각을 지우거나 요청률 제한기를 재설정하지는 않습니다.
반환값
void
getAbortSignal()
getAbortSignal(maybeExecuteCount?): AbortSignal | null;
정의 위치: async-rate-limiter.ts:530
특정 실행의 AbortSignal을 반환합니다. maybeExecuteCount를 제공하지 않으면 가장 최근 실행의 시그널을 반환합니다. 실행을 찾을 수 없거나 현재 실행 중이 아니면 null을 반환합니다.
매개변수
maybeExecuteCount?
number
시그널을 가져올 특정 실행을 선택적으로 지정합니다
반환값
AbortSignal | null
예시
const rateLimiter = new AsyncRateLimiter(
async (userId: string) => {
const signal = rateLimiter.getAbortSignal()
if (signal) {
const response = await fetch(`/api/users/${userId}`, { signal })
return response.json()
}
},
{ limit: 5, window: 1000 }
)
getMsUntilNextWindow()
getMsUntilNextWindow(): number;
정의 위치: async-rate-limiter.ts:502
다음 실행이 가능해질 때까지 남은 밀리초 수를 반환합니다 고정 윈도우에서는 현재 윈도우가 재설정될 때까지의 시간입니다 슬라이딩 윈도우에서는 가장 오래된 실행이 만료될 때까지의 시간입니다
반환값
number
getRemainingInWindow()
getRemainingInWindow(): number;
정의 위치: async-rate-limiter.ts:492
현재 윈도우에서 허용되는 남은 실행 횟수를 반환합니다
반환값
number
maybeExecute()
maybeExecute(...args): Promise<Awaited<ReturnType<TFn>> | undefined>;
정의 위치: async-rate-limiter.ts:358
구성된 한도 안에 있으면 요청률이 제한된 함수의 실행을 시도합니다. 현재 윈도우의 호출 횟수가 한도를 초과하면 실행을 거부합니다.
오류 처리:
- 요청률이 제한된 함수가 오류를 던지고
onError핸들러가 구성되지 않았다면 이 메서드에서 해당 오류를 던집니다. onError핸들러가 구성되어 있다면 오류를 포착하여 핸들러에 전달하고 이 메서드는 undefined를 반환합니다.getErrorCount()와getIsExecuting()을 사용하여 오류 상태를 확인할 수 있습니다.
매개변수
args
...Parameters<TFn>
반환값
Promise<Awaited<ReturnType<TFn>> | undefined>
함수의 반환값으로 이행되는 프로미스입니다. 오류가 발생하여 onError에서 처리된 경우에는 undefined로 이행됩니다
발생 오류
onError 핸들러가 구성되지 않은 경우 요청률이 제한된 함수에서 발생한 오류
예시
const rateLimiter = new AsyncRateLimiter(fn, { limit: 5, window: 1000 });
// First 5 calls will return a promise that resolves with the result
const result = await rateLimiter.maybeExecute('arg1', 'arg2');
// Additional calls within the window will return undefined
const result2 = await rateLimiter.maybeExecute('arg1', 'arg2'); // undefined
reset()
reset(): void;
정의 위치: async-rate-limiter.ts:551
요청률 제한기의 상태를 재설정합니다
반환값
void
setOptions()
setOptions(newOptions): void;
정의 위치: async-rate-limiter.ts:285
비동기 요청률 제한기 옵션을 업데이트합니다
매개변수
newOptions
Partial<AsyncRateLimiterOptions<TFn>>
반환값
void