Duy trì tính khả dụng của hệ thống là một trong những nhiệm vụ quan trọng nhất đối với bất kỳ sản phẩm nào. Thật không may, mọi người có thể lạm dụng nó bằng cách lấn át tài nguyên của bạn hoặc bạn muốn giới hạn việc sử dụng và tính phí cho nó. Giới hạn tỷ lệ là một giải pháp tiêu chuẩn cho nhiều vấn đề trong số này và nên giải quyết vấn đề này. Sau tất cả, bạn đã xây dựng hệ thống của mình và không muốn mất thêm thời gian để thiết kế một hệ thống giới hạn tốc độ hoạt động tốt trong môi trường không trạng thái, chẳng hạn như các chức năng không máy chủ.
Thông báo @ upash / ratelimit
Có sẵn trên GitHub, npm hoặc Deno
Hôm nay, chúng tôi sẽ phát hành @upstash/ratelimit
, một giải pháp để giới hạn tốc độ trong môi trường không có máy chủ, chẳng hạn như Vercel, Cloudflare, Deno, Fastly và Netlify. Nó được xây dựng dựa trên Upstash Serverless Redis và cung cấp các giải pháp giới hạn tốc độ bằng cách sử dụng một hoặc nhiều cơ sở dữ liệu để mang lại trải nghiệm độ trễ thấp cho người dùng của bạn trên toàn thế giới!
Bắt đầu
@upstash/ratelimit
triển khai ba thuật toán tiêu chuẩn hóa khác nhau cho đến nay và bạn có thể đọc thêm về chúng trong README của dự án.
Chúng tôi cung cấp hai phương pháp:
-
limit(identifier: string): Promise<RatelimitResponse>
limit
sẽ trả về true
hoặc false
và một số siêu dữ liệu về các yêu cầu còn lại và có thể được sử dụng nếu bạn muốn từ chối tất cả các yêu cầu vượt quá giới hạn đã đặt của mình.
-
blockUntilReady(identifier: string, timeout: number): Promise<RatelimitResponse>
Trong trường hợp bạn không muốn từ chối một yêu cầu ngay lập tức mà hãy đợi cho đến khi nó có thể được xử lý. Hãy lưu ý rằng một số nền tảng sẽ tính phí thời gian thực thi chức năng của bạn.
Cơ sở dữ liệu một vùng
Ratelimiting với một cơ sở dữ liệu duy nhất được thực hiện ngay. Bạn tạo một cơ sở dữ liệu trên Upstash và bắt đầu sử dụng nó:
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!";
Giới hạn tốc độ sao chép toàn cầu
Giả sử bạn có khách hàng ở Mỹ và Châu Âu. Trong trường hợp này, bạn có thể tạo hai cơ sở dữ liệu redis khu vực trên Upstash và người dùng của bạn sẽ tận hưởng độ trễ của bất kỳ db nào gần nhất với họ.
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"),
});
Các từ đóng lại
Nếu bạn có bất kỳ câu hỏi nào, vui lòng liên hệ với chúng tôi trên GitHub hoặc các kênh bên dưới.
Theo dõi chúng tôi trên Twitter Discordand.