이 기사에서는 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_URL
및 UPSTASH_REDIS_REST_TOKEN
.
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 자격 증명을 유지하고 읽으십시오.