Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

การจำกัดอัตราแบบไร้เซิร์ฟเวอร์

การรักษาความพร้อมใช้งานของระบบเป็นหนึ่งในงานที่สำคัญที่สุดสำหรับผลิตภัณฑ์ใดๆ ขออภัย ผู้คนอาจใช้ทรัพยากรของคุณในทางที่ผิด หรือคุณต้องการจำกัดการใช้งานและเรียกเก็บเงิน การจำกัดอัตราเป็นวิธีแก้ปัญหามาตรฐานสำหรับปัญหาเหล่านี้จำนวนมาก และควรทำงานนอกกรอบ ท้ายที่สุด คุณได้สร้างระบบของคุณแล้ว และไม่ต้องการใช้เวลามากขึ้นในการออกแบบระบบจำกัดอัตราซึ่งทำงานได้ดีในสภาพแวดล้อมที่ไม่มีสถานะ เช่น ฟังก์ชันไร้เซิร์ฟเวอร์

กำลังประกาศ @upstash/ratelimit

พร้อมใช้งานบน GitHub, npm หรือ Deno

วันนี้เราจะปล่อย @upstash/ratelimit โซลูชันสำหรับการจำกัดอัตราในสภาพแวดล้อมแบบไร้เซิร์ฟเวอร์ เช่น Vercel, Cloudflare, Deno, Fastly และ Netlify มันถูกสร้างขึ้นบน Upstash Serverless Redis และให้บริการโซลูชั่นการจำกัดอัตราโดยใช้ฐานข้อมูลอย่างน้อยหนึ่งฐานข้อมูลเพื่อมอบประสบการณ์เวลาแฝงที่ต่ำสำหรับผู้ใช้ของคุณทั่วโลก!

เริ่มต้นใช้งาน

@upstash/ratelimit ใช้อัลกอริธึมมาตรฐานที่แตกต่างกันสามแบบจนถึงตอนนี้ และคุณสามารถอ่านเพิ่มเติมเกี่ยวกับอัลกอริธึมเหล่านี้ได้ใน README ของโปรเจ็กต์

เรามีสองวิธี:

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

limit จะคืนค่า true หรือ false และข้อมูลเมตาบางส่วนเกี่ยวกับคำขอที่เหลืออยู่ และสามารถใช้ได้หากคุณต้องการปฏิเสธคำขอทั้งหมดที่เกินขีดจำกัดที่คุณตั้งไว้

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

ในกรณีที่คุณไม่ต้องการปฏิเสธคำขอทันที แต่รอจนกว่าจะสามารถดำเนินการได้ โปรดทราบว่าบางแพลตฟอร์มจะเรียกเก็บเงินจากคุณสำหรับเวลาดำเนินการของฟังก์ชันของคุณ

ฐานข้อมูลระดับภูมิภาคเดียว

การจำกัดอัตราด้วยฐานข้อมูลเดียวนั้นตรงไปตรงมา คุณสร้างฐานข้อมูลบน Upstash และเริ่มใช้งาน:

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!";

การจำกัดอัตราการจำลองแบบทั่วโลก

สมมติว่าคุณมีลูกค้าในสหรัฐอเมริกาและยุโรป ในกรณีนี้ คุณสามารถสร้างฐานข้อมูล Redis ระดับภูมิภาคสองฐานข้อมูลบน Upstash และผู้ใช้ของคุณจะเพลิดเพลินกับเวลาแฝงของฐานข้อมูลที่ใกล้เคียงที่สุด

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"),
});

ปิดคำ

หากคุณมีคำถามใดๆ โปรดติดต่อเราทาง GitHub หรือช่องทางด้านล่าง

ติดตามเราบน Discordand Twitter