Computer >> 컴퓨터 >  >> 프로그램 작성 >> Redis

서버리스 속도 제한

시스템 가용성을 유지하는 것은 모든 제품에서 가장 중요한 작업 중 하나입니다. 불행히도 사람들은 리소스를 압도하여 이를 남용하거나 사용량을 제한하고 비용을 청구할 수 있습니다. 속도 제한은 이러한 많은 문제에 대한 표준 솔루션이며 즉시 사용할 수 있습니다. 결국, 당신은 이미 시스템을 구축했으며 서버리스 기능과 같은 상태 비저장 환경에서 잘 작동하는 속도 제한 시스템을 설계하는 데 더 많은 시간을 소비하고 싶지 않습니다.

@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를 팔로우하세요.