Computer >> Máy Tính >  >> Lập trình >> Redis

Xếp hạng giới hạn các tuyến API Next.js bằng cách sử dụng Upstash Redis

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_URLUPSTASH_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

Cập nhật pages/api/hello.js của bạn như bên dưới và thay thế 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})
}

Ở đâ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.