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

Upstash Redis를 사용한 Next.js API 경로 속도 제한

이 기사에서는 Upstash 속도 제한 SDK를 사용하여 Next.js API 경로를 속도 제한하는 방법을 보여줍니다.

데이터베이스 설정

Upstash 콘솔 또는 Upstash CLI를 사용하여 Redis 데이터베이스를 생성합니다. UPSTASH_REDIS_REST_URL 복사 및 UPSTASH_REDIS_REST_TOKEN 다음 단계를 위해.

프로젝트 설정

Next.js 애플리케이션을 만들고 Vercel에 배포합니다.

npx create-next-app@latest

@upstash/ratelimit 설치:

npm install @upstash/ratelimit @upstash/redis

코드

pages/api/hello.js 업데이트 아래와 같이 변경하고 UPSTASH_REDIS_REST_URLUPSTASH_REDIS_REST_TOKEN .

pages/api/hello.js
import {Ratelimit} from "@upstash/ratelimit";
import {Redis} from "@upstash/redis";


const redis = new Redis({
  url: 'UPSTASH_REDIS_REST_URL',
  token: 'UPSTASH_REDIS_REST_TOKEN',
})

// Create a new ratelimiter, that allows 5 requests per 5 seconds
const ratelimit = new Ratelimit({
  redis: redis,
  limiter: Ratelimit.fixedWindow(5, "5 s"),
});

export default async function handler(req, res) {
// 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 result = await ratelimit.limit(identifier);
  res.setHeader('X-RateLimit-Limit', result.limit)
  res.setHeader('X-RateLimit-Remaining', result.remaining)

  if (!result.success) {
    res.status(200).json({message: 'The request has been rate limited.', rateLimitState: result})
    return
  }

  res.status(200).json({name: 'John Doe', rateLimitState: result})
}

여기서는 5초당 5개의 요청을 허용합니다.

실행

npm run dev로 앱 실행 . 브라우저를 5번 이상 새로고침하면 속도 제한이 작동하는 것을 볼 수 있습니다.

{"message":"The request has been rate limited.","rateLimitState":{"success":false,"limit":5,"remaining":-1,"reset":1654546770000,"pending":{}}}

가능한 개선 사항

  • 사용자 ID 또는 IP 주소를 식별자로 사용하여 사용자당 사용량을 제한합니다.
   const identifier = getClientIp(req);
   const result = await ratelimit.limit(identifier);
  • Sliding Window Algorithm을 사용하여 보다 원활하지만 비용이 많이 드는 속도 제한 경험을 제공합니다.
 const ratelimit = new Ratelimit({
  redis: redis,
  limiter: Ratelimit.slidingWindow(10, "10 s"),
});
  • 토큰 버킷 알고리즘을 사용하여 스파이크를 어느 정도 허용합니다.
 const ratelimit = new Ratelimit({
  redis: redis,
  limiter: Ratelimit.tokenBucket(5, "10 s", 10),
});
  • Next.js 애플리케이션이 다른 지역에 배포된 경우 다른 지역에서 여러 Redis를 사용합니다. 이렇게 하면 여러 위치의 지연 시간을 최소화하는 데 도움이 됩니다.

  • 환경 변수 또는 비밀 저장소에서 Upstash Redis 자격 증명을 유지하고 읽으십시오.