시스템 가용성을 유지하는 것은 모든 제품에서 가장 중요한 작업 중 하나입니다. 불행히도 사람들은 리소스를 압도하여 이를 남용하거나 사용량을 제한하고 비용을 청구할 수 있습니다. 속도 제한은 이러한 많은 문제에 대한 표준 솔루션이며 즉시 사용할 수 있습니다. 결국, 당신은 이미 시스템을 구축했으며 서버리스 기능과 같은 상태 비저장 환경에서 잘 작동하는 속도 제한 시스템을 설계하는 데 더 많은 시간을 소비하고 싶지 않습니다.
@upstash/ratelimit 발표
GitHub, npm 또는 Deno에서 사용 가능
오늘 우리는 @upstash/ratelimit
를 출시합니다. , Vercel, Cloudflare, Deno, Fastly 및 Netlify와 같은 서버리스 환경에서 속도 제한을 위한 솔루션입니다. Upstash Serverless Redis를 기반으로 구축되었으며 하나 이상의 데이터베이스를 사용하는 속도 제한 솔루션을 제공하여 전 세계 사용자에게 짧은 대기 시간 환경을 제공합니다!
시작하기
@upstash/ratelimit
지금까지 세 가지 다른 표준화된 알고리즘을 구현하고 있으며 프로젝트의 README에서 이에 대한 자세한 내용을 읽을 수 있습니다.
두 가지 방법을 제공합니다.
limit(identifier: string): Promise<RatelimitResponse>
limit
true
를 반환합니다. 또는 false
및 나머지 요청에 대한 일부 메타데이터가 있으며 설정된 제한을 초과하는 모든 요청을 거부하려는 경우 사용할 수 있습니다.
blockUntilReady(identifier: string, timeout: number): Promise<RatelimitResponse>
요청을 즉시 거부하고 싶지 않고 처리될 수 있을 때까지 기다리십시오. 일부 플랫폼에서는 함수 실행 시간에 대해 비용을 청구한다는 점에 유의하십시오.
단일 지역 데이터베이스
단일 데이터베이스로 속도를 제한하는 것은 간단합니다. Upstash에 데이터베이스를 만들고 사용을 시작합니다.
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
// Create a new ratelimiter, that allows 10 requests per 10 seconds
const ratelimit = new Ratelimit({
redis: Redis.fromEnv(),
limiter: Ratelimit.slidingWindow(10, "10 s"),
});
// Use a constant string to limit all requests with a single ratelimit
// Or use a userID, apiKey or ip address for individual limits.
const identifier = "api";
const { success } = await ratelimit.limit(identifier);
if (!success) {
return "Unable to process at this time";
}
doExpensiveCalculation();
return "Here you go!";
전역 복제 속도 제한
미국과 유럽에 고객이 있다고 가정해 보겠습니다. 이 경우 Upstash에 두 개의 지역 redis 데이터베이스를 만들 수 있으며 사용자는 가장 가까운 DB의 지연 시간을 즐길 수 있습니다.
import { GlobalRatelimit } from "@upstash/ratelimit"; // for deno: see above
import { Redis } from "@upstash/redis";
// Create a new ratelimiter, that allows 10 requests per 10 seconds
const ratelimit = new GlobalRatelimit({
redis: [
new Redis({
/* europe */
}),
new Redis({
/* north america */
}),
],
limiter: Ratelimit.slidingWindow(10, "10 s"),
});
마무리 단어
질문이 있는 경우 GitHub 또는 아래 채널을 통해 문의해 주세요.
Discord와 Twitter를 팔로우하세요.