Trong bài viết này, chúng tôi sẽ chỉ ra cách xếp hạng giới hạn các tuyến API Next.js của bạn bằng cách sử dụng SDK giới hạn tỷ lệ nâng cấp
Thiết lập cơ sở dữ liệu
Tạo cơ sở dữ liệu Redis bằng Upstash Console hoặc Upstash CLI. Sao chép UPSTASH_REDIS_REST_URL
và UPSTASH_REDIS_REST_TOKEN
cho các bước tiếp theo.
Thiết lập dự án
Chúng tôi sẽ tạo một ứng dụng Next.js và triển khai cho Vercel.
npx create-next-app@latest
Cài đặt @ Upash / ratelimit:
npm install @upstash/ratelimit @upstash/redis
Mã
Cập nhật pages/api/hello.js
của bạn như bên dưới và thay thế UPSTASH_REDIS_REST_URL
và 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})
}
Ở đây, chúng tôi cho phép 5 yêu cầu mỗi 5 giây.
Chạy
Chạy ứng dụng với npm run dev
. Làm mới trình duyệt hơn 5 lần và bạn sẽ thấy giới hạn tốc độ đang hoạt động.
{"message":"The request has been rate limited.","rateLimitState":{"success":false,"limit":5,"remaining":-1,"reset":1654546770000,"pending":{}}}
Các tính năng nâng cao có thể có
- Sử dụng id hoặc địa chỉ IP của người dùng của bạn làm số nhận dạng để giới hạn mức sử dụng cho mỗi người dùng.
const identifier = getClientIp(req);
const result = await ratelimit.limit(identifier);
- Sử dụng Thuật toán cửa sổ trượt để có trải nghiệm giới hạn tốc độ mượt mà hơn (nhưng đắt hơn).
const ratelimit = new Ratelimit({
redis: redis,
limiter: Ratelimit.slidingWindow(10, "10 s"),
});
- Sử dụng Thuật toán nhóm mã thông báo để chấp nhận một số mức tăng đột biến.
const ratelimit = new Ratelimit({
redis: redis,
limiter: Ratelimit.tokenBucket(5, "10 s", 10),
});
-
Sử dụng nhiều Redis ở các vùng khác nhau nếu ứng dụng Next.js của bạn được triển khai đến các vùng khác nhau. Điều này sẽ giúp bạn giảm thiểu độ trễ cho các vị trí khác nhau.
-
Giữ và đọc thông tin đăng nhập Upstash Redis của bạn từ các biến môi trường hoặc kho lưu trữ bí mật.