함수: rateLimit()
function rateLimit<TFn>(fn, initialOptions): (...args) => boolean;
정의 위치: rate-limiter.ts:423
시간 윈도우 안에서 제공된 함수를 최대 횟수까지 실행하는 요청률 제한 함수를 생성합니다.
이 동기 버전은 더 가벼워 대부분의 경우 충분합니다. 프로미스, 재시도 지원, 중단 기능 또는 고급 오류 처리가 필요하면 asyncRateLimit으로 전환합니다.
요청률 제한은 스로틀링이나 디바운싱보다 단순한 실행 제어 방식입니다.
- 요청률 제한기는 한도에 도달할 때까지 모든 실행을 허용한 뒤 윈도우가 초기화될 때까지 이후 모든 호출을 차단합니다.
- 스로틀러는 실행 간격을 일정하게 유지하므로 일관된 성능에 더 적합할 수 있습니다.
- 디바운서는 여러 호출을 하나로 합치므로 이벤트 버스트 처리에 더 적합합니다.
요청률 제한기는 두 가지 윈도우 유형을 지원합니다.
- 'fixed': 윈도우 기간이 지나면 초기화되는 엄격한 윈도우입니다. 윈도우 안의 모든 실행이 한도에 포함되며 기간이 지나면 윈도우가 완전히 초기화됩니다.
- 'sliding': 이전 실행이 만료됨에 따라 실행을 허용하는 롤링 윈도우입니다. 시간에 걸쳐 더 일정한 실행률을 제공합니다.
상태 관리:
- 반응형 상태 관리에 TanStack Store를 사용합니다.
- 요청률 제한기 생성 시
initialState로 초기 상태 값을 제공합니다. onExecute콜백으로 함수 실행에 반응하고 사용자 지정 로직을 구현합니다.onReject콜백으로 요청률 한도 초과로 실행이 거부될 때 반응합니다.- 상태에는 실행 횟수, 실행 시간, 거부 횟수가 포함됩니다.
- 내부 RateLimiter 인스턴스의
store.state속성으로 상태에 접근할 수 있습니다. - 프레임워크 어댑터(React/Solid)를 사용할 때는 훅의 state 속성에서 상태에 접근합니다.
더 지능적인 실행 제어가 필요하다면 throttle() 또는 debounce() 사용을 고려합니다. 특정 시간 동안 실행 횟수에 하드 제한을 적용해야 할 때 요청률 제한을 사용합니다.
타입 매개변수
TFn
TFn extends AnyFunction
매개변수
fn
TFn
initialOptions
RateLimiterOptions<TFn>
반환값
(...args): boolean;
설정된 한도 안이면 요청률 제한 함수 실행을 시도합니다. 현재 윈도우의 호출 수가 한도를 초과하면 실행을 거부합니다.
매개변수
args
...Parameters<TFn>
반환값
boolean
예시
const rateLimiter = new RateLimiter(fn, { limit: 5, window: 1000 });
// First 5 calls will return true
rateLimiter.maybeExecute('arg1', 'arg2'); // true
// Additional calls within the window will return false
rateLimiter.maybeExecute('arg1', 'arg2'); // false
예시
// Rate limit to 5 calls per minute with a sliding window
const rateLimited = rateLimit(makeApiCall, {
limit: 5,
window: 60000,
windowType: 'sliding',
onReject: (rateLimiter) => {
console.log(`Rate limit exceeded. Try again in ${rateLimiter.getMsUntilNextWindow()}ms`);
}
});
// First 5 calls will execute immediately
// Additional calls will be rejected until the minute window resets
rateLimited();
// For more even execution, consider using throttle instead:
const throttled = throttle(makeApiCall, { wait: 12000 }); // One call every 12 seconds