Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Redis

Giới hạn tỷ lệ Serverless: Bảo vệ và tối ưu hóa tài nguyên trong môi trường không trạng thái

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 cho 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àm quá tải tài nguyên của bạn, hoặc bạn muốn giới hạn việc sử dụng và thu phí cho nó. Giới hạn tỷ lệ (rate limiting) là giải pháp tiêu chuẩn cho nhiều vấn đề này và nên hoạt động ngay lập tức.畢竟, bạn đã xây dựng hệ thống của mình và không muốn dành thêm thời gian thiết kế một hệ thống rate-limiting hoạt động tốt trong môi trường không trạng thái như serverless functions.

Thông báo @upstash/ratelimit

Có sẵn trên GitHub, npm hoặc Deno

Hôm nay chúng tôi phát hành @upstash/ratelimit, một giải pháp cho rate-limiting trong môi trường serverless, như Vercel, Cloudflare, Deno, Fastly và Netlify. Nó được xây dựng dựa trên Upstash Serverless Redis và cung cấp giải pháp rate-limiting 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 trên toàn thế giới!

Bắt đầu

@upstash/ratelimit triển khai ba thuật toán tiêu chuẩn 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 thức:

  • limit(identifier: string): Promise<RatelimitResponse>

limit sẽ trả về true hoặc false và một số metadata về các request còn lại và có thể dùng nếu bạn muốn từ chối tất cả request vượt quá giới hạn đặt ra.

  • blockUntilReady(identifier: string, timeout: number): Promise<RatelimitResponse>

Trong trường hợp bạn không muốn từ chối request ngay lập tức mà đợi cho đến khi nó có thể được xử lý. Hãy nhớ rằng một số nền tảng tính phí cho thời gian thực thi hàm của bạn.

Cơ sở dữ liệu khu vực đơn lẻ

Rate limiting với một cơ sở dữ liệu đơn lẻ rất đơn giản. Bạn tạo một cơ sở dữ liệu trên Upstash và bắt đầu sử dụng:

import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";
// Tạo rate limiter mới, cho phép 10 request mỗi 10 giây
const ratelimit = new Ratelimit({
    redis: Redis.fromEnv(),
    limiter: Ratelimit.slidingWindow(10, "10 s"),
});
// Dùng chuỗi hằng để giới hạn tất cả request với một rate limit
// Hoặc dùng userID, apiKey hoặc địa chỉ IP cho giới hạn riêng biệt.
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ỷ lệ 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 họ nhất.

import { GlobalRatelimit } from "@upstash/ratelimit";
// for deno: see above
import { Redis } from "@upstash/redis";
// Tạo rate limiter mới, cho phép 10 request mỗi 10 giây
const ratelimit = new GlobalRatelimit({
    redis: [
        new Redis({
            /* europe */
        }),
        new Redis({
            /* north america */
        }),
    ],
    limiter: Ratelimit.slidingWindow(10, "10 s"),
});

Kết luận

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 dưới đây.

Theo dõi chúng tôi trên Discord và Twitter.